/ Hex Artifact Content
Login

Artifact cedce5fdeec172e9392a54805979423cf5720159:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e 64 61 72  f../*.** standar
0b40: 64 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 2e  d include files.
0b50: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .*/.#include <sy
0b60: 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c  s/types.h>.#incl
0b70: 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e  ude <sys/stat.h>
0b80: 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c  .#include <fcntl
0b90: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e  .h>.#include <un
0ba0: 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  istd.h>.#include
0bb0: 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75   <time.h>.#inclu
0bc0: 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a  de <sys/time.h>.
0bd0: 23 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e  #include <errno.
0be0: 68 3e 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  h>.#if !defined(
0bf0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
0c00: 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   || SQLITE_MAX_M
0c10: 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 69 6e 63  MAP_SIZE>0.# inc
0c20: 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e 2e 68  lude <sys/mman.h
0c30: 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  >.#endif..#if SQ
0c40: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
0c50: 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c  ING_STYLE.# incl
0c60: 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68  ude <sys/ioctl.h
0c70: 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73  >.# include <sys
0c80: 2f 66 69 6c 65 2e 68 3e 0a 23 20 69 6e 63 6c 75  /file.h>.# inclu
0c90: 64 65 20 3c 73 79 73 2f 70 61 72 61 6d 2e 68 3e  de <sys/param.h>
0ca0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
0cb0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
0cc0: 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 64  _STYLE */..#if d
0cd0: 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
0ce0: 29 20 26 26 20 28 28 5f 5f 4d 41 43 5f 4f 53 5f  ) && ((__MAC_OS_
0cf0: 58 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45  X_VERSION_MIN_RE
0d00: 51 55 49 52 45 44 20 3e 20 31 30 35 30 29 20 7c  QUIRED > 1050) |
0d10: 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  | \.            
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
0d30: 5f 5f 49 50 48 4f 4e 45 5f 4f 53 5f 56 45 52 53  __IPHONE_OS_VERS
0d40: 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44  ION_MIN_REQUIRED
0d50: 20 3e 20 32 30 30 30 29 29 0a 23 20 20 69 66 20   > 2000)).#  if 
0d60: 28 21 64 65 66 69 6e 65 64 28 54 41 52 47 45 54  (!defined(TARGET
0d70: 5f 4f 53 5f 45 4d 42 45 44 44 45 44 29 20 7c 7c  _OS_EMBEDDED) ||
0d80: 20 28 54 41 52 47 45 54 5f 4f 53 5f 45 4d 42 45   (TARGET_OS_EMBE
0d90: 44 44 45 44 3d 3d 30 29 29 20 5c 0a 20 20 20 20  DDED==0)) \.    
0da0: 20 20 20 26 26 20 28 21 64 65 66 69 6e 65 64 28     && (!defined(
0db0: 54 41 52 47 45 54 5f 49 50 48 4f 4e 45 5f 53 49  TARGET_IPHONE_SI
0dc0: 4d 55 4c 41 54 4f 52 29 20 7c 7c 20 28 54 41 52  MULATOR) || (TAR
0dd0: 47 45 54 5f 49 50 48 4f 4e 45 5f 53 49 4d 55 4c  GET_IPHONE_SIMUL
0de0: 41 54 4f 52 3d 3d 30 29 29 0a 23 20 20 20 20 64  ATOR==0)).#    d
0df0: 65 66 69 6e 65 20 48 41 56 45 5f 47 45 54 48 4f  efine HAVE_GETHO
0e00: 53 54 55 55 49 44 20 31 0a 23 20 20 65 6c 73 65  STUUID 1.#  else
0e10: 0a 23 20 20 20 20 77 61 72 6e 69 6e 67 20 22 67  .#    warning "g
0e20: 65 74 68 6f 73 74 75 75 69 64 28 29 20 69 73 20  ethostuuid() is 
0e30: 64 69 73 61 62 6c 65 64 2e 22 0a 23 20 20 65 6e  disabled.".#  en
0e40: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  dif.#endif...#if
0e50: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 23 20 69 6e   OS_VXWORKS.# in
0e60: 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c  clude <sys/ioctl
0e70: 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73  .h>.# include <s
0e80: 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20 69 6e  emaphore.h>.# in
0e90: 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e  clude <limits.h>
0ea0: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
0eb0: 57 4f 52 4b 53 20 2a 2f 0a 0a 23 69 66 20 64 65  WORKS */..#if de
0ec0: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0ed0: 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   || SQLITE_ENABL
0ee0: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
0ef0: 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d  # include <sys/m
0f00: 6f 75 6e 74 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a  ount.h>.#endif..
0f10: 23 69 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d  #ifdef HAVE_UTIM
0f20: 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 74 69  E.# include <uti
0f30: 6d 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a  me.h>.#endif../*
0f40: 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75  .** Allowed valu
0f50: 65 73 20 6f 66 20 75 6e 69 78 46 69 6c 65 2e 66  es of unixFile.f
0f60: 73 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e  sFlags.*/.#defin
0f70: 65 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53  e SQLITE_FSFLAGS
0f80: 5f 49 53 5f 4d 53 44 4f 53 20 20 20 20 20 30 78  _IS_MSDOS     0x
0f90: 31 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61  1../*.** If we a
0fa0: 72 65 20 74 6f 20 62 65 20 74 68 72 65 61 64 2d  re to be thread-
0fb0: 73 61 66 65 2c 20 69 6e 63 6c 75 64 65 20 74 68  safe, include th
0fc0: 65 20 70 74 68 72 65 61 64 73 20 68 65 61 64 65  e pthreads heade
0fd0: 72 20 61 6e 64 20 64 65 66 69 6e 65 0a 2a 2a 20  r and define.** 
0fe0: 74 68 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  the SQLITE_UNIX_
0ff0: 54 48 52 45 41 44 53 20 6d 61 63 72 6f 2e 0a 2a  THREADS macro..*
1000: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  /.#if SQLITE_THR
1010: 45 41 44 53 41 46 45 0a 23 20 69 6e 63 6c 75 64  EADSAFE.# includ
1020: 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 20  e <pthread.h>.# 
1030: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 55 4e  define SQLITE_UN
1040: 49 58 5f 54 48 52 45 41 44 53 20 31 0a 23 65 6e  IX_THREADS 1.#en
1050: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75  dif../*.** Defau
1060: 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 77  lt permissions w
1070: 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20 6e  hen creating a n
1080: 65 77 20 66 69 6c 65 0a 2a 2f 0a 23 69 66 6e 64  ew file.*/.#ifnd
1090: 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ef SQLITE_DEFAUL
10a0: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
10b0: 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  NS.# define SQLI
10c0: 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
10d0: 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 36 34 34  PERMISSIONS 0644
10e0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
10f0: 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f  efault permissio
1100: 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ns when creating
1110: 20 61 75 74 6f 20 70 72 6f 78 79 20 64 69 72 0a   auto proxy dir.
1120: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1130: 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44  E_DEFAULT_PROXYD
1140: 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 23  IR_PERMISSIONS.#
1150: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44   define SQLITE_D
1160: 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f  EFAULT_PROXYDIR_
1170: 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 37 35 35  PERMISSIONS 0755
1180: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
1190: 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64  aximum supported
11a0: 20 70 61 74 68 2d 6c 65 6e 67 74 68 2e 0a 2a 2f   path-length..*/
11b0: 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f 50 41 54  .#define MAX_PAT
11c0: 48 4e 41 4d 45 20 35 31 32 0a 0a 2f 2a 20 41 6c  HNAME 512../* Al
11d0: 77 61 79 73 20 63 61 73 74 20 74 68 65 20 67 65  ways cast the ge
11e0: 74 70 69 64 28 29 20 72 65 74 75 72 6e 20 74 79  tpid() return ty
11f0: 70 65 20 66 6f 72 20 63 6f 6d 70 61 74 69 62 69  pe for compatibi
1200: 6c 69 74 79 20 77 69 74 68 0a 2a 2a 20 6b 65 72  lity with.** ker
1210: 6e 65 6c 20 6d 6f 64 75 6c 65 73 20 69 6e 20 56  nel modules in V
1220: 78 57 6f 72 6b 73 2e 20 2a 2f 0a 23 64 65 66 69  xWorks. */.#defi
1230: 6e 65 20 6f 73 47 65 74 70 69 64 28 58 29 20 28  ne osGetpid(X) (
1240: 70 69 64 5f 74 29 67 65 74 70 69 64 28 29 0a 0a  pid_t)getpid()..
1250: 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74 20 74  /*.** Only set t
1260: 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 69 66 20  he lastErrno if 
1270: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  the error code i
1280: 73 20 61 20 72 65 61 6c 20 65 72 72 6f 72 20 61  s a real error a
1290: 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e 6f 72  nd not .** a nor
12a0: 6d 61 6c 20 65 78 70 65 63 74 65 64 20 72 65 74  mal expected ret
12b0: 75 72 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c 49  urn code of SQLI
12c0: 54 45 5f 42 55 53 59 20 6f 72 20 53 51 4c 49 54  TE_BUSY or SQLIT
12d0: 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  E_OK.*/.#define 
12e0: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 78 29  IS_LOCK_ERROR(x)
12f0: 20 20 28 28 78 20 21 3d 20 53 51 4c 49 54 45 5f    ((x != SQLITE_
1300: 4f 4b 29 20 26 26 20 28 78 20 21 3d 20 53 51 4c  OK) && (x != SQL
1310: 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f 2a 20 46  ITE_BUSY))../* F
1320: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
1330: 73 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  s */.typedef str
1340: 75 63 74 20 75 6e 69 78 53 68 6d 20 75 6e 69 78  uct unixShm unix
1350: 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Shm;            
1360: 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
1370: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
1380: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1390: 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 75 6e 69   unixShmNode uni
13a0: 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20  xShmNode;       
13b0: 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* Shared memory
13c0: 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 74 79 70   instance */.typ
13d0: 65 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78  edef struct unix
13e0: 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69 78 49 6e  InodeInfo unixIn
13f0: 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a 20 41 6e  odeInfo;   /* An
1400: 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79 70 65 64   i-node */.typed
1410: 65 66 20 73 74 72 75 63 74 20 55 6e 69 78 55 6e  ef struct UnixUn
1420: 75 73 65 64 46 64 20 55 6e 69 78 55 6e 75 73 65  usedFd UnixUnuse
1430: 64 46 64 3b 20 20 20 20 20 2f 2a 20 41 6e 20 75  dFd;     /* An u
1440: 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
1450: 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  iptor */../*.** 
1460: 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66 74 65 72  Sometimes, after
1470: 20 61 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 69   a file handle i
1480: 73 20 63 6c 6f 73 65 64 20 62 79 20 53 51 4c 69  s closed by SQLi
1490: 74 65 2c 20 74 68 65 20 66 69 6c 65 20 64 65 73  te, the file des
14a0: 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61 6e 6e 6f  criptor.** canno
14b0: 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65  t be closed imme
14c0: 64 69 61 74 65 6c 79 2e 20 49 6e 20 74 68 65 73  diately. In thes
14d0: 65 20 63 61 73 65 73 2c 20 69 6e 73 74 61 6e 63  e cases, instanc
14e0: 65 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  es of the follow
14f0: 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ing.** structure
1500: 20 61 72 65 20 75 73 65 64 20 74 6f 20 73 74 6f   are used to sto
1510: 72 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  re the file desc
1520: 72 69 70 74 6f 72 20 77 68 69 6c 65 20 77 61 69  riptor while wai
1530: 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a 20 6f  ting for an.** o
1540: 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 65 69  pportunity to ei
1550: 74 68 65 72 20 63 6c 6f 73 65 20 6f 72 20 72 65  ther close or re
1560: 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63  use it..*/.struc
1570: 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 7b  t UnixUnusedFd {
1580: 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20  .  int fd;      
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15a0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
15b0: 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 69 6e  to close */.  in
15c0: 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20  t flags;        
15d0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
15e0: 20 74 68 69 73 20 66 69 6c 65 20 64 65 73 63 72   this file descr
15f0: 69 70 74 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  iptor was opened
1600: 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69 78 55   with */.  UnixU
1610: 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 20  nusedFd *pNext; 
1620: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 75       /* Next unu
1630: 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  sed file descrip
1640: 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69 6c 65  tor on same file
1650: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.};../*.** Th
1660: 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  e unixFile struc
1670: 74 75 72 65 20 69 73 20 73 75 62 63 6c 61 73 73  ture is subclass
1680: 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65   of sqlite3_file
1690: 20 73 70 65 63 69 66 69 63 20 74 6f 20 74 68 65   specific to the
16a0: 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69 6d 70   unix.** VFS imp
16b0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a 2f  lementations..*/
16c0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
16d0: 75 6e 69 78 46 69 6c 65 20 75 6e 69 78 46 69 6c  unixFile unixFil
16e0: 65 3b 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69  e;.struct unixFi
16f0: 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  le {.  sqlite3_i
1700: 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20  o_methods const 
1710: 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41 6c  *pMethod;  /* Al
1720: 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20 65  ways the first e
1730: 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ntry */.  sqlite
1740: 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20  3_vfs *pVfs;    
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1760: 20 54 68 65 20 56 46 53 20 74 68 61 74 20 63 72   The VFS that cr
1770: 65 61 74 65 64 20 74 68 69 73 20 75 6e 69 78 46  eated this unixF
1780: 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  ile */.  unixIno
1790: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20  deInfo *pInode; 
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17b0: 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63 6b 73  Info about locks
17c0: 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a   on this inode *
17d0: 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20  /.  int h;      
17e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
1800: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
1810: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
1820: 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20  r eFileLock;    
1830: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
1840: 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65 6c 64  ype of lock held
1850: 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f 0a 20   on this fd */. 
1860: 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20   unsigned short 
1870: 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 3b 20 20  int ctrlFlags;  
1880: 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69 6f 72       /* Behavior
1890: 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58 46 49  al bits.  UNIXFI
18a0: 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20  LE_* flags */.  
18b0: 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20  int lastErrno;  
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d0: 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69 78 20      /* The unix 
18e0: 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73 74 20  errno from last 
18f0: 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 76  I/O error */.  v
1900: 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74  oid *lockingCont
1910: 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
1920: 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20 73 74     /* Locking st
1930: 79 6c 65 20 73 70 65 63 69 66 69 63 20 73 74 61  yle specific sta
1940: 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73  te */.  UnixUnus
1950: 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20  edFd *pUnused;  
1960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1970: 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55 6e 69  re-allocated Uni
1980: 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20 20 63  xUnusedFd */.  c
1990: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
19a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19b0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
19c0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  e file */.  unix
19d0: 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20 20 20  Shm *pShm;      
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f0: 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* Shared memory
1a00: 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72 6d 61   segment informa
1a10: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  tion */.  int sz
1a20: 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20  Chunk;          
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a40: 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46   Configured by F
1a50: 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20  CNTL_CHUNK_SIZE 
1a60: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  */.#if SQLITE_MA
1a70: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
1a80: 69 6e 74 20 6e 46 65 74 63 68 4f 75 74 3b 20 20  int nFetchOut;  
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1ab0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65   outstanding xFe
1ac0: 74 63 68 20 72 65 66 73 20 2a 2f 0a 20 20 73 71  tch refs */.  sq
1ad0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70  lite3_int64 mmap
1ae0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
1af0: 20 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65    /* Usable size
1b00: 20 6f 66 20 6d 61 70 70 69 6e 67 20 61 74 20 70   of mapping at p
1b10: 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73  MapRegion */.  s
1b20: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61  qlite3_int64 mma
1b30: 70 53 69 7a 65 41 63 74 75 61 6c 3b 20 20 20 20  pSizeActual;    
1b40: 20 20 20 2f 2a 20 41 63 74 75 61 6c 20 73 69 7a     /* Actual siz
1b50: 65 20 6f 66 20 6d 61 70 70 69 6e 67 20 61 74 20  e of mapping at 
1b60: 70 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20  pMapRegion */.  
1b70: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d  sqlite3_int64 mm
1b80: 61 70 53 69 7a 65 4d 61 78 3b 20 20 20 20 20 20  apSizeMax;      
1b90: 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65      /* Configure
1ba0: 64 20 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a  d FCNTL_MMAP_SIZ
1bb0: 45 20 76 61 6c 75 65 20 2a 2f 0a 20 20 76 6f 69  E value */.  voi
1bc0: 64 20 2a 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20  d *pMapRegion;  
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be0: 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65   /* Memory mappe
1bf0: 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 23 65 6e 64  d region */.#end
1c00: 69 66 0a 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e  if.#ifdef __QNXN
1c10: 54 4f 5f 5f 0a 20 20 69 6e 74 20 73 65 63 74 6f  TO__.  int secto
1c20: 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
1c30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
1c40: 76 69 63 65 20 73 65 63 74 6f 72 20 73 69 7a 65  vice sector size
1c50: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 76 69 63 65   */.  int device
1c60: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 3b  Characteristics;
1c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
1c80: 63 6f 6d 70 75 74 65 64 20 64 65 76 69 63 65 20  computed device 
1c90: 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
1ca0: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  */.#endif.#if SQ
1cb0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1cc0: 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20  ING_STYLE.  int 
1cd0: 6f 70 65 6e 46 6c 61 67 73 3b 20 20 20 20 20 20  openFlags;      
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf0: 2f 2a 20 54 68 65 20 66 6c 61 67 73 20 73 70 65  /* The flags spe
1d00: 63 69 66 69 65 64 20 61 74 20 6f 70 65 6e 28 29  cified at open()
1d10: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   */.#endif.#if S
1d20: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1d30: 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 64 65  KING_STYLE || de
1d40: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1d50: 0a 20 20 75 6e 73 69 67 6e 65 64 20 66 73 46 6c  .  unsigned fsFl
1d60: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
1d70: 20 20 20 20 20 20 20 2f 2a 20 63 61 63 68 65 64         /* cached
1d80: 20 64 65 74 61 69 6c 73 20 66 72 6f 6d 20 73 74   details from st
1d90: 61 74 66 73 28 29 20 2a 2f 0a 23 65 6e 64 69 66  atfs() */.#endif
1da0: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
1db0: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
1dc0: 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20  FileId *pId;    
1dd0: 20 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20        /* Unique 
1de0: 66 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69  file ID */.#endi
1df0: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
1e00: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 6e  DEBUG.  /* The n
1e10: 65 78 74 20 67 72 6f 75 70 20 6f 66 20 76 61 72  ext group of var
1e20: 69 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20  iables are used 
1e30: 74 6f 20 74 72 61 63 6b 20 77 68 65 74 68 65 72  to track whether
1e40: 20 6f 72 20 6e 6f 74 20 74 68 65 0a 20 20 2a 2a   or not the.  **
1e50: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1e60: 6e 74 65 72 20 69 6e 20 62 79 74 65 73 20 32 34  nter in bytes 24
1e70: 2d 32 37 20 6f 66 20 64 61 74 61 62 61 73 65 20  -27 of database 
1e80: 66 69 6c 65 73 20 61 72 65 20 75 70 64 61 74 65  files are update
1e90: 64 0a 20 20 2a 2a 20 77 68 65 6e 65 76 65 72 20  d.  ** whenever 
1ea0: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
1eb0: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
1ec0: 2e 20 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  .  An assertion 
1ed0: 66 61 75 6c 74 20 77 69 6c 6c 0a 20 20 2a 2a 20  fault will.  ** 
1ee0: 6f 63 63 75 72 20 69 66 20 61 20 66 69 6c 65 20  occur if a file 
1ef0: 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 6f  is updated witho
1f00: 75 74 20 61 6c 73 6f 20 75 70 64 61 74 69 6e 67  ut also updating
1f10: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1f20: 0a 20 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20 20  .  ** counter.  
1f30: 54 68 69 73 20 74 65 73 74 20 69 73 20 6d 61 64  This test is mad
1f40: 65 20 74 6f 20 61 76 6f 69 64 20 6e 65 77 20 70  e to avoid new p
1f50: 72 6f 62 6c 65 6d 73 20 73 69 6d 69 6c 61 72 20  roblems similar 
1f60: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6f 6e 65 20  to the.  ** one 
1f70: 64 65 73 63 72 69 62 65 64 20 62 79 20 74 69 63  described by tic
1f80: 6b 65 74 20 23 33 35 38 34 2e 20 0a 20 20 2a 2f  ket #3584. .  */
1f90: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1fa0: 20 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3b 20   transCntrChng; 
1fb0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
1fc0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1fd0: 6e 74 65 72 20 63 68 61 6e 67 65 64 20 2a 2f 0a  nter changed */.
1fe0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1ff0: 64 62 55 70 64 61 74 65 3b 20 20 20 20 20 20 20  dbUpdate;       
2000: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20   /* True if any 
2010: 70 61 72 74 20 6f 66 20 64 61 74 61 62 61 73 65  part of database
2020: 20 66 69 6c 65 20 63 68 61 6e 67 65 64 20 2a 2f   file changed */
2030: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2040: 20 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3b 20   inNormalWrite; 
2050: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 20    /* True if in 
2060: 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 6f  a normal write o
2070: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 23 65 6e  peration */..#en
2080: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
2090: 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 49 6e 20  TE_TEST.  /* In 
20a0: 74 65 73 74 20 6d 6f 64 65 2c 20 69 6e 63 72 65  test mode, incre
20b0: 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ase the size of 
20c0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 61  this structure a
20d0: 20 62 69 74 20 73 6f 20 74 68 61 74 20 0a 20 20   bit so that .  
20e0: 2a 2a 20 69 74 20 69 73 20 6c 61 72 67 65 72 20  ** it is larger 
20f0: 74 68 61 6e 20 74 68 65 20 73 74 72 75 63 74 20  than the struct 
2100: 43 72 61 73 68 46 69 6c 65 20 64 65 66 69 6e 65  CrashFile define
2110: 64 20 69 6e 20 74 65 73 74 36 2e 63 2e 0a 20 20  d in test6.c..  
2120: 2a 2f 0a 20 20 63 68 61 72 20 61 50 61 64 64 69  */.  char aPaddi
2130: 6e 67 5b 33 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d  ng[32];.#endif.}
2140: 3b 0a 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61  ;../* This varia
2150: 62 6c 65 20 68 6f 6c 64 73 20 74 68 65 20 70 72  ble holds the pr
2160: 6f 63 65 73 73 20 69 64 20 28 70 69 64 29 20 66  ocess id (pid) f
2170: 72 6f 6d 20 77 68 65 6e 20 74 68 65 20 78 52 61  rom when the xRa
2180: 6e 64 6f 6d 6e 65 73 73 28 29 0a 2a 2a 20 6d 65  ndomness().** me
2190: 74 68 6f 64 20 77 61 73 20 63 61 6c 6c 65 64 2e  thod was called.
21a0: 20 20 49 66 20 78 4f 70 65 6e 28 29 20 69 73 20    If xOpen() is 
21b0: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 20 64 69  called from a di
21c0: 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 20  fferent process 
21d0: 69 64 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e  id,.** indicatin
21e0: 67 20 74 68 61 74 20 61 20 66 6f 72 6b 28 29 20  g that a fork() 
21f0: 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 74 68  has occurred, th
2200: 65 20 50 52 4e 47 20 77 69 6c 6c 20 62 65 20 72  e PRNG will be r
2210: 65 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eset..*/.static 
2220: 70 69 64 5f 74 20 72 61 6e 64 6f 6d 6e 65 73 73  pid_t randomness
2230: 50 69 64 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  Pid = 0;../*.** 
2240: 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66  Allowed values f
2250: 6f 72 20 74 68 65 20 75 6e 69 78 46 69 6c 65 2e  or the unixFile.
2260: 63 74 72 6c 46 6c 61 67 73 20 62 69 74 6d 61 73  ctrlFlags bitmas
2270: 6b 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  k:.*/.#define UN
2280: 49 58 46 49 4c 45 5f 45 58 43 4c 20 20 20 20 20  IXFILE_EXCL     
2290: 20 20 20 30 78 30 31 20 20 20 20 20 2f 2a 20 43     0x01     /* C
22a0: 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20  onnections from 
22b0: 6f 6e 65 20 70 72 6f 63 65 73 73 20 6f 6e 6c 79  one process only
22c0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58   */.#define UNIX
22d0: 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20 20 20  FILE_RDONLY     
22e0: 20 30 78 30 32 20 20 20 20 20 2f 2a 20 43 6f 6e   0x02     /* Con
22f0: 6e 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 20  nection is read 
2300: 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20  only */.#define 
2310: 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53 54  UNIXFILE_PERSIST
2320: 5f 57 41 4c 20 30 78 30 34 20 20 20 20 20 2f 2a  _WAL 0x04     /*
2330: 20 50 65 72 73 69 73 74 65 6e 74 20 57 41 4c 20   Persistent WAL 
2340: 6d 6f 64 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20  mode */.#ifndef 
2350: 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44  SQLITE_DISABLE_D
2360: 49 52 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20  IRSYNC.# define 
2370: 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43  UNIXFILE_DIRSYNC
2380: 20 20 20 20 30 78 30 38 20 20 20 20 20 2f 2a 20      0x08     /* 
2390: 44 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 6e  Directory sync n
23a0: 65 65 64 65 64 20 2a 2f 0a 23 65 6c 73 65 0a 23  eeded */.#else.#
23b0: 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45   define UNIXFILE
23c0: 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78 30 30  _DIRSYNC    0x00
23d0: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
23e0: 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 20 20 20  UNIXFILE_PSOW   
23f0: 20 20 20 20 20 30 78 31 30 20 20 20 20 20 2f 2a       0x10     /*
2400: 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
2410: 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
2420: 45 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  E */.#define UNI
2430: 58 46 49 4c 45 5f 44 45 4c 45 54 45 20 20 20 20  XFILE_DELETE    
2440: 20 20 30 78 32 30 20 20 20 20 20 2f 2a 20 44 65    0x20     /* De
2450: 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f  lete on close */
2460: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
2470: 45 5f 55 52 49 20 20 20 20 20 20 20 20 20 30 78  E_URI         0x
2480: 34 30 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61  40     /* Filena
2490: 6d 65 20 6d 69 67 68 74 20 68 61 76 65 20 71 75  me might have qu
24a0: 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20 2a  ery parameters *
24b0: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49  /.#define UNIXFI
24c0: 4c 45 5f 4e 4f 4c 4f 43 4b 20 20 20 20 20 20 30  LE_NOLOCK      0
24d0: 78 38 30 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  x80     /* Do no
24e0: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f   file locking */
24f0: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
2500: 45 5f 42 4c 4f 43 4b 20 20 20 20 20 30 78 30 31  E_BLOCK     0x01
2510: 30 30 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 53  00     /* Next S
2520: 48 4d 20 6c 6f 63 6b 20 6d 69 67 68 74 20 62 6c  HM lock might bl
2530: 6f 63 6b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ock */../*.** In
2540: 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74 20  clude code that 
2550: 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  is common to all
2560: 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f   os_*.c files.*/
2570: 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f  .#include "os_co
2580: 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44  mmon.h"../*.** D
2590: 65 66 69 6e 65 20 76 61 72 69 6f 75 73 20 6d 61  efine various ma
25a0: 63 72 6f 73 20 74 68 61 74 20 61 72 65 20 6d 69  cros that are mi
25b0: 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f 6d 65 20  ssing from some 
25c0: 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e  systems..*/.#ifn
25d0: 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a  def O_LARGEFILE.
25e0: 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45  # define O_LARGE
25f0: 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69  FILE 0.#endif.#i
2600: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41  fdef SQLITE_DISA
2610: 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64 65 66 20  BLE_LFS.# undef 
2620: 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65  O_LARGEFILE.# de
2630: 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45  fine O_LARGEFILE
2640: 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65   0.#endif.#ifnde
2650: 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64  f O_NOFOLLOW.# d
2660: 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57  efine O_NOFOLLOW
2670: 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65   0.#endif.#ifnde
2680: 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20 64 65 66  f O_BINARY.# def
2690: 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20 30 0a 23  ine O_BINARY 0.#
26a0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
26b0: 20 74 68 72 65 61 64 69 64 20 6d 61 63 72 6f 20   threadid macro 
26c0: 72 65 73 6f 6c 76 65 73 20 74 6f 20 74 68 65 20  resolves to the 
26d0: 74 68 72 65 61 64 2d 69 64 20 6f 72 20 74 6f 20  thread-id or to 
26e0: 30 2e 20 20 55 73 65 64 20 66 6f 72 0a 2a 2a 20  0.  Used for.** 
26f0: 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  testing and debu
2700: 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23  gging only..*/.#
2710: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
2720: 53 41 46 45 0a 23 64 65 66 69 6e 65 20 74 68 72  SAFE.#define thr
2730: 65 61 64 69 64 20 70 74 68 72 65 61 64 5f 73 65  eadid pthread_se
2740: 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64 65 66 69  lf().#else.#defi
2750: 6e 65 20 74 68 72 65 61 64 69 64 20 30 0a 23 65  ne threadid 0.#e
2760: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48 41 56 45  ndif../*.** HAVE
2770: 5f 4d 52 45 4d 41 50 20 64 65 66 61 75 6c 74 73  _MREMAP defaults
2780: 20 74 6f 20 74 72 75 65 20 6f 6e 20 4c 69 6e 75   to true on Linu
2790: 78 20 61 6e 64 20 66 61 6c 73 65 20 65 76 65 72  x and false ever
27a0: 79 77 68 65 72 65 20 65 6c 73 65 2e 0a 2a 2f 0a  ywhere else..*/.
27b0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 48 41 56  #if !defined(HAV
27c0: 45 5f 4d 52 45 4d 41 50 29 0a 23 20 69 66 20 64  E_MREMAP).# if d
27d0: 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f  efined(__linux__
27e0: 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 47 4e  ) && defined(_GN
27f0: 55 5f 53 4f 55 52 43 45 29 0a 23 20 20 64 65 66  U_SOURCE).#  def
2800: 69 6e 65 20 48 41 56 45 5f 4d 52 45 4d 41 50 20  ine HAVE_MREMAP 
2810: 31 0a 23 20 65 6c 73 65 0a 23 20 20 64 65 66 69  1.# else.#  defi
2820: 6e 65 20 48 41 56 45 5f 4d 52 45 4d 41 50 20 30  ne HAVE_MREMAP 0
2830: 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  .# endif.#endif.
2840: 0a 2f 2a 0a 2a 2a 20 45 78 70 6c 69 63 69 74 6c  ./*.** Explicitl
2850: 79 20 63 61 6c 6c 20 74 68 65 20 36 34 2d 62 69  y call the 64-bi
2860: 74 20 76 65 72 73 69 6f 6e 20 6f 66 20 6c 73 65  t version of lse
2870: 65 6b 28 29 20 6f 6e 20 41 6e 64 72 6f 69 64 2e  ek() on Android.
2880: 20 4f 74 68 65 72 77 69 73 65 2c 20 6c 73 65 65   Otherwise, lsee
2890: 6b 28 29 0a 2a 2a 20 69 73 20 74 68 65 20 33 32  k().** is the 32
28a0: 2d 62 69 74 20 76 65 72 73 69 6f 6e 2c 20 65 76  -bit version, ev
28b0: 65 6e 20 69 66 20 5f 46 49 4c 45 5f 4f 46 46 53  en if _FILE_OFFS
28c0: 45 54 5f 42 49 54 53 3d 36 34 20 69 73 20 64 65  ET_BITS=64 is de
28d0: 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66  fined..*/.#ifdef
28e0: 20 5f 5f 41 4e 44 52 4f 49 44 5f 5f 0a 23 20 64   __ANDROID__.# d
28f0: 65 66 69 6e 65 20 6c 73 65 65 6b 20 6c 73 65 65  efine lseek lsee
2900: 6b 36 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  k64.#endif../*.*
2910: 2a 20 44 69 66 66 65 72 65 6e 74 20 55 6e 69 78  * Different Unix
2920: 20 73 79 73 74 65 6d 73 20 64 65 63 6c 61 72 65   systems declare
2930: 20 6f 70 65 6e 28 29 20 69 6e 20 64 69 66 66 65   open() in diffe
2940: 72 65 6e 74 20 77 61 79 73 2e 20 20 53 61 6d 65  rent ways.  Same
2950: 20 75 73 65 0a 2a 2a 20 6f 70 65 6e 28 63 6f 6e   use.** open(con
2960: 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 6d 6f 64  st char*,int,mod
2970: 65 5f 74 29 2e 20 20 4f 74 68 65 72 73 20 75 73  e_t).  Others us
2980: 65 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61  e open(const cha
2990: 72 2a 2c 69 6e 74 2c 2e 2e 2e 29 2e 0a 2a 2a 20  r*,int,...)..** 
29a0: 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 69  The difference i
29b0: 73 20 69 6d 70 6f 72 74 61 6e 74 20 77 68 65 6e  s important when
29c0: 20 75 73 69 6e 67 20 61 20 70 6f 69 6e 74 65 72   using a pointer
29d0: 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
29e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 66 65  ..**.** The safe
29f0: 73 74 20 77 61 79 20 74 6f 20 64 65 61 6c 20 77  st way to deal w
2a00: 69 74 68 20 74 68 65 20 70 72 6f 62 6c 65 6d 20  ith the problem 
2a10: 69 73 20 74 6f 20 61 6c 77 61 79 73 20 75 73 65  is to always use
2a20: 20 74 68 69 73 20 77 72 61 70 70 65 72 0a 2a 2a   this wrapper.**
2a30: 20 77 68 69 63 68 20 61 6c 77 61 79 73 20 68 61   which always ha
2a40: 73 20 74 68 65 20 73 61 6d 65 20 77 65 6c 6c 2d  s the same well-
2a50: 64 65 66 69 6e 65 64 20 69 6e 74 65 72 66 61 63  defined interfac
2a60: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2a70: 20 70 6f 73 69 78 4f 70 65 6e 28 63 6f 6e 73 74   posixOpen(const
2a80: 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 69 6e   char *zFile, in
2a90: 74 20 66 6c 61 67 73 2c 20 69 6e 74 20 6d 6f 64  t flags, int mod
2aa0: 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65  e){.  return ope
2ab0: 6e 28 7a 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20  n(zFile, flags, 
2ac0: 6d 6f 64 65 29 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  mode);.}../* For
2ad0: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
2ae0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65  /.static int ope
2af0: 6e 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74  nDirectory(const
2b00: 20 63 68 61 72 2a 2c 20 69 6e 74 2a 29 3b 0a 73   char*, int*);.s
2b10: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65  tatic int unixGe
2b20: 74 70 61 67 65 73 69 7a 65 28 76 6f 69 64 29 3b  tpagesize(void);
2b30: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73  ../*.** Many sys
2b40: 74 65 6d 20 63 61 6c 6c 73 20 61 72 65 20 61 63  tem calls are ac
2b50: 63 65 73 73 65 64 20 74 68 72 6f 75 67 68 20 70  cessed through p
2b60: 6f 69 6e 74 65 72 2d 74 6f 2d 66 75 6e 63 74 69  ointer-to-functi
2b70: 6f 6e 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74  ons so that.** t
2b80: 68 65 79 20 6d 61 79 20 62 65 20 6f 76 65 72 72  hey may be overr
2b90: 69 64 64 65 6e 20 61 74 20 72 75 6e 74 69 6d 65  idden at runtime
2ba0: 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 66   to facilitate f
2bb0: 61 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e 20 64  ault injection d
2bc0: 75 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67  uring.** testing
2bd0: 20 61 6e 64 20 73 61 6e 64 62 6f 78 69 6e 67 2e   and sandboxing.
2be0: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
2bf0: 61 72 72 61 79 20 68 6f 6c 64 73 20 74 68 65 20  array holds the 
2c00: 6e 61 6d 65 73 20 61 6e 64 20 70 6f 69 6e 74 65  names and pointe
2c10: 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76 65  rs.** to all ove
2c20: 72 72 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d  rrideable system
2c30: 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   calls..*/.stati
2c40: 63 20 73 74 72 75 63 74 20 75 6e 69 78 5f 73 79  c struct unix_sy
2c50: 73 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74 20  scall {.  const 
2c60: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
2c70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2c80: 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61  of the system ca
2c90: 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ll */.  sqlite3_
2ca0: 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 43 75 72  syscall_ptr pCur
2cb0: 72 65 6e 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74  rent; /* Current
2cc0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79   value of the sy
2cd0: 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73  stem call */.  s
2ce0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
2cf0: 74 72 20 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20  tr pDefault; /* 
2d00: 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f  Default value */
2d10: 0a 7d 20 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20  .} aSyscall[] = 
2d20: 7b 0a 20 20 7b 20 22 6f 70 65 6e 22 2c 20 20 20  {.  { "open",   
2d30: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
2d40: 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78  yscall_ptr)posix
2d50: 4f 70 65 6e 2c 20 20 30 20 20 7d 2c 0a 23 64 65  Open,  0  },.#de
2d60: 66 69 6e 65 20 6f 73 4f 70 65 6e 20 20 20 20 20  fine osOpen     
2d70: 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20   ((int(*)(const 
2d80: 63 68 61 72 2a 2c 69 6e 74 2c 69 6e 74 29 29 61  char*,int,int))a
2d90: 53 79 73 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72  Syscall[0].pCurr
2da0: 65 6e 74 29 0a 0a 20 20 7b 20 22 63 6c 6f 73 65  ent)..  { "close
2db0: 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ",        (sqlit
2dc0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 63  e3_syscall_ptr)c
2dd0: 6c 6f 73 65 2c 20 20 20 20 20 20 30 20 20 7d 2c  lose,      0  },
2de0: 0a 23 64 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65  .#define osClose
2df0: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e       ((int(*)(in
2e00: 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70  t))aSyscall[1].p
2e10: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 61  Current)..  { "a
2e20: 63 63 65 73 73 22 2c 20 20 20 20 20 20 20 28 73  ccess",       (s
2e30: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
2e40: 74 72 29 61 63 63 65 73 73 2c 20 20 20 20 20 30  tr)access,     0
2e50: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 41    },.#define osA
2e60: 63 63 65 73 73 20 20 20 20 28 28 69 6e 74 28 2a  ccess    ((int(*
2e70: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e  )(const char*,in
2e80: 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70  t))aSyscall[2].p
2e90: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 67  Current)..  { "g
2ea0: 65 74 63 77 64 22 2c 20 20 20 20 20 20 20 28 73  etcwd",       (s
2eb0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
2ec0: 74 72 29 67 65 74 63 77 64 2c 20 20 20 20 20 30  tr)getcwd,     0
2ed0: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 47    },.#define osG
2ee0: 65 74 63 77 64 20 20 20 20 28 28 63 68 61 72 2a  etcwd    ((char*
2ef0: 28 2a 29 28 63 68 61 72 2a 2c 73 69 7a 65 5f 74  (*)(char*,size_t
2f00: 29 29 61 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43  ))aSyscall[3].pC
2f10: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 73 74  urrent)..  { "st
2f20: 61 74 22 2c 20 20 20 20 20 20 20 20 20 28 73 71  at",         (sq
2f30: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
2f40: 72 29 73 74 61 74 2c 20 20 20 20 20 20 20 30 20  r)stat,       0 
2f50: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 53 74   },.#define osSt
2f60: 61 74 20 20 20 20 20 20 28 28 69 6e 74 28 2a 29  at      ((int(*)
2f70: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 74 72  (const char*,str
2f80: 75 63 74 20 73 74 61 74 2a 29 29 61 53 79 73 63  uct stat*))aSysc
2f90: 61 6c 6c 5b 34 5d 2e 70 43 75 72 72 65 6e 74 29  all[4].pCurrent)
2fa0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 44 4a 47 50  ../*.** The DJGP
2fb0: 50 20 63 6f 6d 70 69 6c 65 72 20 65 6e 76 69 72  P compiler envir
2fc0: 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73  onment looks mos
2fd0: 74 6c 79 20 6c 69 6b 65 20 55 6e 69 78 2c 20 62  tly like Unix, b
2fe0: 75 74 20 69 74 0a 2a 2a 20 6c 61 63 6b 73 20 74  ut it.** lacks t
2ff0: 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65  he fcntl() syste
3000: 6d 20 63 61 6c 6c 2e 20 20 53 6f 20 72 65 64 65  m call.  So rede
3010: 66 69 6e 65 20 66 63 6e 74 6c 28 29 20 74 6f 20  fine fcntl() to 
3020: 62 65 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20  be something.** 
3030: 74 68 61 74 20 61 6c 77 61 79 73 20 73 75 63 63  that always succ
3040: 65 65 64 73 2e 20 20 54 68 69 73 20 6d 65 61 6e  eeds.  This mean
3050: 73 20 74 68 61 74 20 6c 6f 63 6b 69 6e 67 20 64  s that locking d
3060: 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e  oes not occur un
3070: 64 65 72 0a 2a 2a 20 44 4a 47 50 50 2e 20 20 42  der.** DJGPP.  B
3080: 75 74 20 69 74 20 69 73 20 44 4f 53 20 2d 20 77  ut it is DOS - w
3090: 68 61 74 20 64 69 64 20 79 6f 75 20 65 78 70 65  hat did you expe
30a0: 63 74 3f 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f  ct?.*/.#ifdef __
30b0: 44 4a 47 50 50 5f 5f 0a 20 20 7b 20 22 66 73 74  DJGPP__.  { "fst
30c0: 61 74 22 2c 20 20 20 20 20 20 20 20 30 2c 20 20  at",        0,  
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
30e0: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46    },.#define osF
30f0: 73 74 61 74 28 61 2c 62 2c 63 29 20 20 20 20 30  stat(a,b,c)    0
3100: 0a 23 65 6c 73 65 20 20 20 20 20 0a 20 20 7b 20  .#else     .  { 
3110: 22 66 73 74 61 74 22 2c 20 20 20 20 20 20 20 20  "fstat",        
3120: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3130: 5f 70 74 72 29 66 73 74 61 74 2c 20 20 20 20 20  _ptr)fstat,     
3140: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
3150: 73 46 73 74 61 74 20 20 20 20 20 28 28 69 6e 74  sFstat     ((int
3160: 28 2a 29 28 69 6e 74 2c 73 74 72 75 63 74 20 73  (*)(int,struct s
3170: 74 61 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 35  tat*))aSyscall[5
3180: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64  ].pCurrent).#end
3190: 69 66 0a 0a 20 20 7b 20 22 66 74 72 75 6e 63 61  if..  { "ftrunca
31a0: 74 65 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33  te",    (sqlite3
31b0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 74 72  _syscall_ptr)ftr
31c0: 75 6e 63 61 74 65 2c 20 20 30 20 20 7d 2c 0a 23  uncate,  0  },.#
31d0: 64 65 66 69 6e 65 20 6f 73 46 74 72 75 6e 63 61  define osFtrunca
31e0: 74 65 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c  te ((int(*)(int,
31f0: 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  off_t))aSyscall[
3200: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  6].pCurrent)..  
3210: 7b 20 22 66 63 6e 74 6c 22 2c 20 20 20 20 20 20  { "fcntl",      
3220: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3230: 6c 6c 5f 70 74 72 29 66 63 6e 74 6c 2c 20 20 20  ll_ptr)fcntl,   
3240: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
3250: 20 6f 73 46 63 6e 74 6c 20 20 20 20 20 28 28 69   osFcntl     ((i
3260: 6e 74 28 2a 29 28 69 6e 74 2c 69 6e 74 2c 2e 2e  nt(*)(int,int,..
3270: 2e 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70  .))aSyscall[7].p
3280: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72  Current)..  { "r
3290: 65 61 64 22 2c 20 20 20 20 20 20 20 20 20 28 73  ead",         (s
32a0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
32b0: 74 72 29 72 65 61 64 2c 20 20 20 20 20 20 20 30  tr)read,       0
32c0: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52    },.#define osR
32d0: 65 61 64 20 20 20 20 20 20 28 28 73 73 69 7a 65  ead      ((ssize
32e0: 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c  _t(*)(int,void*,
32f0: 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  size_t))aSyscall
3300: 5b 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [8].pCurrent)..#
3310: 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
3320: 52 45 41 44 29 20 7c 7c 20 53 51 4c 49 54 45 5f  READ) || SQLITE_
3330: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
3340: 54 59 4c 45 0a 20 20 7b 20 22 70 72 65 61 64 22  TYLE.  { "pread"
3350: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
3360: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 72  3_syscall_ptr)pr
3370: 65 61 64 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a  ead,      0  },.
3380: 23 65 6c 73 65 0a 20 20 7b 20 22 70 72 65 61 64  #else.  { "pread
3390: 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ",        (sqlit
33a0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30  e3_syscall_ptr)0
33b0: 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c  ,          0  },
33c0: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
33d0: 6f 73 50 72 65 61 64 20 20 20 20 20 28 28 73 73  osPread     ((ss
33e0: 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69  ize_t(*)(int,voi
33f0: 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29  d*,size_t,off_t)
3400: 29 61 53 79 73 63 61 6c 6c 5b 39 5d 2e 70 43 75  )aSyscall[9].pCu
3410: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
3420: 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29  ned(USE_PREAD64)
3430: 0a 20 20 7b 20 22 70 72 65 61 64 36 34 22 2c 20  .  { "pread64", 
3440: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3450: 73 63 61 6c 6c 5f 70 74 72 29 70 72 65 61 64 36  scall_ptr)pread6
3460: 34 2c 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73  4,    0  },.#els
3470: 65 0a 20 20 7b 20 22 70 72 65 61 64 36 34 22 2c  e.  { "pread64",
3480: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3490: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
34a0: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e         0  },.#en
34b0: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 72  dif.#define osPr
34c0: 65 61 64 36 34 20 20 20 28 28 73 73 69 7a 65 5f  ead64   ((ssize_
34d0: 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73  t(*)(int,void*,s
34e0: 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79  ize_t,off_t))aSy
34f0: 73 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65  scall[10].pCurre
3500: 6e 74 29 0a 0a 20 20 7b 20 22 77 72 69 74 65 22  nt)..  { "write"
3510: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
3520: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 77 72  3_syscall_ptr)wr
3530: 69 74 65 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a  ite,      0  },.
3540: 23 64 65 66 69 6e 65 20 6f 73 57 72 69 74 65 20  #define osWrite 
3550: 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29      ((ssize_t(*)
3560: 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  (int,const void*
3570: 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c  ,size_t))aSyscal
3580: 6c 5b 31 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[11].pCurrent).
3590: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
35a0: 5f 50 52 45 41 44 29 20 7c 7c 20 53 51 4c 49 54  _PREAD) || SQLIT
35b0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
35c0: 5f 53 54 59 4c 45 0a 20 20 7b 20 22 70 77 72 69  _STYLE.  { "pwri
35d0: 74 65 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  te",       (sqli
35e0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
35f0: 70 77 72 69 74 65 2c 20 20 20 20 20 30 20 20 7d  pwrite,     0  }
3600: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 77 72  ,.#else.  { "pwr
3610: 69 74 65 22 2c 20 20 20 20 20 20 20 28 73 71 6c  ite",       (sql
3620: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3630: 29 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20  )0,          0  
3640: 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e  },.#endif.#defin
3650: 65 20 6f 73 50 77 72 69 74 65 20 20 20 20 28 28  e osPwrite    ((
3660: 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63  ssize_t(*)(int,c
3670: 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f  onst void*,size_
3680: 74 2c 6f 66 66 5f 74 29 29 5c 0a 20 20 20 20 20  t,off_t))\.     
3690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
36a0: 53 79 73 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72  Syscall[12].pCur
36b0: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
36c0: 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a  ed(USE_PREAD64).
36d0: 20 20 7b 20 22 70 77 72 69 74 65 36 34 22 2c 20    { "pwrite64", 
36e0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
36f0: 63 61 6c 6c 5f 70 74 72 29 70 77 72 69 74 65 36  call_ptr)pwrite6
3700: 34 2c 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65  4,   0  },.#else
3710: 0a 20 20 7b 20 22 70 77 72 69 74 65 36 34 22 2c  .  { "pwrite64",
3720: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3730: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
3740: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64        0  },.#end
3750: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 77 72  if.#define osPwr
3760: 69 74 65 36 34 20 20 28 28 73 73 69 7a 65 5f 74  ite64  ((ssize_t
3770: 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  (*)(int,const vo
3780: 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74  id*,size_t,off_t
3790: 29 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))\.            
37a0: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
37b0: 5b 31 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [13].pCurrent)..
37c0: 20 20 7b 20 22 66 63 68 6d 6f 64 22 2c 20 20 20    { "fchmod",   
37d0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
37e0: 63 61 6c 6c 5f 70 74 72 29 66 63 68 6d 6f 64 2c  call_ptr)fchmod,
37f0: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
3800: 23 64 65 66 69 6e 65 20 6f 73 46 63 68 6d 6f 64  #define osFchmod
3810: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74      ((int(*)(int
3820: 2c 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61 6c  ,mode_t))aSyscal
3830: 6c 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[14].pCurrent).
3840: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56  .#if defined(HAV
3850: 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54  E_POSIX_FALLOCAT
3860: 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58  E) && HAVE_POSIX
3870: 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 7b 20 22  _FALLOCATE.  { "
3880: 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20 28  fallocate",    (
3890: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
38a0: 70 74 72 29 70 6f 73 69 78 5f 66 61 6c 6c 6f 63  ptr)posix_falloc
38b0: 61 74 65 2c 20 20 30 20 7d 2c 0a 23 65 6c 73 65  ate,  0 },.#else
38c0: 0a 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65 22  .  { "fallocate"
38d0: 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79  ,    (sqlite3_sy
38e0: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
38f0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3900: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
3910: 6f 73 46 61 6c 6c 6f 63 61 74 65 20 28 28 69 6e  osFallocate ((in
3920: 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 2c 6f  t(*)(int,off_t,o
3930: 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31  ff_t))aSyscall[1
3940: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  5].pCurrent)..  
3950: 7b 20 22 75 6e 6c 69 6e 6b 22 2c 20 20 20 20 20  { "unlink",     
3960: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3970: 6c 6c 5f 70 74 72 29 75 6e 6c 69 6e 6b 2c 20 20  ll_ptr)unlink,  
3980: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64           0 },.#d
3990: 65 66 69 6e 65 20 6f 73 55 6e 6c 69 6e 6b 20 20  efine osUnlink  
39a0: 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74    ((int(*)(const
39b0: 20 63 68 61 72 2a 29 29 61 53 79 73 63 61 6c 6c   char*))aSyscall
39c0: 5b 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [16].pCurrent)..
39d0: 20 20 7b 20 22 6f 70 65 6e 44 69 72 65 63 74 6f    { "openDirecto
39e0: 72 79 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33  ry",    (sqlite3
39f0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6f 70 65  _syscall_ptr)ope
3a00: 6e 44 69 72 65 63 74 6f 72 79 2c 20 20 20 20 20  nDirectory,     
3a10: 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73   0 },.#define os
3a20: 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 20 28 28  OpenDirectory ((
3a30: 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  int(*)(const cha
3a40: 72 2a 2c 69 6e 74 2a 29 29 61 53 79 73 63 61 6c  r*,int*))aSyscal
3a50: 6c 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[17].pCurrent).
3a60: 0a 20 20 7b 20 22 6d 6b 64 69 72 22 2c 20 20 20  .  { "mkdir",   
3a70: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3a80: 73 63 61 6c 6c 5f 70 74 72 29 6d 6b 64 69 72 2c  scall_ptr)mkdir,
3a90: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3aa0: 23 64 65 66 69 6e 65 20 6f 73 4d 6b 64 69 72 20  #define osMkdir 
3ab0: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e      ((int(*)(con
3ac0: 73 74 20 63 68 61 72 2a 2c 6d 6f 64 65 5f 74 29  st char*,mode_t)
3ad0: 29 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 43  )aSyscall[18].pC
3ae0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72 6d  urrent)..  { "rm
3af0: 64 69 72 22 2c 20 20 20 20 20 20 20 20 28 73 71  dir",        (sq
3b00: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3b10: 72 29 72 6d 64 69 72 2c 20 20 20 20 20 20 20 20  r)rmdir,        
3b20: 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20     0 },.#define 
3b30: 6f 73 52 6d 64 69 72 20 20 20 20 20 28 28 69 6e  osRmdir     ((in
3b40: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
3b50: 29 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70  ))aSyscall[19].p
3b60: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66  Current)..  { "f
3b70: 63 68 6f 77 6e 22 2c 20 20 20 20 20 20 20 28 73  chown",       (s
3b80: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3b90: 74 72 29 66 63 68 6f 77 6e 2c 20 20 20 20 20 20  tr)fchown,      
3ba0: 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65      0 },.#define
3bb0: 20 6f 73 46 63 68 6f 77 6e 20 20 20 20 28 28 69   osFchown    ((i
3bc0: 6e 74 28 2a 29 28 69 6e 74 2c 75 69 64 5f 74 2c  nt(*)(int,uid_t,
3bd0: 67 69 64 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  gid_t))aSyscall[
3be0: 32 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  20].pCurrent).. 
3bf0: 20 7b 20 22 67 65 74 65 75 69 64 22 2c 20 20 20   { "geteuid",   
3c00: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3c10: 61 6c 6c 5f 70 74 72 29 67 65 74 65 75 69 64 2c  all_ptr)geteuid,
3c20: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64           0 },.#d
3c30: 65 66 69 6e 65 20 6f 73 47 65 74 65 75 69 64 20  efine osGeteuid 
3c40: 20 20 28 28 75 69 64 5f 74 28 2a 29 28 76 6f 69    ((uid_t(*)(voi
3c50: 64 29 29 61 53 79 73 63 61 6c 6c 5b 32 31 5d 2e  d))aSyscall[21].
3c60: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
3c70: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
3c80: 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49  MIT_WAL) || SQLI
3c90: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
3ca0: 3e 30 0a 20 20 7b 20 22 6d 6d 61 70 22 2c 20 20  >0.  { "mmap",  
3cb0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3cc0: 73 63 61 6c 6c 5f 70 74 72 29 6d 6d 61 70 2c 20  scall_ptr)mmap, 
3cd0: 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65      0 },.#define
3ce0: 20 6f 73 4d 6d 61 70 20 28 28 76 6f 69 64 2a 28   osMmap ((void*(
3cf0: 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c  *)(void*,size_t,
3d00: 69 6e 74 2c 69 6e 74 2c 69 6e 74 2c 6f 66 66 5f  int,int,int,off_
3d10: 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 32 5d 2e  t))aSyscall[22].
3d20: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3d30: 6d 75 6e 6d 61 70 22 2c 20 20 20 20 20 20 20 28  munmap",       (
3d40: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3d50: 70 74 72 29 6d 75 6e 6d 61 70 2c 20 20 20 20 20  ptr)munmap,     
3d60: 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e       0 },.#defin
3d70: 65 20 6f 73 4d 75 6e 6d 61 70 20 28 28 76 6f 69  e osMunmap ((voi
3d80: 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65  d*(*)(void*,size
3d90: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 33 5d  _t))aSyscall[23]
3da0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
3db0: 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20 20 7b 20  HAVE_MREMAP.  { 
3dc0: 22 6d 72 65 6d 61 70 22 2c 20 20 20 20 20 20 20  "mremap",       
3dd0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3de0: 5f 70 74 72 29 6d 72 65 6d 61 70 2c 20 20 20 20  _ptr)mremap,    
3df0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
3e00: 0a 20 20 7b 20 22 6d 72 65 6d 61 70 22 2c 20 20  .  { "mremap",  
3e10: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3e20: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
3e30: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3e40: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
3e50: 73 4d 72 65 6d 61 70 20 28 28 76 6f 69 64 2a 28  sMremap ((void*(
3e60: 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c  *)(void*,size_t,
3e70: 73 69 7a 65 5f 74 2c 69 6e 74 2c 2e 2e 2e 29 29  size_t,int,...))
3e80: 61 53 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75  aSyscall[24].pCu
3e90: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 67 65 74  rrent)..  { "get
3ea0: 70 61 67 65 73 69 7a 65 22 2c 20 20 28 73 71 6c  pagesize",  (sql
3eb0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3ec0: 29 75 6e 69 78 47 65 74 70 61 67 65 73 69 7a 65  )unixGetpagesize
3ed0: 2c 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f  , 0 },.#define o
3ee0: 73 47 65 74 70 61 67 65 73 69 7a 65 20 28 28 69  sGetpagesize ((i
3ef0: 6e 74 28 2a 29 28 76 6f 69 64 29 29 61 53 79 73  nt(*)(void))aSys
3f00: 63 61 6c 6c 5b 32 35 5d 2e 70 43 75 72 72 65 6e  call[25].pCurren
3f10: 74 29 0a 0a 20 20 7b 20 22 72 65 61 64 6c 69 6e  t)..  { "readlin
3f20: 6b 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65 33  k",     (sqlite3
3f30: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 65 61  _syscall_ptr)rea
3f40: 64 6c 69 6e 6b 2c 20 20 20 20 20 20 20 20 30 20  dlink,        0 
3f50: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52 65 61  },.#define osRea
3f60: 64 6c 69 6e 6b 20 28 28 73 73 69 7a 65 5f 74 28  dlink ((ssize_t(
3f70: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63  *)(const char*,c
3f80: 68 61 72 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79  har*,size_t))aSy
3f90: 73 63 61 6c 6c 5b 32 36 5d 2e 70 43 75 72 72 65  scall[26].pCurre
3fa0: 6e 74 29 0a 0a 23 65 6e 64 69 66 0a 0a 7d 3b 20  nt)..#endif..}; 
3fb0: 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6f 76  /* End of the ov
3fc0: 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74 65  errideable syste
3fd0: 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 0a 2f 2a 0a  m calls */.../*.
3fe0: 2a 2a 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65  ** On some syste
3ff0: 6d 73 2c 20 63 61 6c 6c 73 20 74 6f 20 66 63 68  ms, calls to fch
4000: 6f 77 6e 28 29 20 77 69 6c 6c 20 74 72 69 67 67  own() will trigg
4010: 65 72 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20  er a message in 
4020: 61 20 73 65 63 75 72 69 74 79 0a 2a 2a 20 6c 6f  a security.** lo
4030: 67 20 69 66 20 74 68 65 79 20 63 6f 6d 65 20 66  g if they come f
4040: 72 6f 6d 20 6e 6f 6e 2d 72 6f 6f 74 20 70 72 6f  rom non-root pro
4050: 63 65 73 73 65 73 2e 20 20 53 6f 20 61 76 6f 69  cesses.  So avoi
4060: 64 20 63 61 6c 6c 69 6e 67 20 66 63 68 6f 77 6e  d calling fchown
4070: 28 29 20 69 66 0a 2a 2a 20 77 65 20 61 72 65 20  () if.** we are 
4080: 6e 6f 74 20 72 75 6e 6e 69 6e 67 20 61 73 20 72  not running as r
4090: 6f 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  oot..*/.static i
40a0: 6e 74 20 72 6f 62 75 73 74 46 63 68 6f 77 6e 28  nt robustFchown(
40b0: 69 6e 74 20 66 64 2c 20 75 69 64 5f 74 20 75 69  int fd, uid_t ui
40c0: 64 2c 20 67 69 64 5f 74 20 67 69 64 29 7b 0a 23  d, gid_t gid){.#
40d0: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
40e0: 72 65 74 75 72 6e 20 30 3b 0a 23 65 6c 73 65 0a  return 0;.#else.
40f0: 20 20 72 65 74 75 72 6e 20 6f 73 47 65 74 65 75    return osGeteu
4100: 69 64 28 29 20 3f 20 30 20 3a 20 6f 73 46 63 68  id() ? 0 : osFch
4110: 6f 77 6e 28 66 64 2c 75 69 64 2c 67 69 64 29 3b  own(fd,uid,gid);
4120: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
4130: 20 54 68 69 73 20 69 73 20 74 68 65 20 78 53 65   This is the xSe
4140: 74 53 79 73 74 65 6d 43 61 6c 6c 28 29 20 6d 65  tSystemCall() me
4150: 74 68 6f 64 20 6f 66 20 73 71 6c 69 74 65 33 5f  thod of sqlite3_
4160: 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74  vfs for all of t
4170: 68 65 0a 2a 2a 20 22 75 6e 69 78 22 20 56 46 53  he.** "unix" VFS
4180: 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  es.  Return SQLI
4190: 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65  TE_OK opon succe
41a0: 73 73 66 75 6c 6c 79 20 75 70 64 61 74 69 6e 67  ssfully updating
41b0: 20 74 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63   the.** system c
41c0: 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20  all pointer, or 
41d0: 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
41e0: 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63  if there is no c
41f0: 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73  onfigurable.** s
4200: 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64  ystem call named
4210: 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69   zName..*/.stati
4220: 63 20 69 6e 74 20 75 6e 69 78 53 65 74 53 79 73  c int unixSetSys
4230: 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74  temCall(.  sqlit
4240: 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64  e3_vfs *pNotUsed
4250: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
4260: 56 46 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f  VFS pointer.  No
4270: 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  t used */.  cons
4280: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20  t char *zName,  
4290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
42a0: 65 20 6f 66 20 73 79 73 74 65 6d 20 63 61 6c 6c  e of system call
42b0: 20 74 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a   to override */.
42c0: 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c    sqlite3_syscal
42d0: 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e 63 20 20  l_ptr pNewFunc  
42e0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65  /* Pointer to ne
42f0: 77 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 76 61  w system call va
4300: 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69  lue */.){.  unsi
4310: 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 69 6e  gned int i;.  in
4320: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  t rc = SQLITE_NO
4330: 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55 53 45  TFOUND;..  UNUSE
4340: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74  D_PARAMETER(pNot
4350: 55 73 65 64 29 3b 0a 20 20 69 66 28 20 7a 4e 61  Used);.  if( zNa
4360: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  me==0 ){.    /* 
4370: 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 20 67  If no zName is g
4380: 69 76 65 6e 2c 20 72 65 73 74 6f 72 65 20 61 6c  iven, restore al
4390: 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 74  l system calls t
43a0: 6f 20 74 68 65 69 72 20 64 65 66 61 75 6c 74 0a  o their default.
43b0: 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 73 20      ** settings 
43c0: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a  and return NULL.
43d0: 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
43e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 66  SQLITE_OK;.    f
43f0: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
4400: 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f  (aSyscall)/sizeo
4410: 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20  f(aSyscall[0]); 
4420: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
4430: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66  aSyscall[i].pDef
4440: 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ault ){.        
4450: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
4460: 72 65 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b  rent = aSyscall[
4470: 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20  i].pDefault;.   
4480: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
4490: 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e  se{.    /* If zN
44a0: 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64  ame is specified
44b0: 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c  , operate on onl
44c0: 79 20 74 68 65 20 6f 6e 65 20 73 79 73 74 65 6d  y the one system
44d0: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65   call.    ** spe
44e0: 63 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  cified..    */. 
44f0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69     for(i=0; i<si
4500: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73  zeof(aSyscall)/s
4510: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30  izeof(aSyscall[0
4520: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ]); i++){.      
4530: 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65  if( strcmp(zName
4540: 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e  , aSyscall[i].zN
4550: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
4560: 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b     if( aSyscall[
4570: 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d 30 20 29  i].pDefault==0 )
4580: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 53 79 73  {.          aSys
4590: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
45a0: 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70   = aSyscall[i].p
45b0: 43 75 72 72 65 6e 74 3b 0a 20 20 20 20 20 20 20  Current;.       
45c0: 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
45d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
45e0: 20 20 20 69 66 28 20 70 4e 65 77 46 75 6e 63 3d     if( pNewFunc=
45f0: 3d 30 20 29 20 70 4e 65 77 46 75 6e 63 20 3d 20  =0 ) pNewFunc = 
4600: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66  aSyscall[i].pDef
4610: 61 75 6c 74 3b 0a 20 20 20 20 20 20 20 20 61 53  ault;.        aS
4620: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
4630: 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20  nt = pNewFunc;. 
4640: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4650: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
4660: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
4670: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
4680: 20 76 61 6c 75 65 20 6f 66 20 61 20 73 79 73 74   value of a syst
4690: 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e  em call.  Return
46a0: 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69   NULL if zName i
46b0: 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67  s not a.** recog
46c0: 6e 69 7a 65 64 20 73 79 73 74 65 6d 20 63 61 6c  nized system cal
46d0: 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73  l name.  NULL is
46e0: 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69   also returned i
46f0: 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c  f the system cal
4700: 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c  l.** is currentl
4710: 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  y undefined..*/.
4720: 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73  static sqlite3_s
4730: 79 73 63 61 6c 6c 5f 70 74 72 20 75 6e 69 78 47  yscall_ptr unixG
4740: 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20  etSystemCall(.  
4750: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f  sqlite3_vfs *pNo
4760: 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74 20 63  tUsed,.  const c
4770: 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20  har *zName.){.  
4780: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a  unsigned int i;.
4790: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
47a0: 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20  TER(pNotUsed);. 
47b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
47c0: 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a  of(aSyscall)/siz
47d0: 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29  eof(aSyscall[0])
47e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
47f0: 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53  strcmp(zName, aS
4800: 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  yscall[i].zName)
4810: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79  ==0 ) return aSy
4820: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
4830: 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
4840: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
4850: 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  rn the name of t
4860: 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20  he first system 
4870: 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65  call after zName
4880: 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c  .  If zName==NUL
4890: 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e  L.** then return
48a0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
48b0: 20 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61   first system ca
48c0: 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ll.  Return NULL
48d0: 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20   if zName.** is 
48e0: 74 68 65 20 6c 61 73 74 20 73 79 73 74 65 6d 20  the last system 
48f0: 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65  call or if zName
4900: 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65   is not the name
4910: 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73   of a valid.** s
4920: 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73  ystem call..*/.s
4930: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
4940: 20 2a 75 6e 69 78 4e 65 78 74 53 79 73 74 65 6d   *unixNextSystem
4950: 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66 73  Call(sqlite3_vfs
4960: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
4970: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *zName){.  int i
4980: 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45 44   = -1;..  UNUSED
4990: 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20  _PARAMETER(p);. 
49a0: 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20   if( zName ){.  
49b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72    for(i=0; i<Arr
49c0: 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29  aySize(aSyscall)
49d0: 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  -1; i++){.      
49e0: 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65  if( strcmp(zName
49f0: 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e  , aSyscall[i].zN
4a00: 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ame)==0 ) break;
4a10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
4a20: 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i++; i<ArraySiz
4a30: 65 28 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b 2b  e(aSyscall); i++
4a40: 29 7b 0a 20 20 20 20 69 66 28 20 61 53 79 73 63  ){.    if( aSysc
4a50: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 21  all[i].pCurrent!
4a60: 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79 73  =0 ) return aSys
4a70: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20  call[i].zName;. 
4a80: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
4a90: 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61  ../*.** Do not a
4aa0: 63 63 65 70 74 20 61 6e 79 20 66 69 6c 65 20 64  ccept any file d
4ab0: 65 73 63 72 69 70 74 6f 72 20 6c 65 73 73 20 74  escriptor less t
4ac0: 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2c 20  han this value, 
4ad0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69  in order to avoi
4ae0: 64 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 64 61 74  d.** opening dat
4af0: 61 62 61 73 65 20 66 69 6c 65 20 75 73 69 6e 67  abase file using
4b00: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
4b10: 73 20 74 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f  s that are commo
4b20: 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 0a 2a 2a  nly used for .**
4b30: 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74 2c   standard input,
4b40: 20 6f 75 74 70 75 74 2c 20 61 6e 64 20 65 72 72   output, and err
4b50: 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  or..*/.#ifndef S
4b60: 51 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d 5f 46 49  QLITE_MINIMUM_FI
4b70: 4c 45 5f 44 45 53 43 52 49 50 54 4f 52 0a 23 20  LE_DESCRIPTOR.# 
4b80: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4d 49  define SQLITE_MI
4b90: 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52  NIMUM_FILE_DESCR
4ba0: 49 50 54 4f 52 20 33 0a 23 65 6e 64 69 66 0a 0a  IPTOR 3.#endif..
4bb0: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 6f 70 65  /*.** Invoke ope
4bc0: 6e 28 29 2e 20 20 44 6f 20 73 6f 20 6d 75 6c 74  n().  Do so mult
4bd0: 69 70 6c 65 20 74 69 6d 65 73 2c 20 75 6e 74 69  iple times, unti
4be0: 6c 20 69 74 20 65 69 74 68 65 72 20 73 75 63 63  l it either succ
4bf0: 65 65 64 73 20 6f 72 0a 2a 2a 20 66 61 69 6c 73  eeds or.** fails
4c00: 20 66 6f 72 20 73 6f 6d 65 20 72 65 61 73 6f 6e   for some reason
4c10: 20 6f 74 68 65 72 20 74 68 61 6e 20 45 49 4e 54   other than EINT
4c20: 52 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  R..**.** If the 
4c30: 66 69 6c 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f  file creation mo
4c40: 64 65 20 22 6d 22 20 69 73 20 30 20 74 68 65 6e  de "m" is 0 then
4c50: 20 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 64   set it to the d
4c60: 65 66 61 75 6c 74 20 66 6f 72 0a 2a 2a 20 53 51  efault for.** SQ
4c70: 4c 69 74 65 2e 20 20 54 68 65 20 64 65 66 61 75  Lite.  The defau
4c80: 6c 74 20 69 73 20 53 51 4c 49 54 45 5f 44 45 46  lt is SQLITE_DEF
4c90: 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
4ca0: 53 49 4f 4e 53 20 28 6e 6f 72 6d 61 6c 6c 79 0a  SIONS (normally.
4cb0: 2a 2a 20 30 36 34 34 29 20 61 73 20 6d 6f 64 69  ** 0644) as modi
4cc0: 66 69 65 64 20 62 79 20 74 68 65 20 73 79 73 74  fied by the syst
4cd0: 65 6d 20 75 6d 61 73 6b 2e 20 20 49 66 20 6d 20  em umask.  If m 
4ce0: 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 0a 2a  is not 0, then.*
4cf0: 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20  * make the file 
4d00: 63 72 65 61 74 69 6f 6e 20 6d 6f 64 65 20 62 65  creation mode be
4d10: 20 65 78 61 63 74 6c 79 20 6d 20 69 67 6e 6f 72   exactly m ignor
4d20: 69 6e 67 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a  ing the umask..*
4d30: 2a 0a 2a 2a 20 54 68 65 20 6d 20 70 61 72 61 6d  *.** The m param
4d40: 65 74 65 72 20 77 69 6c 6c 20 62 65 20 6e 6f 6e  eter will be non
4d50: 2d 7a 65 72 6f 20 6f 6e 6c 79 20 77 68 65 6e 20  -zero only when 
4d60: 63 72 65 61 74 69 6e 67 20 2d 77 61 6c 2c 20 2d  creating -wal, -
4d70: 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 61 6e 64 20  journal,.** and 
4d80: 2d 73 68 6d 20 66 69 6c 65 73 2e 20 20 57 65 20  -shm files.  We 
4d90: 77 61 6e 74 20 74 68 6f 73 65 20 66 69 6c 65 73  want those files
4da0: 20 74 6f 20 68 61 76 65 20 2a 65 78 61 63 74 6c   to have *exactl
4db0: 79 2a 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 70  y* the same.** p
4dc0: 65 72 6d 69 73 73 69 6f 6e 73 20 61 73 20 74 68  ermissions as th
4dd0: 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  eir original dat
4de0: 61 62 61 73 65 2c 20 75 6e 61 64 75 6c 74 65 72  abase, unadulter
4df0: 61 74 65 64 20 62 79 20 74 68 65 20 75 6d 61 73  ated by the umas
4e00: 6b 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20 77 61  k..** In that wa
4e10: 79 2c 20 69 66 20 61 20 64 61 74 61 62 61 73 65  y, if a database
4e20: 20 66 69 6c 65 20 69 73 20 2d 72 77 2d 72 77 2d   file is -rw-rw-
4e30: 72 77 20 6f 72 20 2d 72 77 2d 72 77 2d 72 2d 2c  rw or -rw-rw-r-,
4e40: 20 61 6e 64 20 61 0a 2a 2a 20 74 72 61 6e 73 61   and a.** transa
4e50: 63 74 69 6f 6e 20 63 72 61 73 68 65 73 20 61 6e  ction crashes an
4e60: 64 20 6c 65 61 76 65 73 20 62 65 68 69 6e 64 20  d leaves behind 
4e70: 68 6f 74 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68  hot journals, th
4e80: 65 6e 20 61 6e 79 0a 2a 2a 20 70 72 6f 63 65 73  en any.** proces
4e90: 73 20 74 68 61 74 20 69 73 20 61 62 6c 65 20 74  s that is able t
4ea0: 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64  o write to the d
4eb0: 61 74 61 62 61 73 65 20 77 69 6c 6c 20 61 6c 73  atabase will als
4ec0: 6f 20 62 65 20 61 62 6c 65 20 74 6f 0a 2a 2a 20  o be able to.** 
4ed0: 72 65 63 6f 76 65 72 20 74 68 65 20 68 6f 74 20  recover the hot 
4ee0: 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2f 0a 73 74 61  journals..*/.sta
4ef0: 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 6f  tic int robust_o
4f00: 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  pen(const char *
4f10: 7a 2c 20 69 6e 74 20 66 2c 20 6d 6f 64 65 5f 74  z, int f, mode_t
4f20: 20 6d 29 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20   m){.  int fd;. 
4f30: 20 6d 6f 64 65 5f 74 20 6d 32 20 3d 20 6d 20 3f   mode_t m2 = m ?
4f40: 20 6d 20 3a 20 53 51 4c 49 54 45 5f 44 45 46 41   m : SQLITE_DEFA
4f50: 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
4f60: 49 4f 4e 53 3b 0a 20 20 77 68 69 6c 65 28 31 29  IONS;.  while(1)
4f70: 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 5f  {.#if defined(O_
4f80: 43 4c 4f 45 58 45 43 29 0a 20 20 20 20 66 64 20  CLOEXEC).    fd 
4f90: 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66 7c 4f 5f 43  = osOpen(z,f|O_C
4fa0: 4c 4f 45 58 45 43 2c 6d 32 29 3b 0a 23 65 6c 73  LOEXEC,m2);.#els
4fb0: 65 0a 20 20 20 20 66 64 20 3d 20 6f 73 4f 70 65  e.    fd = osOpe
4fc0: 6e 28 7a 2c 66 2c 6d 32 29 3b 0a 23 65 6e 64 69  n(z,f,m2);.#endi
4fd0: 66 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29  f.    if( fd<0 )
4fe0: 7b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72 6e  {.      if( errn
4ff0: 6f 3d 3d 45 49 4e 54 52 20 29 20 63 6f 6e 74 69  o==EINTR ) conti
5000: 6e 75 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nue;.      break
5010: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
5020: 66 64 3e 3d 53 51 4c 49 54 45 5f 4d 49 4e 49 4d  fd>=SQLITE_MINIM
5030: 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52 49 50 54  UM_FILE_DESCRIPT
5040: 4f 52 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  OR ) break;.    
5050: 6f 73 43 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20  osClose(fd);.   
5060: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
5070: 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 0a 20 20  ITE_WARNING, .  
5080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 61                "a
5090: 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 5c  ttempt to open \
50a0: 22 25 73 5c 22 20 61 73 20 66 69 6c 65 20 64 65  "%s\" as file de
50b0: 73 63 72 69 70 74 6f 72 20 25 64 22 2c 20 7a 2c  scriptor %d", z,
50c0: 20 66 64 29 3b 0a 20 20 20 20 66 64 20 3d 20 2d   fd);.    fd = -
50d0: 31 3b 0a 20 20 20 20 69 66 28 20 6f 73 4f 70 65  1;.    if( osOpe
50e0: 6e 28 22 2f 64 65 76 2f 6e 75 6c 6c 22 2c 20 66  n("/dev/null", f
50f0: 2c 20 6d 29 3c 30 20 29 20 62 72 65 61 6b 3b 0a  , m)<0 ) break;.
5100: 20 20 7d 0a 20 20 69 66 28 20 66 64 3e 3d 30 20    }.  if( fd>=0 
5110: 29 7b 0a 20 20 20 20 69 66 28 20 6d 21 3d 30 20  ){.    if( m!=0 
5120: 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
5130: 73 74 61 74 20 73 74 61 74 62 75 66 3b 0a 20 20  stat statbuf;.  
5140: 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28      if( osFstat(
5150: 66 64 2c 20 26 73 74 61 74 62 75 66 29 3d 3d 30  fd, &statbuf)==0
5160: 20 0a 20 20 20 20 20 20 20 26 26 20 73 74 61 74   .       && stat
5170: 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 0a 20  buf.st_size==0. 
5180: 20 20 20 20 20 20 26 26 20 28 73 74 61 74 62 75        && (statbu
5190: 66 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37 29 21  f.st_mode&0777)!
51a0: 3d 6d 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  =m .      ){.   
51b0: 20 20 20 20 20 6f 73 46 63 68 6d 6f 64 28 66 64       osFchmod(fd
51c0: 2c 20 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , m);.      }.  
51d0: 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28    }.#if defined(
51e0: 46 44 5f 43 4c 4f 45 58 45 43 29 20 26 26 20 28  FD_CLOEXEC) && (
51f0: 21 64 65 66 69 6e 65 64 28 4f 5f 43 4c 4f 45 58  !defined(O_CLOEX
5200: 45 43 29 20 7c 7c 20 4f 5f 43 4c 4f 45 58 45 43  EC) || O_CLOEXEC
5210: 3d 3d 30 29 0a 20 20 20 20 6f 73 46 63 6e 74 6c  ==0).    osFcntl
5220: 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20 6f 73  (fd, F_SETFD, os
5230: 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46  Fcntl(fd, F_GETF
5240: 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58  D, 0) | FD_CLOEX
5250: 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  EC);.#endif.  }.
5260: 20 20 72 65 74 75 72 6e 20 66 64 3b 0a 7d 0a 0a    return fd;.}..
5270: 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e  /*.** Helper fun
5280: 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e  ctions to obtain
5290: 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20   and relinquish 
52a0: 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78  the global mutex
52b0: 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20  . The.** global 
52c0: 6d 75 74 65 78 20 69 73 20 75 73 65 64 20 74 6f  mutex is used to
52d0: 20 70 72 6f 74 65 63 74 20 74 68 65 20 75 6e 69   protect the uni
52e0: 78 49 6e 6f 64 65 49 6e 66 6f 20 61 6e 64 0a 2a  xInodeInfo and.*
52f0: 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  * vxworksFileId 
5300: 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62 79 20  objects used by 
5310: 74 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f  this file, all o
5320: 66 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a  f which may be .
5330: 2a 2a 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c  ** shared by mul
5340: 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a  tiple threads..*
5350: 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 75 6e  *.** Function un
5360: 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73  ixMutexHeld() is
5370: 20 75 73 65 64 20 74 6f 20 61 73 73 65 72 74 28   used to assert(
5380: 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61  ) that the globa
5390: 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20 68  l mutex .** is h
53a0: 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72 65  eld when require
53b0: 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
53c0: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73   is only used as
53d0: 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74 28   part of assert(
53e0: 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73  ) .** statements
53f0: 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75  . e.g..**.**   u
5400: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 0a  nixEnterMutex().
5410: 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 20 75  **     assert( u
5420: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
5430: 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65 72  ;.**   unixEnter
5440: 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74 61 74 69  Leave().*/.stati
5450: 63 20 76 6f 69 64 20 75 6e 69 78 45 6e 74 65 72  c void unixEnter
5460: 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73  Mutex(void){.  s
5470: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
5480: 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  er(sqlite3MutexA
5490: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
54a0: 58 5f 53 54 41 54 49 43 5f 56 46 53 31 29 29 3b  X_STATIC_VFS1));
54b0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  .}.static void u
54c0: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 76 6f  nixLeaveMutex(vo
54d0: 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  id){.  sqlite3_m
54e0: 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74  utex_leave(sqlit
54f0: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
5500: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
5510: 5f 56 46 53 31 29 29 3b 0a 7d 0a 23 69 66 64 65  _VFS1));.}.#ifde
5520: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73  f SQLITE_DEBUG.s
5530: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 75  tatic int unixMu
5540: 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a  texHeld(void) {.
5550: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
5560: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c 69  _mutex_held(sqli
5570: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
5580: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
5590: 43 5f 56 46 53 31 29 29 3b 0a 7d 0a 23 65 6e 64  C_VFS1));.}.#end
55a0: 69 66 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  if...#ifdef SQLI
55b0: 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43 45  TE_HAVE_OS_TRACE
55c0: 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75  ./*.** Helper fu
55d0: 6e 63 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74  nction for print
55e0: 69 6e 67 20 6f 75 74 20 74 72 61 63 65 20 69 6e  ing out trace in
55f0: 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64  formation from d
5600: 65 62 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61  ebugging.** bina
5610: 72 69 65 73 2e 20 54 68 69 73 20 72 65 74 75 72  ries. This retur
5620: 6e 73 20 74 68 65 20 73 74 72 69 6e 67 20 72 65  ns the string re
5630: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
5640: 74 68 65 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20  the supplied.** 
5650: 69 6e 74 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70  integer lock-typ
5660: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  e..*/.static con
5670: 73 74 20 63 68 61 72 20 2a 61 7a 46 69 6c 65 4c  st char *azFileL
5680: 6f 63 6b 28 69 6e 74 20 65 46 69 6c 65 4c 6f 63  ock(int eFileLoc
5690: 6b 29 7b 0a 20 20 73 77 69 74 63 68 28 20 65 46  k){.  switch( eF
56a0: 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 63  ileLock ){.    c
56b0: 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74  ase NO_LOCK: ret
56c0: 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a 20 20 20 20  urn "NONE";.    
56d0: 63 61 73 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b  case SHARED_LOCK
56e0: 3a 20 72 65 74 75 72 6e 20 22 53 48 41 52 45 44  : return "SHARED
56f0: 22 3b 0a 20 20 20 20 63 61 73 65 20 52 45 53 45  ";.    case RESE
5700: 52 56 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72  RVED_LOCK: retur
5710: 6e 20 22 52 45 53 45 52 56 45 44 22 3b 0a 20 20  n "RESERVED";.  
5720: 20 20 63 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c    case PENDING_L
5730: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 50 45 4e  OCK: return "PEN
5740: 44 49 4e 47 22 3b 0a 20 20 20 20 63 61 73 65 20  DING";.    case 
5750: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20  EXCLUSIVE_LOCK: 
5760: 72 65 74 75 72 6e 20 22 45 58 43 4c 55 53 49 56  return "EXCLUSIV
5770: 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  E";.  }.  return
5780: 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64   "ERROR";.}.#end
5790: 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
57a0: 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a  E_LOCK_TRACE./*.
57b0: 2a 2a 20 50 72 69 6e 74 20 6f 75 74 20 69 6e 66  ** Print out inf
57c0: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61  ormation about a
57d0: 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61  ll locking opera
57e0: 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tions..**.** Thi
57f0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
5800: 64 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f  d for troublesho
5810: 6f 74 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d  oting locks on m
5820: 75 6c 74 69 74 68 72 65 61 64 65 64 0a 2a 2a 20  ultithreaded.** 
5830: 70 6c 61 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62  platforms.  Enab
5840: 6c 65 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20  le by compiling 
5850: 77 69 74 68 20 74 68 65 20 2d 44 53 51 4c 49 54  with the -DSQLIT
5860: 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20  E_LOCK_TRACE.** 
5870: 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74  command-line opt
5880: 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69  ion on the compi
5890: 6c 65 72 2e 20 20 54 68 69 73 20 63 6f 64 65 20  ler.  This code 
58a0: 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74  is normally.** t
58b0: 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74  urned off..*/.st
58c0: 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61  atic int lockTra
58d0: 63 65 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f  ce(int fd, int o
58e0: 70 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  p, struct flock 
58f0: 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70  *p){.  char *zOp
5900: 4e 61 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20  Name, *zType;.  
5910: 69 6e 74 20 73 3b 0a 20 20 69 6e 74 20 73 61 76  int s;.  int sav
5920: 65 64 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f  edErrno;.  if( o
5930: 70 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20  p==F_GETLK ){.  
5940: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54    zOpName = "GET
5950: 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  LK";.  }else if(
5960: 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a   op==F_SETLK ){.
5970: 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53      zOpName = "S
5980: 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ETLK";.  }else{.
5990: 20 20 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28      s = osFcntl(
59a0: 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 20 20  fd, op, p);.    
59b0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
59c0: 74 66 28 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77  tf("fcntl unknow
59d0: 6e 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 66  n %d %d %d\n", f
59e0: 64 2c 20 6f 70 2c 20 73 29 3b 0a 20 20 20 20 72  d, op, s);.    r
59f0: 65 74 75 72 6e 20 73 3b 0a 20 20 7d 0a 20 20 69  eturn s;.  }.  i
5a00: 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f  f( p->l_type==F_
5a10: 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79  RDLCK ){.    zTy
5a20: 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20  pe = "RDLCK";.  
5a30: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74  }else if( p->l_t
5a40: 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a  ype==F_WRLCK ){.
5a50: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c      zType = "WRL
5a60: 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  CK";.  }else if(
5a70: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e   p->l_type==F_UN
5a80: 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  LCK ){.    zType
5a90: 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65   = "UNLCK";.  }e
5aa0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
5ab0: 20 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65   0 );.  }.  asse
5ac0: 72 74 28 20 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d  rt( p->l_whence=
5ad0: 3d 53 45 45 4b 5f 53 45 54 20 29 3b 0a 20 20 73  =SEEK_SET );.  s
5ae0: 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f   = osFcntl(fd, o
5af0: 70 2c 20 70 29 3b 0a 20 20 73 61 76 65 64 45 72  p, p);.  savedEr
5b00: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 73  rno = errno;.  s
5b10: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
5b20: 66 28 22 66 63 6e 74 6c 20 25 64 20 25 64 20 25  f("fcntl %d %d %
5b30: 73 20 25 73 20 25 64 20 25 64 20 25 64 20 25 64  s %s %d %d %d %d
5b40: 5c 6e 22 2c 0a 20 20 20 20 20 74 68 72 65 61 64  \n",.     thread
5b50: 69 64 2c 20 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c  id, fd, zOpName,
5b60: 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 70 2d 3e   zType, (int)p->
5b70: 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 70 2d  l_start, (int)p-
5b80: 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20 20 28 69 6e  >l_len,.     (in
5b90: 74 29 70 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a  t)p->l_pid, s);.
5ba0: 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 26 26    if( s==(-1) &&
5bb0: 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26 20   op==F_SETLK && 
5bc0: 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44  (p->l_type==F_RD
5bd0: 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65  LCK || p->l_type
5be0: 3d 3d 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20 20  ==F_WRLCK) ){.  
5bf0: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
5c00: 32 3b 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b 0a  2;.    l2 = *p;.
5c10: 20 20 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20      osFcntl(fd, 
5c20: 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20  F_GETLK, &l2);. 
5c30: 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65     if( l2.l_type
5c40: 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20  ==F_RDLCK ){.   
5c50: 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43     zType = "RDLC
5c60: 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  K";.    }else if
5c70: 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57  ( l2.l_type==F_W
5c80: 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54  RLCK ){.      zT
5c90: 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20  ype = "WRLCK";. 
5ca0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e     }else if( l2.
5cb0: 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20  l_type==F_UNLCK 
5cc0: 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  ){.      zType =
5cd0: 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d 65   "UNLCK";.    }e
5ce0: 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
5cf0: 74 28 20 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  t( 0 );.    }.  
5d00: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
5d10: 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66 61 69 6c  intf("fcntl-fail
5d20: 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25 73 20 25  ure-reason: %s %
5d30: 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20  d %d %d\n",.    
5d40: 20 20 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 6c     zType, (int)l
5d50: 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29  2.l_start, (int)
5d60: 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c  l2.l_len, (int)l
5d70: 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a 20 20  2.l_pid);.  }.  
5d80: 65 72 72 6e 6f 20 3d 20 73 61 76 65 64 45 72 72  errno = savedErr
5d90: 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a  no;.  return s;.
5da0: 7d 0a 23 75 6e 64 65 66 20 6f 73 46 63 6e 74 6c  }.#undef osFcntl
5db0: 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 6e 74 6c  .#define osFcntl
5dc0: 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65 6e 64 69   lockTrace.#endi
5dd0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  f /* SQLITE_LOCK
5de0: 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _TRACE */../*.**
5df0: 20 52 65 74 72 79 20 66 74 72 75 6e 63 61 74 65   Retry ftruncate
5e00: 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 66 61  () calls that fa
5e10: 69 6c 20 64 75 65 20 74 6f 20 45 49 4e 54 52 0a  il due to EINTR.
5e20: 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 61 6c 6c 73 20  **.** All calls 
5e30: 74 6f 20 66 74 72 75 6e 63 61 74 65 28 29 20 77  to ftruncate() w
5e40: 69 74 68 69 6e 20 74 68 69 73 20 66 69 6c 65 20  ithin this file 
5e50: 73 68 6f 75 6c 64 20 62 65 20 6d 61 64 65 20 74  should be made t
5e60: 68 72 6f 75 67 68 0a 2a 2a 20 74 68 69 73 20 77  hrough.** this w
5e70: 72 61 70 70 65 72 2e 20 20 4f 6e 20 74 68 65 20  rapper.  On the 
5e80: 41 6e 64 72 6f 69 64 20 70 6c 61 74 66 6f 72 6d  Android platform
5e90: 2c 20 62 79 70 61 73 73 69 6e 67 20 74 68 65 20  , bypassing the 
5ea0: 6c 6f 67 69 63 20 62 65 6c 6f 77 0a 2a 2a 20 63  logic below.** c
5eb0: 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 63  ould lead to a c
5ec0: 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 2e  orrupt database.
5ed0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
5ee0: 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28  obust_ftruncate(
5ef0: 69 6e 74 20 68 2c 20 73 71 6c 69 74 65 33 5f 69  int h, sqlite3_i
5f00: 6e 74 36 34 20 73 7a 29 7b 0a 20 20 69 6e 74 20  nt64 sz){.  int 
5f10: 72 63 3b 0a 23 69 66 64 65 66 20 5f 5f 41 4e 44  rc;.#ifdef __AND
5f20: 52 4f 49 44 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 41  ROID__.  /* On A
5f30: 6e 64 72 6f 69 64 2c 20 66 74 72 75 6e 63 61 74  ndroid, ftruncat
5f40: 65 28 29 20 61 6c 77 61 79 73 20 75 73 65 73 20  e() always uses 
5f50: 33 32 2d 62 69 74 20 6f 66 66 73 65 74 73 2c 20  32-bit offsets, 
5f60: 65 76 65 6e 20 69 66 20 0a 20 20 2a 2a 20 5f 46  even if .  ** _F
5f70: 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54 53 3d  ILE_OFFSET_BITS=
5f80: 36 34 20 69 73 20 64 65 66 69 6e 65 64 2e 20 54  64 is defined. T
5f90: 68 69 73 20 6d 65 61 6e 73 20 69 74 20 69 73 20  his means it is 
5fa0: 75 6e 73 61 66 65 20 74 6f 20 61 74 74 65 6d 70  unsafe to attemp
5fb0: 74 20 74 6f 0a 20 20 2a 2a 20 74 72 75 6e 63 61  t to.  ** trunca
5fc0: 74 65 20 61 20 66 69 6c 65 20 74 6f 20 61 6e 79  te a file to any
5fd0: 20 73 69 7a 65 20 6c 61 72 67 65 72 20 74 68 61   size larger tha
5fe0: 6e 20 32 47 69 42 2e 20 53 69 6c 65 6e 74 6c 79  n 2GiB. Silently
5ff0: 20 69 67 6e 6f 72 65 20 61 6e 79 0a 20 20 2a 2a   ignore any.  **
6000: 20 73 75 63 68 20 61 74 74 65 6d 70 74 73 2e 20   such attempts. 
6010: 20 2a 2f 0a 20 20 69 66 28 20 73 7a 3e 28 73 71   */.  if( sz>(sq
6020: 6c 69 74 65 33 5f 69 6e 74 36 34 29 30 78 37 46  lite3_int64)0x7F
6030: 46 46 46 46 46 46 20 29 7b 0a 20 20 20 20 72 63  FFFFFF ){.    rc
6040: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
6050: 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 64  }else.#endif.  d
6060: 6f 7b 20 72 63 20 3d 20 6f 73 46 74 72 75 6e 63  o{ rc = osFtrunc
6070: 61 74 65 28 68 2c 73 7a 29 3b 20 7d 77 68 69 6c  ate(h,sz); }whil
6080: 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f  e( rc<0 && errno
6090: 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74  ==EINTR );.  ret
60a0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
60b0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 74 72   This routine tr
60c0: 61 6e 73 6c 61 74 65 73 20 61 20 73 74 61 6e 64  anslates a stand
60d0: 61 72 64 20 50 4f 53 49 58 20 65 72 72 6e 6f 20  ard POSIX errno 
60e0: 63 6f 64 65 20 69 6e 74 6f 20 73 6f 6d 65 74 68  code into someth
60f0: 69 6e 67 0a 2a 2a 20 75 73 65 66 75 6c 20 74 6f  ing.** useful to
6100: 20 74 68 65 20 63 6c 69 65 6e 74 73 20 6f 66 20   the clients of 
6110: 74 68 65 20 73 71 6c 69 74 65 33 20 66 75 6e 63  the sqlite3 func
6120: 74 69 6f 6e 73 2e 20 20 53 70 65 63 69 66 69 63  tions.  Specific
6130: 61 6c 6c 79 2c 20 69 74 20 69 73 0a 2a 2a 20 69  ally, it is.** i
6140: 6e 74 65 6e 64 65 64 20 74 6f 20 74 72 61 6e 73  ntended to trans
6150: 6c 61 74 65 20 61 20 76 61 72 69 65 74 79 20 6f  late a variety o
6160: 66 20 22 74 72 79 20 61 67 61 69 6e 22 20 65 72  f "try again" er
6170: 72 6f 72 73 20 69 6e 74 6f 20 53 51 4c 49 54 45  rors into SQLITE
6180: 5f 42 55 53 59 0a 2a 2a 20 61 6e 64 20 61 20 76  _BUSY.** and a v
6190: 61 72 69 65 74 79 20 6f 66 20 22 70 6c 65 61 73  ariety of "pleas
61a0: 65 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  e close the file
61b0: 20 64 65 73 63 72 69 70 74 6f 72 20 4e 4f 57 22   descriptor NOW"
61c0: 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 0a 2a 2a   errors into .**
61d0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 2a 2a   SQLITE_IOERR.**
61e0: 20 0a 2a 2a 20 45 72 72 6f 72 73 20 64 75 72 69   .** Errors duri
61f0: 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ng initializatio
6200: 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f 72 20 66  n of locks, or f
6210: 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ile system suppo
6220: 72 74 20 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a 2a  rt for locks,.**
6230: 20 73 68 6f 75 6c 64 20 68 61 6e 64 6c 65 20 45   should handle E
6240: 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55 50 2c 20  NOLCK, ENOTSUP, 
6250: 45 4f 50 4e 4f 54 53 55 50 50 20 73 65 70 61 72  EOPNOTSUPP separ
6260: 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ately..*/.static
6270: 20 69 6e 74 20 73 71 6c 69 74 65 45 72 72 6f 72   int sqliteError
6280: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 69  FromPosixError(i
6290: 6e 74 20 70 6f 73 69 78 45 72 72 6f 72 2c 20 69  nt posixError, i
62a0: 6e 74 20 73 71 6c 69 74 65 49 4f 45 72 72 29 20  nt sqliteIOErr) 
62b0: 7b 0a 20 20 61 73 73 65 72 74 28 20 28 73 71 6c  {.  assert( (sql
62c0: 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49  iteIOErr == SQLI
62d0: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c  TE_IOERR_LOCK) |
62e0: 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 73 71  | .          (sq
62f0: 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c  liteIOErr == SQL
6300: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
6310: 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  ) || .          
6320: 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20  (sqliteIOErr == 
6330: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
6340: 4f 43 4b 29 20 7c 7c 0a 20 20 20 20 20 20 20 20  OCK) ||.        
6350: 20 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d    (sqliteIOErr =
6360: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  = SQLITE_IOERR_C
6370: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
6380: 29 20 29 3b 0a 20 20 73 77 69 74 63 68 20 28 70  ) );.  switch (p
6390: 6f 73 69 78 45 72 72 6f 72 29 20 7b 0a 20 20 63  osixError) {.  c
63a0: 61 73 65 20 45 41 43 43 45 53 3a 20 0a 20 20 63  ase EACCES: .  c
63b0: 61 73 65 20 45 41 47 41 49 4e 3a 0a 20 20 63 61  ase EAGAIN:.  ca
63c0: 73 65 20 45 54 49 4d 45 44 4f 55 54 3a 0a 20 20  se ETIMEDOUT:.  
63d0: 63 61 73 65 20 45 42 55 53 59 3a 0a 20 20 63 61  case EBUSY:.  ca
63e0: 73 65 20 45 49 4e 54 52 3a 0a 20 20 63 61 73 65  se EINTR:.  case
63f0: 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20 20 20 20 2f   ENOLCK:  .    /
6400: 2a 20 72 61 6e 64 6f 6d 20 4e 46 53 20 72 65 74  * random NFS ret
6410: 72 79 20 65 72 72 6f 72 2c 20 75 6e 6c 65 73 73  ry error, unless
6420: 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73   during file sys
6430: 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20  tem support .   
6440: 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f    * introspectio
6450: 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74 20 61  n, in which it a
6460: 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68  ctually means wh
6470: 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 20 20  at it says */.  
6480: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6490: 42 55 53 59 3b 0a 20 20 20 20 0a 20 20 63 61 73  BUSY;.    .  cas
64a0: 65 20 45 50 45 52 4d 3a 20 0a 20 20 20 20 72 65  e EPERM: .    re
64b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
64c0: 3b 0a 20 20 20 20 0a 20 20 64 65 66 61 75 6c 74  ;.    .  default
64d0: 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  : .    return sq
64e0: 6c 69 74 65 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d  liteIOErr;.  }.}
64f0: 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
6500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6540: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
6550: 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 55 6e 69 71  ***** Begin Uniq
6560: 75 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69  ue File ID Utili
6570: 74 79 20 55 73 65 64 20 42 79 20 56 78 57 6f 72  ty Used By VxWor
6580: 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ks *************
6590: 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74  **.**.** On most
65a0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69   versions of uni
65b0: 78 2c 20 77 65 20 63 61 6e 20 67 65 74 20 61 20  x, we can get a 
65c0: 75 6e 69 71 75 65 20 49 44 20 66 6f 72 20 61 20  unique ID for a 
65d0: 66 69 6c 65 20 62 79 20 63 6f 6e 63 61 74 65 6e  file by concaten
65e0: 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20 64 65 76  ating.** the dev
65f0: 69 63 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74  ice number and t
6600: 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e  he inode number.
6610: 20 20 42 75 74 20 74 68 69 73 20 64 6f 65 73 20    But this does 
6620: 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f  not work on VxWo
6630: 72 6b 73 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72  rks..** On VxWor
6640: 6b 73 2c 20 61 20 75 6e 69 71 75 65 20 66 69 6c  ks, a unique fil
6650: 65 20 69 64 20 6d 75 73 74 20 62 65 20 62 61 73  e id must be bas
6660: 65 64 20 6f 6e 20 74 68 65 20 63 61 6e 6f 6e 69  ed on the canoni
6670: 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a  cal filename..**
6680: 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f  .** A pointer to
6690: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
66a0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
66b0: 72 75 63 74 75 72 65 20 63 61 6e 20 62 65 20 75  ructure can be u
66c0: 73 65 64 20 61 73 20 61 0a 2a 2a 20 75 6e 69 71  sed as a.** uniq
66d0: 75 65 20 66 69 6c 65 20 49 44 20 69 6e 20 56 78  ue file ID in Vx
66e0: 57 6f 72 6b 73 2e 20 20 45 61 63 68 20 69 6e 73  Works.  Each ins
66f0: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
6700: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
6710: 0a 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20 74 68  .** a copy of th
6720: 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65  e canonical file
6730: 6e 61 6d 65 2e 20 20 54 68 65 72 65 20 69 73 20  name.  There is 
6740: 61 6c 73 6f 20 61 20 72 65 66 65 72 65 6e 63 65  also a reference
6750: 20 63 6f 75 6e 74 2e 20 20 0a 2a 2a 20 54 68 65   count.  .** The
6760: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 72 65   structure is re
6770: 63 6c 61 69 6d 65 64 20 77 68 65 6e 20 74 68 65  claimed when the
6780: 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74   number of point
6790: 65 72 73 20 74 6f 20 69 74 20 64 72 6f 70 73 20  ers to it drops 
67a0: 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a  to.** zero..**.*
67b0: 2a 20 54 68 65 72 65 20 61 72 65 20 6e 65 76 65  * There are neve
67c0: 72 20 76 65 72 79 20 6d 61 6e 79 20 66 69 6c 65  r very many file
67d0: 73 20 6f 70 65 6e 20 61 74 20 6f 6e 65 20 74 69  s open at one ti
67e0: 6d 65 20 61 6e 64 20 6c 6f 6f 6b 75 70 73 20 61  me and lookups a
67f0: 72 65 20 6e 6f 74 0a 2a 2a 20 61 20 70 65 72 66  re not.** a perf
6800: 6f 72 6d 61 6e 63 65 2d 63 72 69 74 69 63 61 6c  ormance-critical
6810: 20 70 61 74 68 2c 20 73 6f 20 69 74 20 69 73 20   path, so it is 
6820: 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20 70 75  sufficient to pu
6830: 74 20 74 68 65 73 65 0a 2a 2a 20 73 74 72 75 63  t these.** struc
6840: 74 75 72 65 73 20 6f 6e 20 61 20 6c 69 6e 6b 65  tures on a linke
6850: 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63  d list..*/.struc
6860: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
6870: 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  {.  struct vxwor
6880: 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 78 74 3b  ksFileId *pNext;
6890: 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 61 20 6c    /* Next in a l
68a0: 69 73 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20  ist of them all 
68b0: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
68c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68d0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
68e0: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
68f0: 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  is one */.  int 
6900: 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  nName;          
6910: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
6920: 67 74 68 20 6f 66 20 74 68 65 20 7a 43 61 6e 6f  gth of the zCano
6930: 6e 69 63 61 6c 4e 61 6d 65 5b 5d 20 73 74 72 69  nicalName[] stri
6940: 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43  ng */.  char *zC
6950: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 3b 20 20 20  anonicalName;   
6960: 20 20 20 20 20 20 2f 2a 20 43 61 6e 6f 6e 69 63        /* Canonic
6970: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d  al filename */.}
6980: 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  ;..#if OS_VXWORK
6990: 53 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69  S./* .** All uni
69a0: 71 75 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72  que filenames ar
69b0: 65 20 68 65 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b  e held on a link
69c0: 65 64 20 6c 69 73 74 20 68 65 61 64 65 64 20 62  ed list headed b
69d0: 79 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 62  y this.** variab
69e0: 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  le:.*/.static st
69f0: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
6a00: 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6c 65 4c  Id *vxworksFileL
6a10: 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ist = 0;../*.** 
6a20: 53 69 6d 70 6c 69 66 79 20 61 20 66 69 6c 65 6e  Simplify a filen
6a30: 61 6d 65 20 69 6e 74 6f 20 69 74 73 20 63 61 6e  ame into its can
6a40: 6f 6e 69 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62  onical form.** b
6a50: 79 20 6d 61 6b 69 6e 67 20 74 68 65 20 66 6f 6c  y making the fol
6a60: 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73 3a 0a  lowing changes:.
6a70: 2a 2a 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76 69 6e  **.**  * removin
6a80: 67 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 61  g any trailing a
6a90: 6e 64 20 64 75 70 6c 69 63 61 74 65 20 2f 0a 2a  nd duplicate /.*
6aa0: 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 2e 2f  *  * convert /./
6ab0: 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20   into just /.** 
6ac0: 20 2a 20 63 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e   * convert /A/..
6ad0: 2f 20 77 68 65 72 65 20 41 20 69 73 20 61 6e 79  / where A is any
6ae0: 20 73 69 6d 70 6c 65 20 6e 61 6d 65 20 69 6e 74   simple name int
6af0: 6f 20 6a 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43  o just /.**.** C
6b00: 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
6b10: 69 6e 2d 70 6c 61 63 65 2e 20 20 52 65 74 75 72  in-place.  Retur
6b20: 6e 20 74 68 65 20 6e 65 77 20 6e 61 6d 65 20 6c  n the new name l
6b30: 65 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ength..**.** The
6b40: 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61   original filena
6b50: 6d 65 20 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d  me is in z[0..n-
6b60: 31 5d 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  1].  Return the 
6b70: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 68 61  number of.** cha
6b80: 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 73  racters in the s
6b90: 69 6d 70 6c 69 66 69 65 64 20 6e 61 6d 65 2e 0a  implified name..
6ba0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 78  */.static int vx
6bb0: 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d  worksSimplifyNam
6bc0: 65 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  e(char *z, int n
6bd0: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
6be0: 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a   while( n>1 && z
6bf0: 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d  [n-1]=='/' ){ n-
6c00: 2d 3b 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  -; }.  for(i=j=0
6c10: 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
6c20: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29   if( z[i]=='/' )
6c30: 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b  {.      if( z[i+
6c40: 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e  1]=='/' ) contin
6c50: 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b  ue;.      if( z[
6c60: 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 32  i+1]=='.' && i+2
6c70: 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f  <n && z[i+2]=='/
6c80: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2b  ' ){.        i +
6c90: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  = 1;.        con
6ca0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
6cb0: 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d       if( z[i+1]=
6cc0: 3d 27 2e 27 20 26 26 20 69 2b 33 3c 6e 20 26 26  ='.' && i+3<n &&
6cd0: 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20   z[i+2]=='.' && 
6ce0: 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20  z[i+3]=='/' ){. 
6cf0: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e         while( j>
6d00: 30 20 26 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27  0 && z[j-1]!='/'
6d10: 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20   ){ j--; }.     
6d20: 20 20 20 69 66 28 20 6a 3e 30 20 29 7b 20 6a 2d     if( j>0 ){ j-
6d30: 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 20 2b  -; }.        i +
6d40: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  = 2;.        con
6d50: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
6d60: 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20     }.    z[j++] 
6d70: 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b  = z[i];.  }.  z[
6d80: 6a 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  j] = 0;.  return
6d90: 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e   j;.}../*.** Fin
6da0: 64 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20  d a unique file 
6db0: 49 44 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  ID for the given
6dc0: 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 6e 61   absolute pathna
6dd0: 6d 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61  me.  Return.** a
6de0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
6df0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62  vxworksFileId ob
6e00: 6a 65 63 74 2e 20 20 54 68 69 73 20 70 6f 69 6e  ject.  This poin
6e10: 74 65 72 20 69 73 20 74 68 65 20 75 6e 69 71 75  ter is the uniqu
6e20: 65 0a 2a 2a 20 66 69 6c 65 20 49 44 2e 0a 2a 2a  e.** file ID..**
6e30: 0a 2a 2a 20 54 68 65 20 6e 52 65 66 20 66 69 65  .** The nRef fie
6e40: 6c 64 20 6f 66 20 74 68 65 20 76 78 77 6f 72 6b  ld of the vxwork
6e50: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69  sFileId object i
6e60: 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 65  s incremented be
6e70: 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65  fore.** the obje
6e80: 63 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ct is returned. 
6e90: 20 41 20 6e 65 77 20 76 78 77 6f 72 6b 73 46 69   A new vxworksFi
6ea0: 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20 63  leId object is c
6eb0: 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 61 64  reated.** and ad
6ec0: 64 65 64 20 74 6f 20 74 68 65 20 67 6c 6f 62 61  ded to the globa
6ed0: 6c 20 6c 69 73 74 20 69 66 20 6e 65 63 65 73 73  l list if necess
6ee0: 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ary..**.** If a 
6ef0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
6f00: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
6f10: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
6f20: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 76 78  static struct vx
6f30: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77  worksFileId *vxw
6f40: 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 63  orksFindFileId(c
6f50: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 62 73 6f  onst char *zAbso
6f60: 6c 75 74 65 4e 61 6d 65 29 7b 0a 20 20 73 74 72  luteName){.  str
6f70: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
6f80: 64 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  d *pNew;        
6f90: 20 2f 2a 20 73 65 61 72 63 68 20 6b 65 79 20 61   /* search key a
6fa0: 6e 64 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a  nd new file ID *
6fb0: 2f 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  /.  struct vxwor
6fc0: 6b 73 46 69 6c 65 49 64 20 2a 70 43 61 6e 64 69  ksFileId *pCandi
6fd0: 64 61 74 65 3b 20 20 20 2f 2a 20 46 6f 72 20 6c  date;   /* For l
6fe0: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 69 73  ooping over exis
6ff0: 74 69 6e 67 20 66 69 6c 65 20 49 44 73 20 2a 2f  ting file IDs */
7000: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
7010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7020: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
7030: 20 6f 66 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d   of zAbsoluteNam
7040: 65 20 73 74 72 69 6e 67 20 2a 2f 0a 0a 20 20 61  e string */..  a
7050: 73 73 65 72 74 28 20 7a 41 62 73 6f 6c 75 74 65  ssert( zAbsolute
7060: 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a  Name[0]=='/' );.
7070: 20 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65    n = (int)strle
7080: 6e 28 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29  n(zAbsoluteName)
7090: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
70a0: 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a  e3_malloc64( siz
70b0: 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20 28 6e 2b  eof(*pNew) + (n+
70c0: 31 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  1) );.  if( pNew
70d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
70e0: 20 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63    pNew->zCanonic
70f0: 61 6c 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  alName = (char*)
7100: 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63  &pNew[1];.  memc
7110: 70 79 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69  py(pNew->zCanoni
7120: 63 61 6c 4e 61 6d 65 2c 20 7a 41 62 73 6f 6c 75  calName, zAbsolu
7130: 74 65 4e 61 6d 65 2c 20 6e 2b 31 29 3b 0a 20 20  teName, n+1);.  
7140: 6e 20 3d 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c  n = vxworksSimpl
7150: 69 66 79 4e 61 6d 65 28 70 4e 65 77 2d 3e 7a 43  ifyName(pNew->zC
7160: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29  anonicalName, n)
7170: 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66  ;..  /* Search f
7180: 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65  or an existing e
7190: 6e 74 72 79 20 74 68 61 74 20 6d 61 74 63 68 69  ntry that matchi
71a0: 6e 67 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c  ng the canonical
71b0: 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 49 66 20 66   name..  ** If f
71c0: 6f 75 6e 64 2c 20 69 6e 63 72 65 6d 65 6e 74 20  ound, increment 
71d0: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
71e0: 75 6e 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61  unt and return a
71f0: 20 70 6f 69 6e 74 65 72 20 74 6f 0a 20 20 2a 2a   pointer to.  **
7200: 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 66 69   the existing fi
7210: 6c 65 20 49 44 2e 0a 20 20 2a 2f 0a 20 20 75 6e  le ID..  */.  un
7220: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
7230: 20 20 66 6f 72 28 70 43 61 6e 64 69 64 61 74 65    for(pCandidate
7240: 3d 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74  =vxworksFileList
7250: 3b 20 70 43 61 6e 64 69 64 61 74 65 3b 20 70 43  ; pCandidate; pC
7260: 61 6e 64 69 64 61 74 65 3d 70 43 61 6e 64 69 64  andidate=pCandid
7270: 61 74 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ate->pNext){.   
7280: 20 69 66 28 20 70 43 61 6e 64 69 64 61 74 65 2d   if( pCandidate-
7290: 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a 20 20 20 20 20  >nName==n .     
72a0: 26 26 20 6d 65 6d 63 6d 70 28 70 43 61 6e 64 69  && memcmp(pCandi
72b0: 64 61 74 65 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  date->zCanonical
72c0: 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 43 61 6e  Name, pNew->zCan
72d0: 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3d 3d  onicalName, n)==
72e0: 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20  0.    ){.       
72f0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
7300: 77 29 3b 0a 20 20 20 20 20 20 20 70 43 61 6e 64  w);.       pCand
7310: 69 64 61 74 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  idate->nRef++;. 
7320: 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d        unixLeaveM
7330: 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 20 72  utex();.       r
7340: 65 74 75 72 6e 20 70 43 61 6e 64 69 64 61 74 65  eturn pCandidate
7350: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
7360: 2a 20 4e 6f 20 6d 61 74 63 68 20 77 61 73 20 66  * No match was f
7370: 6f 75 6e 64 2e 20 20 57 65 20 77 69 6c 6c 20 6d  ound.  We will m
7380: 61 6b 65 20 61 20 6e 65 77 20 66 69 6c 65 20 49  ake a new file I
7390: 44 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e 6e 52 65  D */.  pNew->nRe
73a0: 66 20 3d 20 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e  f = 1;.  pNew->n
73b0: 4e 61 6d 65 20 3d 20 6e 3b 0a 20 20 70 4e 65 77  Name = n;.  pNew
73c0: 2d 3e 70 4e 65 78 74 20 3d 20 76 78 77 6f 72 6b  ->pNext = vxwork
73d0: 73 46 69 6c 65 4c 69 73 74 3b 0a 20 20 76 78 77  sFileList;.  vxw
73e0: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 70  orksFileList = p
73f0: 4e 65 77 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65  New;.  unixLeave
7400: 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72  Mutex();.  retur
7410: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
7420: 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Decrement the r
7430: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f  eference count o
7440: 6e 20 61 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  n a vxworksFileI
7450: 64 20 6f 62 6a 65 63 74 2e 20 20 46 72 65 65 0a  d object.  Free.
7460: 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74 20 77 68  ** the object wh
7470: 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  en the reference
7480: 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a   count reaches z
7490: 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ero..*/.static v
74a0: 6f 69 64 20 76 78 77 6f 72 6b 73 52 65 6c 65 61  oid vxworksRelea
74b0: 73 65 46 69 6c 65 49 64 28 73 74 72 75 63 74 20  seFileId(struct 
74c0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
74d0: 49 64 29 7b 0a 20 20 75 6e 69 78 45 6e 74 65 72  Id){.  unixEnter
74e0: 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72  Mutex();.  asser
74f0: 74 28 20 70 49 64 2d 3e 6e 52 65 66 3e 30 20 29  t( pId->nRef>0 )
7500: 3b 0a 20 20 70 49 64 2d 3e 6e 52 65 66 2d 2d 3b  ;.  pId->nRef--;
7510: 0a 20 20 69 66 28 20 70 49 64 2d 3e 6e 52 65 66  .  if( pId->nRef
7520: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ==0 ){.    struc
7530: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
7540: 2a 2a 70 70 3b 0a 20 20 20 20 66 6f 72 28 70 70  **pp;.    for(pp
7550: 3d 26 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73  =&vxworksFileLis
7560: 74 3b 20 2a 70 70 20 26 26 20 2a 70 70 21 3d 70  t; *pp && *pp!=p
7570: 49 64 3b 20 70 70 20 3d 20 26 28 28 2a 70 70 29  Id; pp = &((*pp)
7580: 2d 3e 70 4e 65 78 74 29 29 7b 7d 0a 20 20 20 20  ->pNext)){}.    
7590: 61 73 73 65 72 74 28 20 2a 70 70 3d 3d 70 49 64  assert( *pp==pId
75a0: 20 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 49   );.    *pp = pI
75b0: 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71  d->pNext;.    sq
75c0: 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 29 3b  lite3_free(pId);
75d0: 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65  .  }.  unixLeave
75e0: 4d 75 74 65 78 28 29 3b 0a 7d 0a 23 65 6e 64 69  Mutex();.}.#endi
75f0: 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20  f /* OS_VXWORKS 
7600: 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */./************
7610: 2a 2a 2a 20 45 6e 64 20 6f 66 20 55 6e 69 71 75  *** End of Uniqu
7620: 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74  e File ID Utilit
7630: 79 20 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b  y Used By VxWork
7640: 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
7650: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
7660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
76a0: 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */.../**********
76b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
76c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
76d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
76e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
76f0: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
7700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7710: 20 50 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20   Posix Advisory 
7720: 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
7730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7740: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58  ****.**.** POSIX
7750: 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20   advisory locks 
7760: 61 72 65 20 62 72 6f 6b 65 6e 20 62 79 20 64 65  are broken by de
7770: 73 69 67 6e 2e 20 20 41 4e 53 49 20 53 54 44 20  sign.  ANSI STD 
7780: 31 30 30 33 2e 31 20 28 31 39 39 36 29 0a 2a 2a  1003.1 (1996).**
7790: 20 73 65 63 74 69 6f 6e 20 36 2e 35 2e 32 2e 32   section 6.5.2.2
77a0: 20 6c 69 6e 65 73 20 34 38 33 20 74 68 72 6f 75   lines 483 throu
77b0: 67 68 20 34 39 30 20 73 70 65 63 69 66 79 20 74  gh 490 specify t
77c0: 68 61 74 20 77 68 65 6e 20 61 20 70 72 6f 63 65  hat when a proce
77d0: 73 73 0a 2a 2a 20 73 65 74 73 20 6f 72 20 63 6c  ss.** sets or cl
77e0: 65 61 72 73 20 61 20 6c 6f 63 6b 2c 20 74 68 61  ears a lock, tha
77f0: 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 76 65 72  t operation over
7800: 72 69 64 65 73 20 61 6e 79 20 70 72 69 6f 72 20  rides any prior 
7810: 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a 20 62 79 20  locks set.** by 
7820: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
7830: 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 65  .  It does not e
7840: 78 70 6c 69 63 69 74 6c 79 20 73 61 79 20 73 6f  xplicitly say so
7850: 2c 20 62 75 74 20 74 68 69 73 20 69 6d 70 6c 69  , but this impli
7860: 65 73 0a 2a 2a 20 74 68 61 74 20 69 74 20 6f 76  es.** that it ov
7870: 65 72 72 69 64 65 73 20 6c 6f 63 6b 73 20 73 65  errides locks se
7880: 74 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 72  t by the same pr
7890: 6f 63 65 73 73 20 75 73 69 6e 67 20 61 20 64 69  ocess using a di
78a0: 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20  fferent.** file 
78b0: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43 6f 6e  descriptor.  Con
78c0: 73 69 64 65 72 20 74 68 69 73 20 74 65 73 74 20  sider this test 
78d0: 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  case:.**.**     
78e0: 20 20 69 6e 74 20 66 64 31 20 3d 20 6f 70 65 6e    int fd1 = open
78f0: 28 22 2e 2f 66 69 6c 65 31 22 2c 20 4f 5f 52 44  ("./file1", O_RD
7900: 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34  WR|O_CREAT, 0644
7910: 29 3b 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20  );.**       int 
7920: 66 64 32 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69  fd2 = open("./fi
7930: 6c 65 32 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43  le2", O_RDWR|O_C
7940: 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a  REAT, 0644);.**.
7950: 2a 2a 20 53 75 70 70 6f 73 65 20 2e 2f 66 69 6c  ** Suppose ./fil
7960: 65 31 20 61 6e 64 20 2e 2f 66 69 6c 65 32 20 61  e1 and ./file2 a
7970: 72 65 20 72 65 61 6c 6c 79 20 74 68 65 20 73 61  re really the sa
7980: 6d 65 20 66 69 6c 65 20 28 62 65 63 61 75 73 65  me file (because
7990: 0a 2a 2a 20 6f 6e 65 20 69 73 20 61 20 68 61 72  .** one is a har
79a0: 64 20 6f 72 20 73 79 6d 62 6f 6c 69 63 20 6c 69  d or symbolic li
79b0: 6e 6b 20 74 6f 20 74 68 65 20 6f 74 68 65 72 29  nk to the other)
79c0: 20 74 68 65 6e 20 69 66 20 79 6f 75 20 73 65 74   then if you set
79d0: 0a 2a 2a 20 61 6e 20 65 78 63 6c 75 73 69 76 65  .** an exclusive
79e0: 20 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c 20 74 68   lock on fd1, th
79f0: 65 6e 20 74 72 79 20 74 6f 20 67 65 74 20 61 6e  en try to get an
7a00: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a   exclusive lock.
7a10: 2a 2a 20 6f 6e 20 66 64 32 2c 20 69 74 20 77 6f  ** on fd2, it wo
7a20: 72 6b 73 2e 20 20 49 20 77 6f 75 6c 64 20 68 61  rks.  I would ha
7a30: 76 65 20 65 78 70 65 63 74 65 64 20 74 68 65 20  ve expected the 
7a40: 73 65 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a  second lock to.*
7a50: 2a 20 66 61 69 6c 20 73 69 6e 63 65 20 74 68 65  * fail since the
7a60: 72 65 20 77 61 73 20 61 6c 72 65 61 64 79 20 61  re was already a
7a70: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
7a80: 65 20 64 75 65 20 74 6f 20 66 64 31 2e 0a 2a 2a  e due to fd1..**
7a90: 20 42 75 74 20 6e 6f 74 20 73 6f 2e 20 20 53 69   But not so.  Si
7aa0: 6e 63 65 20 62 6f 74 68 20 6c 6f 63 6b 73 20 63  nce both locks c
7ab0: 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 73 61 6d  ame from the sam
7ac0: 65 20 70 72 6f 63 65 73 73 2c 20 74 68 65 0a 2a  e process, the.*
7ad0: 2a 20 73 65 63 6f 6e 64 20 6f 76 65 72 72 69 64  * second overrid
7ae0: 65 73 20 74 68 65 20 66 69 72 73 74 2c 20 65 76  es the first, ev
7af0: 65 6e 20 74 68 6f 75 67 68 20 74 68 65 79 20 77  en though they w
7b00: 65 72 65 20 6f 6e 20 64 69 66 66 65 72 65 6e 74  ere on different
7b10: 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70  .** file descrip
7b20: 74 6f 72 73 20 6f 70 65 6e 65 64 20 6f 6e 20 64  tors opened on d
7b30: 69 66 66 65 72 65 6e 74 20 66 69 6c 65 20 6e 61  ifferent file na
7b40: 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  mes..**.** This 
7b50: 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 63 61  means that we ca
7b60: 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49 58 20 6c  nnot use POSIX l
7b70: 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68 72 6f 6e  ocks to synchron
7b80: 69 7a 65 20 66 69 6c 65 20 61 63 63 65 73 73 0a  ize file access.
7b90: 2a 2a 20 61 6d 6f 6e 67 20 63 6f 6d 70 65 74 69  ** among competi
7ba0: 6e 67 20 74 68 72 65 61 64 73 20 6f 66 20 74 68  ng threads of th
7bb0: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20  e same process. 
7bc0: 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 77 69 6c   POSIX locks wil
7bd0: 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20 74  l work fine.** t
7be0: 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 61 63  o synchronize ac
7bf0: 63 65 73 73 20 66 6f 72 20 74 68 72 65 61 64 73  cess for threads
7c00: 20 69 6e 20 73 65 70 61 72 61 74 65 20 70 72 6f   in separate pro
7c10: 63 65 73 73 65 73 2c 20 62 75 74 20 6e 6f 74 0a  cesses, but not.
7c20: 2a 2a 20 74 68 72 65 61 64 73 20 77 69 74 68 69  ** threads withi
7c30: 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  n the same proce
7c40: 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72  ss..**.** To wor
7c50: 6b 20 61 72 6f 75 6e 64 20 74 68 65 20 70 72 6f  k around the pro
7c60: 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20 68 61 73  blem, SQLite has
7c70: 20 74 6f 20 6d 61 6e 61 67 65 20 66 69 6c 65 20   to manage file 
7c80: 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61 6c 6c 79  locks internally
7c90: 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77 6e 2e 20  .** on its own. 
7ca0: 20 57 68 65 6e 65 76 65 72 20 61 20 6e 65 77 20   Whenever a new 
7cb0: 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
7cc0: 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20 66  ed, we have to f
7cd0: 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70 65 63 69  ind the.** speci
7ce0: 66 69 63 20 69 6e 6f 64 65 20 6f 66 20 74 68 65  fic inode of the
7cf0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
7d00: 74 68 65 20 69 6e 6f 64 65 20 69 73 20 64 65 74  the inode is det
7d10: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 0a 2a  ermined by the.*
7d20: 2a 20 73 74 5f 64 65 76 20 61 6e 64 20 73 74 5f  * st_dev and st_
7d30: 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68  ino fields of th
7d40: 65 20 73 74 61 74 20 73 74 72 75 63 74 75 72 65  e stat structure
7d50: 20 74 68 61 74 20 66 73 74 61 74 28 29 20 66 69   that fstat() fi
7d60: 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e 64 20 63  lls in).** and c
7d70: 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b 73 20 61  heck for locks a
7d80: 6c 72 65 61 64 79 20 65 78 69 73 74 69 6e 67 20  lready existing 
7d90: 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65 2e 20 20  on that inode.  
7da0: 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72 65 0a 2a  When locks are.*
7db0: 2a 20 63 72 65 61 74 65 64 20 6f 72 20 72 65 6d  * created or rem
7dc0: 6f 76 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f  oved, we have to
7dd0: 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20 6f 77 6e   look at our own
7de0: 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64   internal record
7df0: 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73   of the.** locks
7e00: 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68   to see if anoth
7e10: 65 72 20 74 68 72 65 61 64 20 68 61 73 20 70 72  er thread has pr
7e20: 65 76 69 6f 75 73 6c 79 20 73 65 74 20 61 20 6c  eviously set a l
7e30: 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73 61 6d 65  ock on that same
7e40: 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a  .** inode..**.**
7e50: 20 28 41 73 69 64 65 3a 20 54 68 65 20 75 73 65   (Aside: The use
7e60: 20 6f 66 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72   of inode number
7e70: 73 20 61 73 20 75 6e 69 71 75 65 20 49 44 73 20  s as unique IDs 
7e80: 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e  does not work on
7e90: 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 46 6f 72   VxWorks..** For
7ea0: 20 56 78 57 6f 72 6b 73 2c 20 77 65 20 68 61 76   VxWorks, we hav
7eb0: 65 20 74 6f 20 75 73 65 20 74 68 65 20 61 6c 74  e to use the alt
7ec0: 65 72 6e 61 74 69 76 65 20 75 6e 69 71 75 65 20  ernative unique 
7ed0: 49 44 20 73 79 73 74 65 6d 20 62 61 73 65 64 20  ID system based 
7ee0: 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e 69 63 61 6c 20  on.** canonical 
7ef0: 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6d 70  filename and imp
7f00: 6c 65 6d 65 6e 74 65 64 20 69 6e 20 74 68 65 20  lemented in the 
7f10: 70 72 65 76 69 6f 75 73 20 64 69 76 69 73 69 6f  previous divisio
7f20: 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71  n.).**.** The sq
7f30: 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63  lite3_file struc
7f40: 74 75 72 65 20 66 6f 72 20 50 4f 53 49 58 20 69  ture for POSIX i
7f50: 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6a 75 73 74  s no longer just
7f60: 20 61 6e 20 69 6e 74 65 67 65 72 20 66 69 6c 65   an integer file
7f70: 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 2e 20  .** descriptor. 
7f80: 20 49 74 20 69 73 20 6e 6f 77 20 61 20 73 74 72   It is now a str
7f90: 75 63 74 75 72 65 20 74 68 61 74 20 68 6f 6c 64  ucture that hold
7fa0: 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 66 69  s the integer fi
7fb0: 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72  le.** descriptor
7fc0: 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74   and a pointer t
7fd0: 6f 20 61 20 73 74 72 75 63 74 75 72 65 20 74 68  o a structure th
7fe0: 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
7ff0: 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63   internal.** loc
8000: 6b 73 20 6f 6e 20 74 68 65 20 63 6f 72 72 65 73  ks on the corres
8010: 70 6f 6e 64 69 6e 67 20 69 6e 6f 64 65 2e 20 20  ponding inode.  
8020: 54 68 65 72 65 20 69 73 20 6f 6e 65 20 6c 6f 63  There is one loc
8030: 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 0a 2a  king structure.*
8040: 2a 20 70 65 72 20 69 6e 6f 64 65 2c 20 73 6f 20  * per inode, so 
8050: 69 66 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64  if the same inod
8060: 65 20 69 73 20 6f 70 65 6e 65 64 20 74 77 69 63  e is opened twic
8070: 65 2c 20 62 6f 74 68 20 75 6e 69 78 46 69 6c 65  e, both unixFile
8080: 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 70   structures.** p
8090: 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 61 6d 65  oint to the same
80a0: 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75   locking structu
80b0: 72 65 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  re.  The locking
80c0: 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73   structure keeps
80d0: 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20  .** a reference 
80e0: 63 6f 75 6e 74 20 28 73 6f 20 77 65 20 77 69 6c  count (so we wil
80f0: 6c 20 6b 6e 6f 77 20 77 68 65 6e 20 74 6f 20 64  l know when to d
8100: 65 6c 65 74 65 20 69 74 29 20 61 6e 64 20 61 20  elete it) and a 
8110: 22 63 6e 74 22 0a 2a 2a 20 66 69 65 6c 64 20 74  "cnt".** field t
8120: 68 61 74 20 74 65 6c 6c 73 20 75 73 20 69 74 73  hat tells us its
8130: 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73   internal lock s
8140: 74 61 74 75 73 2e 20 20 63 6e 74 3d 3d 30 20 6d  tatus.  cnt==0 m
8150: 65 61 6e 73 20 74 68 65 0a 2a 2a 20 66 69 6c 65  eans the.** file
8160: 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 63   is unlocked.  c
8170: 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73 20 74 68 65  nt==-1 means the
8180: 20 66 69 6c 65 20 68 61 73 20 61 6e 20 65 78 63   file has an exc
8190: 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a 2a 20  lusive lock..** 
81a0: 63 6e 74 3e 30 20 6d 65 61 6e 73 20 74 68 65 72  cnt>0 means ther
81b0: 65 20 61 72 65 20 63 6e 74 20 73 68 61 72 65 64  e are cnt shared
81c0: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66 69   locks on the fi
81d0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 61 74  le..**.** Any at
81e0: 74 65 6d 70 74 20 74 6f 20 6c 6f 63 6b 20 6f 72  tempt to lock or
81f0: 20 75 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 66   unlock a file f
8200: 69 72 73 74 20 63 68 65 63 6b 73 20 74 68 65 20  irst checks the 
8210: 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 75 63  locking.** struc
8220: 74 75 72 65 2e 20 20 54 68 65 20 66 63 6e 74 6c  ture.  The fcntl
8230: 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 69  () system call i
8240: 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 74  s only invoked t
8250: 6f 20 73 65 74 20 61 20 0a 2a 2a 20 50 4f 53 49  o set a .** POSI
8260: 58 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 69 6e  X lock if the in
8270: 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 72 75  ternal lock stru
8280: 63 74 75 72 65 20 74 72 61 6e 73 69 74 69 6f 6e  cture transition
8290: 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 61 20 6c  s between.** a l
82a0: 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20 75 6e 6c  ocked and an unl
82b0: 6f 63 6b 65 64 20 73 74 61 74 65 2e 0a 2a 2a 0a  ocked state..**.
82c0: 2a 2a 20 42 75 74 20 77 61 69 74 3a 20 20 74 68  ** But wait:  th
82d0: 65 72 65 20 61 72 65 20 79 65 74 20 6d 6f 72 65  ere are yet more
82e0: 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 50   problems with P
82f0: 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f  OSIX advisory lo
8300: 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f  cks..**.** If yo
8310: 75 20 63 6c 6f 73 65 20 61 20 66 69 6c 65 20 64  u close a file d
8320: 65 73 63 72 69 70 74 6f 72 20 74 68 61 74 20 70  escriptor that p
8330: 6f 69 6e 74 73 20 74 6f 20 61 20 66 69 6c 65 20  oints to a file 
8340: 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 73 2c 0a  that has locks,.
8350: 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20  ** all locks on 
8360: 74 68 61 74 20 66 69 6c 65 20 74 68 61 74 20 61  that file that a
8370: 72 65 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20  re owned by the 
8380: 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20  current process 
8390: 61 72 65 0a 2a 2a 20 72 65 6c 65 61 73 65 64 2e  are.** released.
83a0: 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64    To work around
83b0: 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 2c 20 65   this problem, e
83c0: 61 63 68 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ach unixInodeInf
83d0: 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 6d 61 69 6e  o object.** main
83e0: 74 61 69 6e 73 20 61 20 63 6f 75 6e 74 20 6f 66  tains a count of
83f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
8400: 65 6e 64 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20  ending locks on 
8410: 74 68 61 20 69 6e 6f 64 65 2e 0a 2a 2a 20 57 68  tha inode..** Wh
8420: 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  en an attempt is
8430: 20 6d 61 64 65 20 74 6f 20 63 6c 6f 73 65 20 61   made to close a
8440: 6e 20 75 6e 69 78 46 69 6c 65 2c 20 69 66 20 74  n unixFile, if t
8450: 68 65 72 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65  here are.** othe
8460: 72 20 75 6e 69 78 46 69 6c 65 20 6f 70 65 6e 20  r unixFile open 
8470: 6f 6e 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64  on the same inod
8480: 65 20 74 68 61 74 20 61 72 65 20 68 6f 6c 64 69  e that are holdi
8490: 6e 67 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63 61  ng locks, the ca
84a0: 6c 6c 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65 28 29  ll.** to close()
84b0: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
84c0: 70 74 6f 72 20 69 73 20 64 65 66 65 72 72 65 64  ptor is deferred
84d0: 20 75 6e 74 69 6c 20 61 6c 6c 20 6f 66 20 74 68   until all of th
84e0: 65 20 6c 6f 63 6b 73 20 63 6c 65 61 72 2e 0a 2a  e locks clear..*
84f0: 2a 20 54 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  * The unixInodeI
8500: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 6b 65  nfo structure ke
8510: 65 70 73 20 61 20 6c 69 73 74 20 6f 66 20 66 69  eps a list of fi
8520: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 74  le descriptors t
8530: 68 61 74 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 62  hat need to.** b
8540: 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 74 68 61  e closed and tha
8550: 74 20 6c 69 73 74 20 69 73 20 77 61 6c 6b 65 64  t list is walked
8560: 20 28 61 6e 64 20 63 6c 65 61 72 65 64 29 20 77   (and cleared) w
8570: 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63  hen the last loc
8580: 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a  k.** clears..**.
8590: 2a 2a 20 59 65 74 20 61 6e 6f 74 68 65 72 20 70  ** Yet another p
85a0: 72 6f 62 6c 65 6d 3a 20 20 4c 69 6e 75 78 54 68  roblem:  LinuxTh
85b0: 72 65 61 64 73 20 64 6f 20 6e 6f 74 20 70 6c 61  reads do not pla
85c0: 79 20 77 65 6c 6c 20 77 69 74 68 20 70 6f 73 69  y well with posi
85d0: 78 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d  x locks..**.** M
85e0: 61 6e 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f  any older versio
85f0: 6e 73 20 6f 66 20 6c 69 6e 75 78 20 75 73 65 20  ns of linux use 
8600: 74 68 65 20 4c 69 6e 75 78 54 68 72 65 61 64 73  the LinuxThreads
8610: 20 6c 69 62 72 61 72 79 20 77 68 69 63 68 20 69   library which i
8620: 73 0a 2a 2a 20 6e 6f 74 20 70 6f 73 69 78 20 63  s.** not posix c
8630: 6f 6d 70 6c 69 61 6e 74 2e 20 20 55 6e 64 65 72  ompliant.  Under
8640: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2c 20 61   LinuxThreads, a
8650: 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79   lock created by
8660: 20 74 68 72 65 61 64 0a 2a 2a 20 41 20 63 61 6e   thread.** A can
8670: 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20  not be modified 
8680: 6f 72 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79  or overridden by
8690: 20 61 20 64 69 66 66 65 72 65 6e 74 20 74 68 72   a different thr
86a0: 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 6c 79 20 74  ead B..** Only t
86b0: 68 72 65 61 64 20 41 20 63 61 6e 20 6d 6f 64 69  hread A can modi
86c0: 66 79 20 74 68 65 20 6c 6f 63 6b 2e 20 20 4c 6f  fy the lock.  Lo
86d0: 63 6b 69 6e 67 20 62 65 68 61 76 69 6f 72 20 69  cking behavior i
86e0: 73 20 63 6f 72 72 65 63 74 0a 2a 2a 20 69 66 20  s correct.** if 
86f0: 74 68 65 20 61 70 70 6c 69 61 74 69 6f 6e 20 75  the appliation u
8700: 73 65 73 20 74 68 65 20 6e 65 77 65 72 20 4e 61  ses the newer Na
8710: 74 69 76 65 20 50 6f 73 69 78 20 54 68 72 65 61  tive Posix Threa
8720: 64 20 4c 69 62 72 61 72 79 20 28 4e 50 54 4c 29  d Library (NPTL)
8730: 0a 2a 2a 20 6f 6e 20 6c 69 6e 75 78 20 2d 20 77  .** on linux - w
8740: 69 74 68 20 4e 50 54 4c 20 61 20 6c 6f 63 6b 20  ith NPTL a lock 
8750: 63 72 65 61 74 65 64 20 62 79 20 74 68 72 65 61  created by threa
8760: 64 20 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65  d A can override
8770: 20 6c 6f 63 6b 73 0a 2a 2a 20 69 6e 20 74 68 72   locks.** in thr
8780: 65 61 64 20 42 2e 20 20 42 75 74 20 74 68 65 72  ead B.  But ther
8790: 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b  e is no way to k
87a0: 6e 6f 77 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  now at compile-t
87b0: 69 6d 65 20 77 68 69 63 68 0a 2a 2a 20 74 68 72  ime which.** thr
87c0: 65 61 64 69 6e 67 20 6c 69 62 72 61 72 79 20 69  eading library i
87d0: 73 20 62 65 69 6e 67 20 75 73 65 64 2e 20 20 53  s being used.  S
87e0: 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61  o there is no wa
87f0: 79 20 74 6f 20 6b 6e 6f 77 20 61 74 0a 2a 2a 20  y to know at.** 
8800: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65  compile-time whe
8810: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65  ther or not thre
8820: 61 64 20 41 20 63 61 6e 20 6f 76 65 72 72 69 64  ad A can overrid
8830: 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 72 65 61  e locks on threa
8840: 64 20 42 2e 0a 2a 2a 20 4f 6e 65 20 68 61 73 20  d B..** One has 
8850: 74 6f 20 64 6f 20 61 20 72 75 6e 2d 74 69 6d 65  to do a run-time
8860: 20 63 68 65 63 6b 20 74 6f 20 64 69 73 63 6f 76   check to discov
8870: 65 72 20 74 68 65 20 62 65 68 61 76 69 6f 72 20  er the behavior 
8880: 6f 66 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  of the.** curren
8890: 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  t process..**.**
88a0: 20 53 51 4c 69 74 65 20 75 73 65 64 20 74 6f 20   SQLite used to 
88b0: 73 75 70 70 6f 72 74 20 4c 69 6e 75 78 54 68 72  support LinuxThr
88c0: 65 61 64 73 2e 20 20 42 75 74 20 73 75 70 70 6f  eads.  But suppo
88d0: 72 74 20 66 6f 72 20 4c 69 6e 75 78 54 68 72 65  rt for LinuxThre
88e0: 61 64 73 0a 2a 2a 20 77 61 73 20 64 72 6f 70 70  ads.** was dropp
88f0: 65 64 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74  ed beginning wit
8900: 68 20 76 65 72 73 69 6f 6e 20 33 2e 37 2e 30 2e  h version 3.7.0.
8910: 20 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 73 74    SQLite will st
8920: 69 6c 6c 20 77 6f 72 6b 20 77 69 74 68 0a 2a 2a  ill work with.**
8930: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 70 72   LinuxThreads pr
8940: 6f 76 69 64 65 64 20 74 68 61 74 20 28 31 29 20  ovided that (1) 
8950: 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 6f 72 65  there is no more
8960: 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6e 6e 65 63   than one connec
8970: 74 69 6f 6e 20 0a 2a 2a 20 70 65 72 20 64 61 74  tion .** per dat
8980: 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68  abase file in th
8990: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 61  e same process a
89a0: 6e 64 20 28 32 29 20 64 61 74 61 62 61 73 65 20  nd (2) database 
89b0: 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 64  connections.** d
89c0: 6f 20 6e 6f 74 20 6d 6f 76 65 20 61 63 72 6f 73  o not move acros
89d0: 73 20 74 68 72 65 61 64 73 2e 0a 2a 2f 0a 0a 2f  s threads..*/../
89e0: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
89f0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
8a00: 67 20 73 74 72 75 63 74 75 72 65 20 73 65 72 76  g structure serv
8a10: 65 73 20 61 73 20 74 68 65 20 6b 65 79 20 75 73  es as the key us
8a20: 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20  ed.** to locate 
8a30: 61 20 70 61 72 74 69 63 75 6c 61 72 20 75 6e 69  a particular uni
8a40: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
8a50: 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69  t..*/.struct uni
8a60: 78 46 69 6c 65 49 64 20 7b 0a 20 20 64 65 76 5f  xFileId {.  dev_
8a70: 74 20 64 65 76 3b 20 20 20 20 20 20 20 20 20 20  t dev;          
8a80: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63          /* Devic
8a90: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 69 66 20  e number */.#if 
8aa0: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72  OS_VXWORKS.  str
8ab0: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
8ac0: 64 20 2a 70 49 64 3b 20 20 2f 2a 20 55 6e 69 71  d *pId;  /* Uniq
8ad0: 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72 20 76  ue file ID for v
8ae0: 78 77 6f 72 6b 73 2e 20 2a 2f 0a 23 65 6c 73 65  xworks. */.#else
8af0: 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20  .  ino_t ino;   
8b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8b10: 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a  * Inode number *
8b20: 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
8b30: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
8b40: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
8b50: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c  structure is all
8b60: 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20  ocated for each 
8b70: 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20  open.** inode.  
8b80: 4f 72 2c 20 6f 6e 20 4c 69 6e 75 78 54 68 72 65  Or, on LinuxThre
8b90: 61 64 73 2c 20 74 68 65 72 65 20 69 73 20 6f 6e  ads, there is on
8ba0: 65 20 6f 66 20 74 68 65 73 65 20 73 74 72 75 63  e of these struc
8bb0: 74 75 72 65 73 20 66 6f 72 0a 2a 2a 20 65 61 63  tures for.** eac
8bc0: 68 20 69 6e 6f 64 65 20 6f 70 65 6e 65 64 20 62  h inode opened b
8bd0: 79 20 65 61 63 68 20 74 68 72 65 61 64 2e 0a 2a  y each thread..*
8be0: 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e  *.** A single in
8bf0: 6f 64 65 20 63 61 6e 20 68 61 76 65 20 6d 75 6c  ode can have mul
8c00: 74 69 70 6c 65 20 66 69 6c 65 20 64 65 73 63 72  tiple file descr
8c10: 69 70 74 6f 72 73 2c 20 73 6f 20 65 61 63 68 20  iptors, so each 
8c20: 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75  unixFile.** stru
8c30: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61  cture contains a
8c40: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69   pointer to an i
8c50: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
8c60: 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 69 73 0a  object and this.
8c70: 2a 2a 20 6f 62 6a 65 63 74 20 6b 65 65 70 73 20  ** object keeps 
8c80: 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e  a count of the n
8c90: 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 46 69 6c  umber of unixFil
8ca0: 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74  e pointing to it
8cb0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78  ..*/.struct unix
8cc0: 49 6e 6f 64 65 49 6e 66 6f 20 7b 0a 20 20 73 74  InodeInfo {.  st
8cd0: 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20  ruct unixFileId 
8ce0: 66 69 6c 65 49 64 3b 20 20 20 20 20 20 20 2f 2a  fileId;       /*
8cf0: 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20   The lookup key 
8d00: 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 61 72 65 64  */.  int nShared
8d10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8d20: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8d30: 66 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 68  f SHARED locks h
8d40: 65 6c 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  eld */.  unsigne
8d50: 64 20 63 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b  d char eFileLock
8d60: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  ;        /* One 
8d70: 6f 66 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20  of SHARED_LOCK, 
8d80: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74  RESERVED_LOCK et
8d90: 63 2e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  c. */.  unsigned
8da0: 20 63 68 61 72 20 62 50 72 6f 63 65 73 73 4c 6f   char bProcessLo
8db0: 63 6b 3b 20 20 20 20 20 2f 2a 20 41 6e 20 65 78  ck;     /* An ex
8dc0: 63 6c 75 73 69 76 65 20 70 72 6f 63 65 73 73 20  clusive process 
8dd0: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 2a 2f 0a  lock is held */.
8de0: 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
8df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e00: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
8e10: 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69 73 20  ointers to this 
8e20: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 75  structure */.  u
8e30: 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
8e40: 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f  Node;          /
8e50: 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * Shared memory 
8e60: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
8e70: 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20  this inode */.  
8e80: 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20 20 20 20  int nLock;      
8e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ea0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74  /* Number of out
8eb0: 73 74 61 6e 64 69 6e 67 20 66 69 6c 65 20 6c 6f  standing file lo
8ec0: 63 6b 73 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75  cks */.  UnixUnu
8ed0: 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20  sedFd *pUnused; 
8ee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73           /* Unus
8ef0: 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
8f00: 6f 72 73 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a  ors to close */.
8f10: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
8f20: 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20  *pNext;         
8f30: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c    /* List of all
8f40: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
8f50: 62 6a 65 63 74 73 20 2a 2f 0a 20 20 75 6e 69 78  bjects */.  unix
8f60: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 50 72 65 76  InodeInfo *pPrev
8f70: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20  ;           /*  
8f80: 20 20 2e 2e 2e 2e 20 64 6f 75 62 6c 79 20 6c 69    .... doubly li
8f90: 6e 6b 65 64 20 2a 2f 0a 23 69 66 20 53 51 4c 49  nked */.#if SQLI
8fa0: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
8fb0: 47 5f 53 54 59 4c 45 0a 20 20 75 6e 73 69 67 6e  G_STYLE.  unsign
8fc0: 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61  ed long long sha
8fd0: 72 65 64 42 79 74 65 3b 20 20 2f 2a 20 66 6f 72  redByte;  /* for
8fe0: 20 41 46 50 20 73 69 6d 75 6c 61 74 65 64 20 73   AFP simulated s
8ff0: 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a 23 65  hared lock */.#e
9000: 6e 64 69 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f  ndif.#if OS_VXWO
9010: 52 4b 53 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65  RKS.  sem_t *pSe
9020: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
9030: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20 50        /* Named P
9040: 4f 53 49 58 20 73 65 6d 61 70 68 6f 72 65 20 2a  OSIX semaphore *
9050: 2f 0a 20 20 63 68 61 72 20 61 53 65 6d 4e 61 6d  /.  char aSemNam
9060: 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32  e[MAX_PATHNAME+2
9070: 5d 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  ];  /* Name of t
9080: 68 61 74 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f  hat semaphore */
9090: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
90a0: 2a 20 41 20 6c 69 73 74 73 20 6f 66 20 61 6c 6c  * A lists of all
90b0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
90c0: 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  bjects..*/.stati
90d0: 63 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  c unixInodeInfo 
90e0: 2a 69 6e 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a  *inodeList = 0;.
90f0: 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ./*.**.** This f
9100: 75 6e 63 74 69 6f 6e 20 2d 20 75 6e 69 78 4c 6f  unction - unixLo
9110: 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 29 2c 20  gErrorAtLine(), 
9120: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c  is only ever cal
9130: 6c 65 64 20 76 69 61 20 74 68 65 20 6d 61 63 72  led via the macr
9140: 6f 0a 2a 2a 20 75 6e 69 78 4c 6f 67 45 72 72 6f  o.** unixLogErro
9150: 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  r()..**.** It is
9160: 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72 20 61   invoked after a
9170: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69  n error occurs i
9180: 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e  n an OS function
9190: 20 61 6e 64 20 65 72 72 6e 6f 20 68 61 73 20 62   and errno has b
91a0: 65 65 6e 0a 2a 2a 20 73 65 74 2e 20 49 74 20 6c  een.** set. It l
91b0: 6f 67 73 20 61 20 6d 65 73 73 61 67 65 20 75 73  ogs a message us
91c0: 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  ing sqlite3_log(
91d0: 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  ) containing the
91e0: 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
91f0: 66 0a 2a 2a 20 65 72 72 6e 6f 20 61 6e 64 2c 20  f.** errno and, 
9200: 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65  if possible, the
9210: 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20   human-readable 
9220: 65 71 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20  equivalent from 
9230: 73 74 72 65 72 72 6f 72 28 29 20 6f 72 0a 2a 2a  strerror() or.**
9240: 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a 2a   strerror_r()..*
9250: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61  *.** The first a
9260: 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
9270: 6f 20 74 68 65 20 6d 61 63 72 6f 20 73 68 6f 75  o the macro shou
9280: 6c 64 20 62 65 20 74 68 65 20 65 72 72 6f 72 20  ld be the error 
9290: 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c  code that.** wil
92a0: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f  l be returned to
92b0: 20 53 51 4c 69 74 65 20 28 65 2e 67 2e 20 53 51   SQLite (e.g. SQ
92c0: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
92d0: 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  E, SQLITE_CANTOP
92e0: 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20 74 77 6f  EN). .** The two
92f0: 20 73 75 62 73 65 71 75 65 6e 74 20 61 72 67 75   subsequent argu
9300: 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20  ments should be 
9310: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
9320: 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  OS function that
9330: 0a 2a 2a 20 66 61 69 6c 65 64 20 28 65 2e 67 2e  .** failed (e.g.
9340: 20 22 75 6e 6c 69 6e 6b 22 2c 20 22 6f 70 65 6e   "unlink", "open
9350: 22 29 20 61 6e 64 20 74 68 65 20 61 73 73 6f 63  ") and the assoc
9360: 69 61 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65  iated file-syste
9370: 6d 20 70 61 74 68 2c 0a 2a 2a 20 69 66 20 61 6e  m path,.** if an
9380: 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 75 6e  y..*/.#define un
9390: 69 78 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63  ixLogError(a,b,c
93a0: 29 20 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72  )     unixLogErr
93b0: 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 5f  orAtLine(a,b,c,_
93c0: 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20  _LINE__).static 
93d0: 69 6e 74 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  int unixLogError
93e0: 41 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65 72  AtLine(.  int er
93f0: 72 63 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20  rcode,          
9400: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
9410: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a  ite error code *
9420: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
9430: 7a 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20  zFunc,          
9440: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f      /* Name of O
9450: 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  S function that 
9460: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  failed */.  cons
9470: 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
9480: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
9490: 69 6c 65 20 70 61 74 68 20 61 73 73 6f 63 69 61  ile path associa
94a0: 74 65 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a  ted with error *
94b0: 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20  /.  int iLine   
94c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94d0: 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69      /* Source li
94e0: 6e 65 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20  ne number where 
94f0: 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a  error occurred *
9500: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72  /.){.  char *zEr
9510: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
9520: 20 20 20 20 20 20 20 2f 2a 20 4d 65 73 73 61 67         /* Messag
9530: 65 20 66 72 6f 6d 20 73 74 72 65 72 72 6f 72 28  e from strerror(
9540: 29 20 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 20  ) or equivalent 
9550: 2a 2f 0a 20 20 69 6e 74 20 69 45 72 72 6e 6f 20  */.  int iErrno 
9560: 3d 20 65 72 72 6e 6f 3b 20 20 20 20 20 20 20 20  = errno;        
9570: 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 73 79       /* Saved sy
9580: 73 63 61 6c 6c 20 65 72 72 6f 72 20 6e 75 6d 62  scall error numb
9590: 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74  er */..  /* If t
95a0: 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 68 72  his is not a thr
95b0: 65 61 64 73 61 66 65 20 62 75 69 6c 64 20 28 53  eadsafe build (S
95c0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
95d0: 3d 3d 30 29 2c 20 74 68 65 6e 20 75 73 65 0a 20  ==0), then use. 
95e0: 20 2a 2a 20 74 68 65 20 73 74 72 65 72 72 6f 72   ** the strerror
95f0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 6f  () function to o
9600: 62 74 61 69 6e 20 74 68 65 20 68 75 6d 61 6e 2d  btain the human-
9610: 72 65 61 64 61 62 6c 65 20 65 72 72 6f 72 20 6d  readable error m
9620: 65 73 73 61 67 65 0a 20 20 2a 2a 20 65 71 75 69  essage.  ** equi
9630: 76 61 6c 65 6e 74 20 74 6f 20 65 72 72 6e 6f 2e  valent to errno.
9640: 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20   Otherwise, use 
9650: 73 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a 20 20  strerror_r()..  
9660: 2a 2f 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  */ .#if SQLITE_T
9670: 48 52 45 41 44 53 41 46 45 20 26 26 20 64 65 66  HREADSAFE && def
9680: 69 6e 65 64 28 48 41 56 45 5f 53 54 52 45 52 52  ined(HAVE_STRERR
9690: 4f 52 5f 52 29 0a 20 20 63 68 61 72 20 61 45 72  OR_R).  char aEr
96a0: 72 5b 38 30 5d 3b 0a 20 20 6d 65 6d 73 65 74 28  r[80];.  memset(
96b0: 61 45 72 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  aErr, 0, sizeof(
96c0: 61 45 72 72 29 29 3b 0a 20 20 7a 45 72 72 20 3d  aErr));.  zErr =
96d0: 20 61 45 72 72 3b 0a 0a 20 20 2f 2a 20 49 66 20   aErr;..  /* If 
96e0: 53 54 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f  STRERROR_R_CHAR_
96f0: 50 20 28 73 65 74 20 62 79 20 61 75 74 6f 63 6f  P (set by autoco
9700: 6e 66 20 73 63 72 69 70 74 73 29 20 6f 72 20 5f  nf scripts) or _
9710: 5f 55 53 45 5f 47 4e 55 20 69 73 20 64 65 66 69  _USE_GNU is defi
9720: 6e 65 64 2c 0a 20 20 2a 2a 20 61 73 73 75 6d 65  ned,.  ** assume
9730: 20 74 68 61 74 20 74 68 65 20 73 79 73 74 65 6d   that the system
9740: 20 70 72 6f 76 69 64 65 73 20 74 68 65 20 47 4e   provides the GN
9750: 55 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 74 72  U version of str
9760: 65 72 72 6f 72 5f 72 28 29 20 74 68 61 74 0a 20  error_r() that. 
9770: 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 70 6f   ** returns a po
9780: 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66 65  inter to a buffe
9790: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  r containing the
97a0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20   error message. 
97b0: 54 68 61 74 20 70 6f 69 6e 74 65 72 20 0a 20 20  That pointer .  
97c0: 2a 2a 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20  ** may point to 
97d0: 61 45 72 72 5b 5d 2c 20 6f 72 20 69 74 20 6d 61  aErr[], or it ma
97e0: 79 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20  y point to some 
97f0: 73 74 61 74 69 63 20 73 74 6f 72 61 67 65 20 73  static storage s
9800: 6f 6d 65 77 68 65 72 65 2e 20 0a 20 20 2a 2a 20  omewhere. .  ** 
9810: 4f 74 68 65 72 77 69 73 65 2c 20 61 73 73 75 6d  Otherwise, assum
9820: 65 20 74 68 61 74 20 74 68 65 20 73 79 73 74 65  e that the syste
9830: 6d 20 70 72 6f 76 69 64 65 73 20 74 68 65 20 50  m provides the P
9840: 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 6f 66 20  OSIX version of 
9850: 0a 20 20 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72  .  ** strerror_r
9860: 28 29 2c 20 77 68 69 63 68 20 61 6c 77 61 79 73  (), which always
9870: 20 77 72 69 74 65 73 20 61 6e 20 65 72 72 6f 72   writes an error
9880: 20 6d 65 73 73 61 67 65 20 69 6e 74 6f 20 61 45   message into aE
9890: 72 72 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rr[]..  **.  ** 
98a0: 49 66 20 74 68 65 20 63 6f 64 65 20 69 6e 63 6f  If the code inco
98b0: 72 72 65 63 74 6c 79 20 61 73 73 75 6d 65 73 20  rrectly assumes 
98c0: 74 68 61 74 20 69 74 20 69 73 20 74 68 65 20 50  that it is the P
98d0: 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 74 68 61  OSIX version tha
98e0: 74 20 69 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61  t is.  ** availa
98f0: 62 6c 65 2c 20 74 68 65 20 65 72 72 6f 72 20 6d  ble, the error m
9900: 65 73 73 61 67 65 20 77 69 6c 6c 20 6f 66 74 65  essage will ofte
9910: 6e 20 62 65 20 61 6e 20 65 6d 70 74 79 20 73 74  n be an empty st
9920: 72 69 6e 67 2e 20 4e 6f 74 20 61 0a 20 20 2a 2a  ring. Not a.  **
9930: 20 68 75 67 65 20 70 72 6f 62 6c 65 6d 2e 20 49   huge problem. I
9940: 6e 63 6f 72 72 65 63 74 6c 79 20 63 6f 6e 63 6c  ncorrectly concl
9950: 75 64 69 6e 67 20 74 68 61 74 20 74 68 65 20 47  uding that the G
9960: 4e 55 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76  NU version is av
9970: 61 69 6c 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f  ailable .  ** co
9980: 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 73 65  uld lead to a se
9990: 67 66 61 75 6c 74 20 74 68 6f 75 67 68 2e 0a 20  gfault though.. 
99a0: 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
99b0: 53 54 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f  STRERROR_R_CHAR_
99c0: 50 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f  P) || defined(__
99d0: 55 53 45 5f 47 4e 55 29 0a 20 20 7a 45 72 72 20  USE_GNU).  zErr 
99e0: 3d 20 0a 23 20 65 6e 64 69 66 0a 20 20 73 74 72  = .# endif.  str
99f0: 65 72 72 6f 72 5f 72 28 69 45 72 72 6e 6f 2c 20  error_r(iErrno, 
9a00: 61 45 72 72 2c 20 73 69 7a 65 6f 66 28 61 45 72  aErr, sizeof(aEr
9a10: 72 29 2d 31 29 3b 0a 0a 23 65 6c 69 66 20 53 51  r)-1);..#elif SQ
9a20: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
9a30: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 74    /* This is a t
9a40: 68 72 65 61 64 73 61 66 65 20 62 75 69 6c 64 2c  hreadsafe build,
9a50: 20 62 75 74 20 73 74 72 65 72 72 6f 72 5f 72 28   but strerror_r(
9a60: 29 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  ) is not availab
9a70: 6c 65 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20  le. */.  zErr = 
9a80: 22 22 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4e  "";.#else.  /* N
9a90: 6f 6e 2d 74 68 72 65 61 64 73 61 66 65 20 62 75  on-threadsafe bu
9aa0: 69 6c 64 2c 20 75 73 65 20 73 74 72 65 72 72 6f  ild, use strerro
9ab0: 72 28 29 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d  r(). */.  zErr =
9ac0: 20 73 74 72 65 72 72 6f 72 28 69 45 72 72 6e 6f   strerror(iErrno
9ad0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  );.#endif..  if(
9ae0: 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50 61 74   zPath==0 ) zPat
9af0: 68 20 3d 20 22 22 3b 0a 20 20 73 71 6c 69 74 65  h = "";.  sqlite
9b00: 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20  3_log(errcode,. 
9b10: 20 20 20 20 20 22 6f 73 5f 75 6e 69 78 2e 63 3a       "os_unix.c:
9b20: 25 64 3a 20 28 25 64 29 20 25 73 28 25 73 29 20  %d: (%d) %s(%s) 
9b30: 2d 20 25 73 22 2c 0a 20 20 20 20 20 20 69 4c 69  - %s",.      iLi
9b40: 6e 65 2c 20 69 45 72 72 6e 6f 2c 20 7a 46 75 6e  ne, iErrno, zFun
9b50: 63 2c 20 7a 50 61 74 68 2c 20 7a 45 72 72 0a 20  c, zPath, zErr. 
9b60: 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65 72   );..  return er
9b70: 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rcode;.}../*.** 
9b80: 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73  Close a file des
9b90: 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57  criptor..**.** W
9ba0: 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 63 6c  e assume that cl
9bb0: 6f 73 65 28 29 20 61 6c 6d 6f 73 74 20 61 6c 77  ose() almost alw
9bc0: 61 79 73 20 77 6f 72 6b 73 2c 20 73 69 6e 63 65  ays works, since
9bd0: 20 69 74 20 69 73 20 6f 6e 6c 79 20 69 6e 20 61   it is only in a
9be0: 0a 2a 2a 20 76 65 72 79 20 73 69 63 6b 20 61 70  .** very sick ap
9bf0: 70 6c 69 63 61 74 69 6f 6e 20 6f 72 20 6f 6e 20  plication or on 
9c00: 61 20 76 65 72 79 20 73 69 63 6b 20 70 6c 61 74  a very sick plat
9c10: 66 6f 72 6d 20 74 68 61 74 20 69 74 20 6d 69 67  form that it mig
9c20: 68 74 20 66 61 69 6c 2e 0a 2a 2a 20 49 66 20 69  ht fail..** If i
9c30: 74 20 64 6f 65 73 20 66 61 69 6c 2c 20 73 69 6d  t does fail, sim
9c40: 70 6c 79 20 6c 65 61 6b 20 74 68 65 20 66 69 6c  ply leak the fil
9c50: 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20 62 75  e descriptor, bu
9c60: 74 20 64 6f 20 6c 6f 67 20 74 68 65 0a 2a 2a 20  t do log the.** 
9c70: 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  error..**.** Not
9c80: 65 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74  e that it is not
9c90: 20 73 61 66 65 20 74 6f 20 72 65 74 72 79 20 63   safe to retry c
9ca0: 6c 6f 73 65 28 29 20 61 66 74 65 72 20 45 49 4e  lose() after EIN
9cb0: 54 52 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20  TR since the.** 
9cc0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
9cd0: 6d 69 67 68 74 20 68 61 76 65 20 61 6c 72 65 61  might have alrea
9ce0: 64 79 20 62 65 65 6e 20 72 65 75 73 65 64 20 62  dy been reused b
9cf0: 79 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  y another thread
9d00: 2e 0a 2a 2a 20 53 6f 20 77 65 20 64 6f 6e 27 74  ..** So we don't
9d10: 20 65 76 65 6e 20 74 72 79 20 74 6f 20 72 65 63   even try to rec
9d20: 6f 76 65 72 20 66 72 6f 6d 20 61 6e 20 45 49 4e  over from an EIN
9d30: 54 52 2e 20 20 4a 75 73 74 20 6c 6f 67 20 74 68  TR.  Just log th
9d40: 65 20 65 72 72 6f 72 0a 2a 2a 20 61 6e 64 20 6d  e error.** and m
9d50: 6f 76 65 20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ove on..*/.stati
9d60: 63 20 76 6f 69 64 20 72 6f 62 75 73 74 5f 63 6c  c void robust_cl
9d70: 6f 73 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ose(unixFile *pF
9d80: 69 6c 65 2c 20 69 6e 74 20 68 2c 20 69 6e 74 20  ile, int h, int 
9d90: 6c 69 6e 65 6e 6f 29 7b 0a 20 20 69 66 28 20 6f  lineno){.  if( o
9da0: 73 43 6c 6f 73 65 28 68 29 20 29 7b 0a 20 20 20  sClose(h) ){.   
9db0: 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c   unixLogErrorAtL
9dc0: 69 6e 65 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ine(SQLITE_IOERR
9dd0: 5f 43 4c 4f 53 45 2c 20 22 63 6c 6f 73 65 22 2c  _CLOSE, "close",
9de0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9df0: 20 20 20 20 20 20 20 20 70 46 69 6c 65 20 3f 20          pFile ? 
9e00: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3a 20 30  pFile->zPath : 0
9e10: 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d 0a 7d  , lineno);.  }.}
9e20: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
9e30: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
9e40: 2e 20 20 44 6f 20 74 68 69 73 20 69 6e 20 61 20  .  Do this in a 
9e50: 73 75 62 72 6f 75 74 69 6e 65 20 61 73 20 74 68  subroutine as th
9e60: 61 74 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 61  at provides.** a
9e70: 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63   convenient plac
9e80: 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b  e to set a break
9e90: 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  point..*/.static
9ea0: 20 76 6f 69 64 20 73 74 6f 72 65 4c 61 73 74 45   void storeLastE
9eb0: 72 72 6e 6f 28 75 6e 69 78 46 69 6c 65 20 2a 70  rrno(unixFile *p
9ec0: 46 69 6c 65 2c 20 69 6e 74 20 65 72 72 6f 72 29  File, int error)
9ed0: 7b 0a 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  {.  pFile->lastE
9ee0: 72 72 6e 6f 20 3d 20 65 72 72 6f 72 3b 0a 7d 0a  rrno = error;.}.
9ef0: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c  ./*.** Close all
9f00: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
9f10: 73 20 61 63 63 75 6d 75 61 74 65 64 20 69 6e 20  s accumuated in 
9f20: 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
9f30: 6f 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e  o->pUnused list.
9f40: 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/ .static void
9f50: 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73   closePendingFds
9f60: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
9f70: 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  ){.  unixInodeIn
9f80: 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
9f90: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e  le->pInode;.  Un
9fa0: 69 78 55 6e 75 73 65 64 46 64 20 2a 70 3b 0a 20  ixUnusedFd *p;. 
9fb0: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
9fc0: 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70 49  Next;.  for(p=pI
9fd0: 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 70  node->pUnused; p
9fe0: 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  ; p=pNext){.    
9ff0: 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
a000: 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f  ;.    robust_clo
a010: 73 65 28 70 46 69 6c 65 2c 20 70 2d 3e 66 64 2c  se(pFile, p->fd,
a020: 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
a030: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
a040: 0a 20 20 7d 0a 20 20 70 49 6e 6f 64 65 2d 3e 70  .  }.  pInode->p
a050: 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f  Unused = 0;.}../
a060: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 75  *.** Release a u
a070: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72  nixInodeInfo str
a080: 75 63 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c  ucture previousl
a090: 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66  y allocated by f
a0a0: 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 0a  indInodeInfo()..
a0b0: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20  **.** The mutex 
a0c0: 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74 68  entered using th
a0d0: 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  e unixEnterMutex
a0e0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  () function must
a0f0: 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e   be held.** when
a100: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
a110: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  s called..*/.sta
a120: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
a130: 49 6e 6f 64 65 49 6e 66 6f 28 75 6e 69 78 46 69  InodeInfo(unixFi
a140: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e  le *pFile){.  un
a150: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
a160: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
a170: 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75  ode;.  assert( u
a180: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
a190: 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
a1a0: 49 6e 6f 64 65 29 20 29 7b 0a 20 20 20 20 70 49  Inode) ){.    pI
a1b0: 6e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  node->nRef--;.  
a1c0: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 52    if( pInode->nR
a1d0: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ef==0 ){.      a
a1e0: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70  ssert( pInode->p
a1f0: 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 3b 0a 20 20  ShmNode==0 );.  
a200: 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67      closePending
a210: 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  Fds(pFile);.    
a220: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 50    if( pInode->pP
a230: 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 61  rev ){.        a
a240: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70  ssert( pInode->p
a250: 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e  Prev->pNext==pIn
a260: 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ode );.        p
a270: 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e  Inode->pPrev->pN
a280: 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e  ext = pInode->pN
a290: 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ext;.      }else
a2a0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
a2b0: 28 20 69 6e 6f 64 65 4c 69 73 74 3d 3d 70 49 6e  ( inodeList==pIn
a2c0: 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ode );.        i
a2d0: 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64  nodeList = pInod
a2e0: 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  e->pNext;.      
a2f0: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f  }.      if( pIno
a300: 64 65 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20  de->pNext ){.   
a310: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
a320: 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  ode->pNext->pPre
a330: 76 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20  v==pInode );.   
a340: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65       pInode->pNe
a350: 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f  xt->pPrev = pIno
a360: 64 65 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20  de->pPrev;.     
a370: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
a380: 5f 66 72 65 65 28 70 49 6e 6f 64 65 29 3b 0a 20  _free(pInode);. 
a390: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
a3a0: 2a 20 47 69 76 65 6e 20 61 20 66 69 6c 65 20 64  * Given a file d
a3b0: 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f 63 61 74  escriptor, locat
a3c0: 65 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  e the unixInodeI
a3d0: 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a  nfo object that.
a3e0: 2a 2a 20 64 65 73 63 72 69 62 65 73 20 74 68 61  ** describes tha
a3f0: 74 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  t file descripto
a400: 72 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  r.  Create a new
a410: 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72   one if necessar
a420: 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74 75 72  y.  The.** retur
a430: 6e 20 76 61 6c 75 65 20 6d 69 67 68 74 20 62 65  n value might be
a440: 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 69   uninitialized i
a450: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
a460: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74  s..**.** The mut
a470: 65 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67  ex entered using
a480: 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75   the unixEnterMu
a490: 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d  tex() function m
a4a0: 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77  ust be held.** w
a4b0: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
a4c0: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
a4d0: 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 61 70 70  ** Return an app
a4e0: 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
a4f0: 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
a500: 6e 74 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  nt findInodeInfo
a510: 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  (.  unixFile *pF
a520: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
a530: 20 20 20 2f 2a 20 55 6e 69 78 20 66 69 6c 65 20     /* Unix file 
a540: 77 69 74 68 20 66 69 6c 65 20 64 65 73 63 20 75  with file desc u
a550: 73 65 64 20 69 6e 20 74 68 65 20 6b 65 79 20 2a  sed in the key *
a560: 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
a570: 6f 20 2a 2a 70 70 49 6e 6f 64 65 20 20 20 20 20  o **ppInode     
a580: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
a590: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
a5a0: 62 6a 65 63 74 20 68 65 72 65 20 2a 2f 0a 29 7b  bject here */.){
a5b0: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
a5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5d0: 20 20 2f 2a 20 53 79 73 74 65 6d 20 63 61 6c 6c    /* System call
a5e0: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
a5f0: 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20    int fd;       
a600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a610: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
a620: 63 72 69 70 74 6f 72 20 66 6f 72 20 70 46 69 6c  criptor for pFil
a630: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e  e */.  struct un
a640: 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b  ixFileId fileId;
a650: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20        /* Lookup 
a660: 6b 65 79 20 66 6f 72 20 74 68 65 20 75 6e 69 78  key for the unix
a670: 49 6e 6f 64 65 49 6e 66 6f 20 2a 2f 0a 20 20 73  InodeInfo */.  s
a680: 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74 62  truct stat statb
a690: 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  uf;           /*
a6a0: 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20   Low-level file 
a6b0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
a6c0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
a6d0: 70 49 6e 6f 64 65 20 3d 20 30 3b 20 20 20 20 20  pInode = 0;     
a6e0: 2f 2a 20 43 61 6e 64 69 64 61 74 65 20 75 6e 69  /* Candidate uni
a6f0: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
a700: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
a710: 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
a720: 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 6c 6f 77  );..  /* Get low
a730: 2d 6c 65 76 65 6c 20 69 6e 66 6f 72 6d 61 74 69  -level informati
a740: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c  on about the fil
a750: 65 20 74 68 61 74 20 77 65 20 63 61 6e 20 75 73  e that we can us
a760: 65 64 20 74 6f 0a 20 20 2a 2a 20 63 72 65 61 74  ed to.  ** creat
a770: 65 20 61 20 75 6e 69 71 75 65 20 6e 61 6d 65 20  e a unique name 
a780: 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a 20 20  for the file..  
a790: 2a 2f 0a 20 20 66 64 20 3d 20 70 46 69 6c 65 2d  */.  fd = pFile-
a7a0: 3e 68 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73 74  >h;.  rc = osFst
a7b0: 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29  at(fd, &statbuf)
a7c0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b  ;.  if( rc!=0 ){
a7d0: 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72  .    storeLastEr
a7e0: 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f  rno(pFile, errno
a7f0: 29 3b 0a 23 69 66 64 65 66 20 45 4f 56 45 52 46  );.#ifdef EOVERF
a800: 4c 4f 57 0a 20 20 20 20 69 66 28 20 70 46 69 6c  LOW.    if( pFil
a810: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 4f  e->lastErrno==EO
a820: 56 45 52 46 4c 4f 57 20 29 20 72 65 74 75 72 6e  VERFLOW ) return
a830: 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23   SQLITE_NOLFS;.#
a840: 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
a850: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
a860: 20 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50 50   }..#ifdef __APP
a870: 4c 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20  LE__.  /* On OS 
a880: 58 20 6f 6e 20 61 6e 20 6d 73 64 6f 73 20 66 69  X on an msdos fi
a890: 6c 65 73 79 73 74 65 6d 2c 20 74 68 65 20 69 6e  lesystem, the in
a8a0: 6f 64 65 20 6e 75 6d 62 65 72 20 69 73 20 72 65  ode number is re
a8b0: 70 6f 72 74 65 64 0a 20 20 2a 2a 20 69 6e 63 6f  ported.  ** inco
a8c0: 72 72 65 63 74 6c 79 20 66 6f 72 20 7a 65 72 6f  rrectly for zero
a8d0: 2d 73 69 7a 65 20 66 69 6c 65 73 2e 20 20 53 65  -size files.  Se
a8e0: 65 20 74 69 63 6b 65 74 20 23 33 32 36 30 2e 20  e ticket #3260. 
a8f0: 20 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20 61 72   To work.  ** ar
a900: 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65  ound this proble
a910: 6d 20 28 77 65 20 63 6f 6e 73 69 64 65 72 20 69  m (we consider i
a920: 74 20 61 20 62 75 67 20 69 6e 20 4f 53 20 58 2c  t a bug in OS X,
a930: 20 6e 6f 74 20 53 51 4c 69 74 65 29 0a 20 20 2a   not SQLite).  *
a940: 2a 20 77 65 20 61 6c 77 61 79 73 20 69 6e 63 72  * we always incr
a950: 65 61 73 65 20 74 68 65 20 66 69 6c 65 20 73 69  ease the file si
a960: 7a 65 20 74 6f 20 31 20 62 79 20 77 72 69 74 69  ze to 1 by writi
a970: 6e 67 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  ng a single byte
a980: 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61  .  ** prior to a
a990: 63 63 65 73 73 69 6e 67 20 74 68 65 20 69 6e 6f  ccessing the ino
a9a0: 64 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 20  de number.  The 
a9b0: 6f 6e 65 20 62 79 74 65 20 77 72 69 74 74 65 6e  one byte written
a9c0: 20 69 73 0a 20 20 2a 2a 20 61 6e 20 41 53 43 49   is.  ** an ASCI
a9d0: 49 20 27 53 27 20 63 68 61 72 61 63 74 65 72 20  I 'S' character 
a9e0: 77 68 69 63 68 20 61 6c 73 6f 20 68 61 70 70 65  which also happe
a9f0: 6e 73 20 74 6f 20 62 65 20 74 68 65 20 66 69 72  ns to be the fir
aa00: 73 74 20 62 79 74 65 0a 20 20 2a 2a 20 69 6e 20  st byte.  ** in 
aa10: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 65 76  the header of ev
aa20: 65 72 79 20 53 51 4c 69 74 65 20 64 61 74 61 62  ery SQLite datab
aa30: 61 73 65 2e 20 20 49 6e 20 74 68 69 73 20 77 61  ase.  In this wa
aa40: 79 2c 20 69 66 20 74 68 65 72 65 0a 20 20 2a 2a  y, if there.  **
aa50: 20 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69   is a race condi
aa60: 74 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  tion such that a
aa70: 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61  nother thread ha
aa80: 73 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61  s already popula
aa90: 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 66 69 72  ted.  ** the fir
aaa0: 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
aab0: 61 74 61 62 61 73 65 2c 20 6e 6f 20 64 61 6d 61  atabase, no dama
aac0: 67 65 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f  ge is done..  */
aad0: 0a 20 20 69 66 28 20 73 74 61 74 62 75 66 2e 73  .  if( statbuf.s
aae0: 74 5f 73 69 7a 65 3d 3d 30 20 26 26 20 28 70 46  t_size==0 && (pF
aaf0: 69 6c 65 2d 3e 66 73 46 6c 61 67 73 20 26 20 53  ile->fsFlags & S
ab00: 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53  QLITE_FSFLAGS_IS
ab10: 5f 4d 53 44 4f 53 29 21 3d 30 20 29 7b 0a 20 20  _MSDOS)!=0 ){.  
ab20: 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 57 72 69    do{ rc = osWri
ab30: 74 65 28 66 64 2c 20 22 53 22 2c 20 31 29 3b 20  te(fd, "S", 1); 
ab40: 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20  }while( rc<0 && 
ab50: 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
ab60: 20 20 20 20 69 66 28 20 72 63 21 3d 31 20 29 7b      if( rc!=1 ){
ab70: 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
ab80: 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72  Errno(pFile, err
ab90: 6e 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  no);.      retur
aba0: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
abb0: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6f      }.    rc = o
abc0: 73 46 73 74 61 74 28 66 64 2c 20 26 73 74 61 74  sFstat(fd, &stat
abd0: 62 75 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63  buf);.    if( rc
abe0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 6f  !=0 ){.      sto
abf0: 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
ac00: 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20  e, errno);.     
ac10: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
ac20: 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OERR;.    }.  }.
ac30: 23 65 6e 64 69 66 0a 0a 20 20 6d 65 6d 73 65 74  #endif..  memset
ac40: 28 26 66 69 6c 65 49 64 2c 20 30 2c 20 73 69 7a  (&fileId, 0, siz
ac50: 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20  eof(fileId));.  
ac60: 66 69 6c 65 49 64 2e 64 65 76 20 3d 20 73 74 61  fileId.dev = sta
ac70: 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 23 69 66  tbuf.st_dev;.#if
ac80: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 66 69   OS_VXWORKS.  fi
ac90: 6c 65 49 64 2e 70 49 64 20 3d 20 70 46 69 6c 65  leId.pId = pFile
aca0: 2d 3e 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20 66  ->pId;.#else.  f
acb0: 69 6c 65 49 64 2e 69 6e 6f 20 3d 20 73 74 61 74  ileId.ino = stat
acc0: 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64  buf.st_ino;.#end
acd0: 69 66 0a 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e  if.  pInode = in
ace0: 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65  odeList;.  while
acf0: 28 20 70 49 6e 6f 64 65 20 26 26 20 6d 65 6d 63  ( pInode && memc
ad00: 6d 70 28 26 66 69 6c 65 49 64 2c 20 26 70 49 6e  mp(&fileId, &pIn
ad10: 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 73 69 7a  ode->fileId, siz
ad20: 65 6f 66 28 66 69 6c 65 49 64 29 29 20 29 7b 0a  eof(fileId)) ){.
ad30: 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e      pInode = pIn
ad40: 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  ode->pNext;.  }.
ad50: 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20    if( pInode==0 
ad60: 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20  ){.    pInode = 
ad70: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
ad80: 28 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65  ( sizeof(*pInode
ad90: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  ) );.    if( pIn
ada0: 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ode==0 ){.      
adb0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
adc0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  MEM;.    }.    m
add0: 65 6d 73 65 74 28 70 49 6e 6f 64 65 2c 20 30 2c  emset(pInode, 0,
ade0: 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29   sizeof(*pInode)
adf0: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
ae00: 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 26  Inode->fileId, &
ae10: 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66  fileId, sizeof(f
ae20: 69 6c 65 49 64 29 29 3b 0a 20 20 20 20 70 49 6e  ileId));.    pIn
ae30: 6f 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  ode->nRef = 1;. 
ae40: 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74     pInode->pNext
ae50: 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20   = inodeList;.  
ae60: 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20    pInode->pPrev 
ae70: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 69 6e 6f  = 0;.    if( ino
ae80: 64 65 4c 69 73 74 20 29 20 69 6e 6f 64 65 4c 69  deList ) inodeLi
ae90: 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f  st->pPrev = pIno
aea0: 64 65 3b 0a 20 20 20 20 69 6e 6f 64 65 4c 69 73  de;.    inodeLis
aeb0: 74 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 7d 65  t = pInode;.  }e
aec0: 6c 73 65 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  lse{.    pInode-
aed0: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a  >nRef++;.  }.  *
aee0: 70 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65  ppInode = pInode
aef0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
af00: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
af10: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 70 46  eturn TRUE if pF
af20: 69 6c 65 20 68 61 73 20 62 65 65 6e 20 72 65 6e  ile has been ren
af30: 61 6d 65 64 20 6f 72 20 75 6e 6c 69 6e 6b 65 64  amed or unlinked
af40: 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 66 69   since it was fi
af50: 72 73 74 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73  rst opened..*/.s
af60: 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 48 61  tatic int fileHa
af70: 73 4d 6f 76 65 64 28 75 6e 69 78 46 69 6c 65 20  sMoved(unixFile 
af80: 2a 70 46 69 6c 65 29 7b 0a 23 69 66 20 4f 53 5f  *pFile){.#if OS_
af90: 56 58 57 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e  VXWORKS.  return
afa0: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d   pFile->pInode!=
afb0: 30 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 64 21  0 && pFile->pId!
afc0: 3d 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e  =pFile->pInode->
afd0: 66 69 6c 65 49 64 2e 70 49 64 3b 0a 23 65 6c 73  fileId.pId;.#els
afe0: 65 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  e.  struct stat 
aff0: 62 75 66 3b 0a 20 20 72 65 74 75 72 6e 20 70 46  buf;.  return pF
b000: 69 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d 30 20 26  ile->pInode!=0 &
b010: 26 0a 20 20 20 20 20 20 28 6f 73 53 74 61 74 28  &.      (osStat(
b020: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 62  pFile->zPath, &b
b030: 75 66 29 21 3d 30 20 7c 7c 20 62 75 66 2e 73 74  uf)!=0 || buf.st
b040: 5f 69 6e 6f 21 3d 70 46 69 6c 65 2d 3e 70 49 6e  _ino!=pFile->pIn
b050: 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 29  ode->fileId.ino)
b060: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
b070: 2a 2a 20 43 68 65 63 6b 20 61 20 75 6e 69 78 46  ** Check a unixF
b080: 69 6c 65 20 74 68 61 74 20 69 73 20 61 20 64 61  ile that is a da
b090: 74 61 62 61 73 65 2e 20 20 56 65 72 69 66 79 20  tabase.  Verify 
b0a0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
b0b0: 2a 0a 2a 2a 20 28 31 29 20 54 68 65 72 65 20 69  *.** (1) There i
b0c0: 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 68 61  s exactly one ha
b0d0: 72 64 20 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 66  rd link on the f
b0e0: 69 6c 65 0a 2a 2a 20 28 32 29 20 54 68 65 20 66  ile.** (2) The f
b0f0: 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 73 79 6d  ile is not a sym
b100: 62 6f 6c 69 63 20 6c 69 6e 6b 0a 2a 2a 20 28 33  bolic link.** (3
b110: 29 20 54 68 65 20 66 69 6c 65 20 68 61 73 20 6e  ) The file has n
b120: 6f 74 20 62 65 65 6e 20 72 65 6e 61 6d 65 64 20  ot been renamed 
b130: 6f 72 20 75 6e 6c 69 6e 6b 65 64 0a 2a 2a 0a 2a  or unlinked.**.*
b140: 2a 20 49 73 73 75 65 20 73 71 6c 69 74 65 33 5f  * Issue sqlite3_
b150: 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49  log(SQLITE_WARNI
b160: 4e 47 2c 2e 2e 2e 29 20 6d 65 73 73 61 67 65 73  NG,...) messages
b170: 20 69 66 20 61 6e 79 74 68 69 6e 67 20 69 73 20   if anything is 
b180: 6e 6f 74 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74  not right..*/.st
b190: 61 74 69 63 20 76 6f 69 64 20 76 65 72 69 66 79  atic void verify
b1a0: 44 62 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20  DbFile(unixFile 
b1b0: 2a 70 46 69 6c 65 29 7b 0a 20 20 73 74 72 75 63  *pFile){.  struc
b1c0: 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 69 6e  t stat buf;.  in
b1d0: 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 6f 73 46  t rc;.  rc = osF
b1e0: 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26  stat(pFile->h, &
b1f0: 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  buf);.  if( rc!=
b200: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
b210: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e  _log(SQLITE_WARN
b220: 49 4e 47 2c 20 22 63 61 6e 6e 6f 74 20 66 73 74  ING, "cannot fst
b230: 61 74 20 64 62 20 66 69 6c 65 20 25 73 22 2c 20  at db file %s", 
b240: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
b250: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
b260: 20 69 66 28 20 62 75 66 2e 73 74 5f 6e 6c 69 6e   if( buf.st_nlin
b270: 6b 3d 3d 30 20 26 26 20 28 70 46 69 6c 65 2d 3e  k==0 && (pFile->
b280: 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
b290: 46 49 4c 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20  FILE_DELETE)==0 
b2a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
b2b0: 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  og(SQLITE_WARNIN
b2c0: 47 2c 20 22 66 69 6c 65 20 75 6e 6c 69 6e 6b 65  G, "file unlinke
b2d0: 64 20 77 68 69 6c 65 20 6f 70 65 6e 3a 20 25 73  d while open: %s
b2e0: 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
b2f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
b300: 7d 0a 20 20 69 66 28 20 62 75 66 2e 73 74 5f 6e  }.  if( buf.st_n
b310: 6c 69 6e 6b 3e 31 20 29 7b 0a 20 20 20 20 73 71  link>1 ){.    sq
b320: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
b330: 5f 57 41 52 4e 49 4e 47 2c 20 22 6d 75 6c 74 69  _WARNING, "multi
b340: 70 6c 65 20 6c 69 6e 6b 73 20 74 6f 20 66 69 6c  ple links to fil
b350: 65 3a 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a  e: %s", pFile->z
b360: 50 61 74 68 29 3b 0a 20 20 20 20 72 65 74 75 72  Path);.    retur
b370: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 69 6c  n;.  }.  if( fil
b380: 65 48 61 73 4d 6f 76 65 64 28 70 46 69 6c 65 29  eHasMoved(pFile)
b390: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
b3a0: 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49  log(SQLITE_WARNI
b3b0: 4e 47 2c 20 22 66 69 6c 65 20 72 65 6e 61 6d 65  NG, "file rename
b3c0: 64 20 77 68 69 6c 65 20 6f 70 65 6e 3a 20 25 73  d while open: %s
b3d0: 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
b3e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
b3f0: 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  }.}.../*.** This
b400: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
b410: 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
b420: 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
b430: 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
b440: 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
b450: 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
b460: 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
b470: 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
b480: 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
b490: 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
b4a0: 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
b4b0: 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
b4c0: 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
b4d0: 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
b4e0: 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
b4f0: 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
b500: 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
b510: 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
b520: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
b530: 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  nixCheckReserved
b540: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
b550: 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
b560: 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Out){.  int rc =
b570: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
b580: 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  t reserved = 0;.
b590: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
b5a0: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
b5b0: 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d;..  SimulateIO
b5c0: 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
b5d0: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
b5e0: 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b  RESERVEDLOCK; );
b5f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
b600: 65 20 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72  e );.  unixEnter
b610: 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61  Mutex(); /* Beca
b620: 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  use pFile->pInod
b630: 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  e is shared acro
b640: 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 0a 20  ss threads */.. 
b650: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74   /* Check if a t
b660: 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72  hread in this pr
b670: 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68  ocess holds such
b680: 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28   a lock */.  if(
b690: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
b6a0: 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
b6b0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73  _LOCK ){.    res
b6c0: 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a  erved = 1;.  }..
b6d0: 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73    /* Otherwise s
b6e0: 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ee if some other
b6f0: 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69   process holds i
b700: 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  t..  */.#ifndef 
b710: 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 69 66 28 20  __DJGPP__.  if( 
b720: 21 72 65 73 65 72 76 65 64 20 26 26 20 21 70 46  !reserved && !pF
b730: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72  ile->pInode->bPr
b740: 6f 63 65 73 73 4c 6f 63 6b 20 29 7b 0a 20 20 20  ocessLock ){.   
b750: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
b760: 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  ck;.    lock.l_w
b770: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
b780: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  ;.    lock.l_sta
b790: 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59  rt = RESERVED_BY
b7a0: 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  TE;.    lock.l_l
b7b0: 65 6e 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b  en = 1;.    lock
b7c0: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43  .l_type = F_WRLC
b7d0: 4b 3b 0a 20 20 20 20 69 66 28 20 6f 73 46 63 6e  K;.    if( osFcn
b7e0: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 47  tl(pFile->h, F_G
b7f0: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a  ETLK, &lock) ){.
b800: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
b810: 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
b820: 45 52 56 45 44 4c 4f 43 4b 3b 0a 20 20 20 20 20  ERVEDLOCK;.     
b830: 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
b840: 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20  pFile, errno);. 
b850: 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 6f     } else if( lo
b860: 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c  ck.l_type!=F_UNL
b870: 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 73 65  CK ){.      rese
b880: 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  rved = 1;.    }.
b890: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
b8a0: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
b8b0: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  ;.  OSTRACE(("TE
b8c0: 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
b8d0: 20 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70   %d (unix)\n", p
b8e0: 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
b8f0: 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65  erved));..  *pRe
b900: 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
b910: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
b920: 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
b930: 6f 20 73 65 74 20 61 20 73 79 73 74 65 6d 2d 6c  o set a system-l
b940: 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  ock on the file 
b950: 70 46 69 6c 65 2e 20 20 54 68 65 20 6c 6f 63 6b  pFile.  The lock
b960: 20 69 73 20 0a 2a 2a 20 64 65 73 63 72 69 62 65   is .** describe
b970: 64 20 62 79 20 70 4c 6f 63 6b 2e 0a 2a 2a 0a 2a  d by pLock..**.*
b980: 2a 20 49 66 20 74 68 65 20 70 46 69 6c 65 20 77  * If the pFile w
b990: 61 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2f 77  as opened read/w
b9a0: 72 69 74 65 20 66 72 6f 6d 20 75 6e 69 78 2d 65  rite from unix-e
b9b0: 78 63 6c 2c 20 74 68 65 6e 20 74 68 65 20 6f 6e  xcl, then the on
b9c0: 6c 79 20 6c 6f 63 6b 0a 2a 2a 20 65 76 65 72 20  ly lock.** ever 
b9d0: 6f 62 74 61 69 6e 65 64 20 69 73 20 61 6e 20 65  obtained is an e
b9e0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 61  xclusive lock, a
b9f0: 6e 64 20 69 74 20 69 73 20 6f 62 74 61 69 6e 65  nd it is obtaine
ba00: 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 0a 2a  d exactly once.*
ba10: 2a 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  * the first time
ba20: 20 61 6e 79 20 6c 6f 63 6b 20 69 73 20 61 74 74   any lock is att
ba30: 65 6d 70 74 65 64 2e 20 20 41 6c 6c 20 73 75 62  empted.  All sub
ba40: 73 65 71 75 65 6e 74 20 73 79 73 74 65 6d 20 6c  sequent system l
ba50: 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74  ocking.** operat
ba60: 69 6f 6e 73 20 62 65 63 6f 6d 65 20 6e 6f 2d 6f  ions become no-o
ba70: 70 73 2e 20 20 4c 6f 63 6b 69 6e 67 20 6f 70 65  ps.  Locking ope
ba80: 72 61 74 69 6f 6e 73 20 73 74 69 6c 6c 20 68 61  rations still ha
ba90: 70 70 65 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 2c  ppen internally,
baa0: 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
bab0: 63 6f 6f 72 64 69 6e 61 74 65 20 61 63 63 65 73  coordinate acces
bac0: 73 20 62 65 74 77 65 65 6e 20 73 65 70 61 72 61  s between separa
bad0: 74 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  te database conn
bae0: 65 63 74 69 6f 6e 73 0a 2a 2a 20 77 69 74 68 69  ections.** withi
baf0: 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 2c 20  n this process, 
bb00: 62 75 74 20 61 6c 6c 20 6f 66 20 74 68 61 74 20  but all of that 
bb10: 69 73 20 68 61 6e 64 6c 65 64 20 69 6e 20 6d 65  is handled in me
bb20: 6d 6f 72 79 20 61 6e 64 20 74 68 65 0a 2a 2a 20  mory and the.** 
bb30: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
bb40: 20 64 6f 65 73 20 6e 6f 74 20 70 61 72 74 69 63   does not partic
bb50: 69 70 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ipate..**.** Thi
bb60: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
bb70: 70 61 73 73 2d 74 68 72 6f 75 67 68 20 74 6f 20  pass-through to 
bb80: 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b 29 20 69  fcntl(F_SETLK) i
bb90: 66 20 70 46 69 6c 65 20 69 73 20 75 73 69 6e 67  f pFile is using
bba0: 0a 2a 2a 20 61 6e 79 20 56 46 53 20 6f 74 68 65  .** any VFS othe
bbb0: 72 20 74 68 61 6e 20 22 75 6e 69 78 2d 65 78 63  r than "unix-exc
bbc0: 6c 22 20 6f 72 20 69 66 20 70 46 69 6c 65 20 69  l" or if pFile i
bbd0: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 22 75 6e 69  s opened on "uni
bbe0: 78 2d 65 78 63 6c 22 0a 2a 2a 20 61 6e 64 20 69  x-excl".** and i
bbf0: 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a 2a 2a 0a  s read-only..**.
bc00: 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72  ** Zero is retur
bc10: 6e 65 64 20 69 66 20 74 68 65 20 63 61 6c 6c 20  ned if the call 
bc20: 63 6f 6d 70 6c 65 74 65 73 20 73 75 63 63 65 73  completes succes
bc30: 73 66 75 6c 6c 79 2c 20 6f 72 20 2d 31 20 69 66  sfully, or -1 if
bc40: 20 61 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66 63   a call.** to fc
bc50: 6e 74 6c 28 29 20 66 61 69 6c 73 2e 20 49 6e 20  ntl() fails. In 
bc60: 74 68 69 73 20 63 61 73 65 2c 20 65 72 72 6e 6f  this case, errno
bc70: 20 69 73 20 73 65 74 20 61 70 70 72 6f 70 72 69   is set appropri
bc80: 61 74 65 6c 79 20 28 62 79 20 66 63 6e 74 6c 28  ately (by fcntl(
bc90: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ))..*/.static in
bca0: 74 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 75  t unixFileLock(u
bcb0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
bcc0: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 4c  struct flock *pL
bcd0: 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ock){.  int rc;.
bce0: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
bcf0: 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
bd00: 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72  >pInode;.  asser
bd10: 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  t( unixMutexHeld
bd20: 28 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  () );.  assert( 
bd30: 70 49 6e 6f 64 65 21 3d 30 20 29 3b 0a 20 20 69  pInode!=0 );.  i
bd40: 66 28 20 28 28 70 46 69 6c 65 2d 3e 63 74 72 6c  f( ((pFile->ctrl
bd50: 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
bd60: 5f 45 58 43 4c 29 21 3d 30 20 7c 7c 20 70 49 6e  _EXCL)!=0 || pIn
bd70: 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
bd80: 6b 29 0a 20 20 20 26 26 20 28 28 70 46 69 6c 65  k).   && ((pFile
bd90: 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
bda0: 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d  IXFILE_RDONLY)==
bdb0: 30 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  0).  ){.    if( 
bdc0: 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
bdd0: 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Lock==0 ){.     
bde0: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
bdf0: 63 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ck;.      assert
be00: 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d  ( pInode->nLock=
be10: 3d 30 20 29 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  =0 );.      lock
be20: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
be30: 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  _SET;.      lock
be40: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
be50: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c  D_FIRST;.      l
be60: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
be70: 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 6c  ED_SIZE;.      l
be80: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57  ock.l_type = F_W
be90: 52 4c 43 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d  RLCK;.      rc =
bea0: 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e   osFcntl(pFile->
beb0: 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_SETLK, &loc
bec0: 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  k);.      if( rc
bed0: 3c 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  <0 ) return rc;.
bee0: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 62 50        pInode->bP
bef0: 72 6f 63 65 73 73 4c 6f 63 6b 20 3d 20 31 3b 0a  rocessLock = 1;.
bf00: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c        pInode->nL
bf10: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  ock++;.    }else
bf20: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a  {.      rc = 0;.
bf30: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
bf40: 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28     rc = osFcntl(
bf50: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  pFile->h, F_SETL
bf60: 4b 2c 20 70 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 20  K, pLock);.  }. 
bf70: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
bf80: 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
bf90: 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
bfa0: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
bfb0: 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
bfc0: 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
bfd0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
bfe0: 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
bff0: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
c000: 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
c010: 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
c020: 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
c030: 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
c040: 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
c050: 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
c060: 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
c070: 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
c080: 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
c090: 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
c0a0: 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
c0b0: 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
c0c0: 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
c0d0: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
c0e0: 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
c0f0: 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
c100: 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
c110: 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
c120: 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
c130: 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
c140: 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
c150: 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
c160: 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
c170: 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
c180: 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
c190: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
c1a0: 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
c1b0: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
c1c0: 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
c1d0: 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
c1e0: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
c1f0: 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
c200: 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
c210: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
c220: 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
c230: 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
c240: 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
c250: 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
c260: 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
c270: 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
c280: 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
c290: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
c2a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
c2b0: 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ixLock(sqlite3_f
c2c0: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
c2d0: 6c 65 4c 6f 63 6b 29 7b 0a 20 20 2f 2a 20 54 68  leLock){.  /* Th
c2e0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63  e following desc
c2f0: 72 69 62 65 73 20 74 68 65 20 69 6d 70 6c 65 6d  ribes the implem
c300: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
c310: 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e  various locks an
c320: 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e  d.  ** lock tran
c330: 73 69 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73  sitions in terms
c340: 20 6f 66 20 74 68 65 20 50 4f 53 49 58 20 61 64   of the POSIX ad
c350: 76 69 73 6f 72 79 20 73 68 61 72 65 64 20 61 6e  visory shared an
c360: 64 20 65 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a  d exclusive.  **
c370: 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76 65 73   lock primitives
c380: 20 28 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f   (called read-lo
c390: 63 6b 73 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f  cks and write-lo
c3a0: 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76  cks below, to av
c3b0: 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69  oid.  ** confusi
c3c0: 6f 6e 20 77 69 74 68 20 53 51 4c 69 74 65 20 6c  on with SQLite l
c3d0: 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65 20  ock names). The 
c3e0: 61 6c 67 6f 72 69 74 68 6d 73 20 61 72 65 20 63  algorithms are c
c3f0: 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20  omplicated.  ** 
c400: 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72 64 65  slightly in orde
c410: 72 20 74 6f 20 62 65 20 63 6f 6d 70 61 74 69 62  r to be compatib
c420: 6c 65 20 77 69 74 68 20 77 69 6e 64 6f 77 73 20  le with windows 
c430: 73 79 73 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e  systems simultan
c440: 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65  eously.  ** acce
c450: 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64  ssing the same d
c460: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 6e  atabase file, in
c470: 20 63 61 73 65 20 74 68 61 74 20 69 73 20 65 76   case that is ev
c480: 65 72 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a  er required..  *
c490: 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64  *.  ** Symbols d
c4a0: 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69  efined in os.h i
c4b0: 6e 64 65 6e 74 69 66 79 20 74 68 65 20 27 70 65  ndentify the 'pe
c4c0: 6e 64 69 6e 67 20 62 79 74 65 27 20 61 6e 64 20  nding byte' and 
c4d0: 74 68 65 20 27 72 65 73 65 72 76 65 64 0a 20 20  the 'reserved.  
c4e0: 2a 2a 20 62 79 74 65 27 2c 20 65 61 63 68 20 73  ** byte', each s
c4f0: 69 6e 67 6c 65 20 62 79 74 65 73 20 61 74 20 77  ingle bytes at w
c500: 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74  ell known offset
c510: 73 2c 20 61 6e 64 20 74 68 65 20 27 73 68 61 72  s, and the 'shar
c520: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
c530: 67 65 27 2c 20 61 20 72 61 6e 67 65 20 6f 66 20  ge', a range of 
c540: 35 31 30 20 62 79 74 65 73 20 61 74 20 61 20 77  510 bytes at a w
c550: 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74  ell known offset
c560: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f  ..  **.  ** To o
c570: 62 74 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c  btain a SHARED l
c580: 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ock, a read-lock
c590: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20   is obtained on 
c5a0: 74 68 65 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a  the 'pending.  *
c5b0: 2a 20 62 79 74 65 27 2e 20 20 49 66 20 74 68 69  * byte'.  If thi
c5c0: 73 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  s is successful,
c5d0: 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66   a random byte f
c5e0: 72 6f 6d 20 74 68 65 20 27 73 68 61 72 65 64 20  rom the 'shared 
c5f0: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
c600: 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64 20   is read-locked 
c610: 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  and the lock on 
c620: 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74  the 'pending byt
c630: 65 27 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a  e' released..  *
c640: 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73  *.  ** A process
c650: 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e   may only obtain
c660: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
c670: 20 61 66 74 65 72 20 69 74 20 68 61 73 20 61 20   after it has a 
c680: 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a  SHARED lock..  *
c690: 2a 20 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63  * A RESERVED loc
c6a0: 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  k is implemented
c6b0: 20 62 79 20 67 72 61 62 62 69 6e 67 20 61 20 77   by grabbing a w
c6c0: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
c6d0: 0a 20 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20  .  ** 'reserved 
c6e0: 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a  byte'. .  **.  *
c6f0: 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20  * A process may 
c700: 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45  only obtain a PE
c710: 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72  NDING lock after
c720: 20 69 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64   it has obtained
c730: 20 61 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c   a.  ** SHARED l
c740: 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c  ock. A PENDING l
c750: 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ock is implement
c760: 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20  ed by obtaining 
c770: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a  a write-lock.  *
c780: 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e  * on the 'pendin
c790: 67 20 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e  g byte'. This en
c7a0: 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65  sures that no ne
c7b0: 77 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63  w SHARED locks c
c7c0: 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69  an be.  ** obtai
c7d0: 6e 65 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e  ned, but existin
c7e0: 67 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61  g SHARED locks a
c7f0: 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65  re allowed to pe
c800: 72 73 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73  rsist. A process
c810: 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68  .  ** does not h
c820: 61 76 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  ave to obtain a 
c830: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
c840: 20 74 68 65 20 77 61 79 20 74 6f 20 61 20 50 45   the way to a PE
c850: 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  NDING lock..  **
c860: 20 54 68 69 73 20 70 72 6f 70 65 72 74 79 20 69   This property i
c870: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 61 6c  s used by the al
c880: 67 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c  gorithm for roll
c890: 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e  ing back a journ
c8a0: 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74  al file.  ** aft
c8b0: 65 72 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a  er a crash..  **
c8c0: 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49  .  ** An EXCLUSI
c8d0: 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65  VE lock, obtaine
c8e0: 64 20 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e  d after a PENDIN
c8f0: 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  G lock is held, 
c900: 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e  is.  ** implemen
c910: 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67  ted by obtaining
c920: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
c930: 20 74 68 65 20 65 6e 74 69 72 65 20 27 73 68 61   the entire 'sha
c940: 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61  red byte.  ** ra
c950: 6e 67 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20  nge'. Since all 
c960: 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75  other locks requ
c970: 69 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ire a read-lock 
c980: 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79  on one of the by
c990: 74 65 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20  tes.  ** within 
c9a0: 74 68 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73  this range, this
c9b0: 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f   ensures that no
c9c0: 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65   other locks are
c9d0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a   held on the.  *
c9e0: 2a 20 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a  * database. .  *
c9f0: 2a 0a 20 20 2a 2a 20 54 68 65 20 72 65 61 73 6f  *.  ** The reaso
ca00: 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  n a single byte 
ca10: 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 69  cannot be used i
ca20: 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 27 73  nstead of the 's
ca30: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
ca40: 72 61 6e 67 65 27 20 69 73 20 74 68 61 74 20 73  range' is that s
ca50: 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ome versions of 
ca60: 77 69 6e 64 6f 77 73 20 64 6f 20 6e 6f 74 20 73  windows do not s
ca70: 75 70 70 6f 72 74 20 72 65 61 64 2d 6c 6f 63 6b  upport read-lock
ca80: 73 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69  s. By.  ** locki
ca90: 6e 67 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65  ng a random byte
caa0: 20 66 72 6f 6d 20 61 20 72 61 6e 67 65 2c 20 63   from a range, c
cab0: 6f 6e 63 75 72 72 65 6e 74 20 53 48 41 52 45 44  oncurrent SHARED
cac0: 20 6c 6f 63 6b 73 20 6d 61 79 20 65 78 69 73 74   locks may exist
cad0: 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68  .  ** even if th
cae0: 65 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74  e locking primit
caf0: 69 76 65 20 75 73 65 64 20 69 73 20 61 6c 77 61  ive used is alwa
cb00: 79 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2e  ys a write-lock.
cb10: 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  .  */.  int rc =
cb20: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
cb30: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
cb40: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
cb50: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
cb60: 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63 74  pInode;.  struct
cb70: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69   flock lock;.  i
cb80: 6e 74 20 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 0a  nt tErrno = 0;..
cb90: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
cba0: 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  );.  OSTRACE(("L
cbb0: 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77 61 73  OCK    %d %s was
cbc0: 20 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25   %s(%s,%d) pid=%
cbd0: 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69  d (unix)\n", pFi
cbe0: 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 61 7a 46  le->h,.      azF
cbf0: 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
cc00: 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70  k), azFileLock(p
cc10: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29  File->eFileLock)
cc20: 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f  ,.      azFileLo
cc30: 63 6b 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  ck(pFile->pInode
cc40: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 46  ->eFileLock), pF
cc50: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68  ile->pInode->nSh
cc60: 61 72 65 64 2c 0a 20 20 20 20 20 20 6f 73 47 65  ared,.      osGe
cc70: 74 70 69 64 28 30 29 29 29 3b 0a 0a 20 20 2f 2a  tpid(0)));..  /*
cc80: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
cc90: 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74  eady a lock of t
cca0: 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65  his type or more
ccb0: 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20   restrictive on 
ccc0: 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c  the.  ** unixFil
ccd0: 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44  e, do nothing. D
cce0: 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e 64  on't use the end
ccf0: 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68  _lock: exit path
cd00: 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e  , as.  ** unixEn
cd10: 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27  terMutex() hasn'
cd20: 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65  t been called ye
cd30: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  t..  */.  if( pF
cd40: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ile->eFileLock>=
cd50: 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
cd60: 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
cd70: 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72     %d %s ok (alr
cd80: 65 61 64 79 20 68 65 6c 64 29 20 28 75 6e 69 78  eady held) (unix
cd90: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
cda0: 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69              azFi
cdb0: 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
cdc0: 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )));.    return 
cdd0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
cde0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
cdf0: 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65  he locking seque
ce00: 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 2e 0a  nce is correct..
ce10: 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76    **  (1) We nev
ce20: 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c  er move from unl
ce30: 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e  ocked to anythin
ce40: 67 20 68 69 67 68 65 72 20 74 68 61 6e 20 73 68  g higher than sh
ce50: 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ared lock..  ** 
ce60: 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65   (2) SQLite neve
ce70: 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71  r explicitly req
ce80: 75 65 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c  uests a pendig l
ce90: 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41  ock..  **  (3) A
cea0: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20   shared lock is 
ceb0: 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e  always held when
cec0: 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20   a reserve lock 
ced0: 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20  is requested..  
cee0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  */.  assert( pFi
cef0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e  le->eFileLock!=N
cf00: 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c  O_LOCK || eFileL
cf10: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
cf20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46   );.  assert( eF
cf30: 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47  ileLock!=PENDING
cf40: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
cf50: 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45  t( eFileLock!=RE
cf60: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SERVED_LOCK || p
cf70: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
cf80: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
cf90: 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78  .  /* This mutex
cfa0: 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75   is needed becau
cfb0: 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  se pFile->pInode
cfc0: 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73   is shared acros
cfd0: 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20  s threads.  */. 
cfe0: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
cff0: 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46  );.  pInode = pF
d000: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20  ile->pInode;..  
d010: 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61  /* If some threa
d020: 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
d030: 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20   has a lock via 
d040: 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78  a different unix
d050: 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c  File*.  ** handl
d060: 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65 73  e that precludes
d070: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
d080: 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59  ock, return BUSY
d090: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46  ..  */.  if( (pF
d0a0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d  ile->eFileLock!=
d0b0: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
d0c0: 6b 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  k && .          
d0d0: 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  (pInode->eFileLo
d0e0: 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ck>=PENDING_LOCK
d0f0: 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48   || eFileLock>SH
d100: 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b  ARED_LOCK)).  ){
d110: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
d120: 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20  _BUSY;.    goto 
d130: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20  end_lock;.  }.. 
d140: 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44 20   /* If a SHARED 
d150: 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
d160: 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65  d, and some thre
d170: 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
d180: 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68  D already.  ** h
d190: 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 52  as a SHARED or R
d1a0: 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68  ESERVED lock, th
d1b0: 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66  en increment ref
d1c0: 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e  erence counts an
d1d0: 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51  d.  ** return SQ
d1e0: 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20  LITE_OK..  */.  
d1f0: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
d200: 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20  HARED_LOCK && . 
d210: 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46       (pInode->eF
d220: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
d230: 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
d240: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
d250: 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  VED_LOCK) ){.   
d260: 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
d270: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
d280: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
d290: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
d2a0: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
d2b0: 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
d2c0: 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65  d>0 );.    pFile
d2d0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
d2e0: 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70  ARED_LOCK;.    p
d2f0: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b  Inode->nShared++
d300: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c  ;.    pInode->nL
d310: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20  ock++;.    goto 
d320: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a  end_lock;.  }...
d330: 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c    /* A PENDING l
d340: 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65  ock is needed be
d350: 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 61  fore acquiring a
d360: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64   SHARED lock and
d370: 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71   before.  ** acq
d380: 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  uiring an EXCLUS
d390: 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74  IVE lock.  For t
d3a0: 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20  he SHARED lock, 
d3b0: 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c  the PENDING will
d3c0: 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65  .  ** be release
d3d0: 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c  d..  */.  lock.l
d3e0: 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63  _len = 1L;.  loc
d3f0: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
d400: 4b 5f 53 45 54 3b 0a 20 20 69 66 28 20 65 46 69  K_SET;.  if( eFi
d410: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
d420: 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65  OCK .      || (e
d430: 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
d440: 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c  IVE_LOCK && pFil
d450: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e  e->eFileLock<PEN
d460: 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a  DING_LOCK).  ){.
d470: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
d480: 3d 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  = (eFileLock==SH
d490: 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43  ARED_LOCK?F_RDLC
d4a0: 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20  K:F_WRLCK);.    
d4b0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
d4c0: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
d4d0: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
d4e0: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20  k(pFile, &lock) 
d4f0: 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  ){.      tErrno 
d500: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
d510: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
d520: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
d530: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
d540: 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  RR_LOCK);.      
d550: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42  if( rc!=SQLITE_B
d560: 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73  USY ){.        s
d570: 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
d580: 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
d590: 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
d5a0: 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d   end_lock;.    }
d5b0: 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 63  .  }...  /* If c
d5c0: 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74  ontrol gets to t
d5d0: 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
d5e0: 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61  actually go ahea
d5f0: 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20  d and make.  ** 
d600: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
d610: 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73   calls for the s
d620: 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20  pecified lock.. 
d630: 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
d640: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
d650: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
d660: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d  pInode->nShared=
d670: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
d680: 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ( pInode->eFileL
d690: 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ock==0 );.    as
d6a0: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
d6b0: 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e  _OK );..    /* N
d6c0: 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64 2d  ow get the read-
d6d0: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b  lock */.    lock
d6e0: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
d6f0: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f 63  D_FIRST;.    loc
d700: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
d710: 5f 53 49 5a 45 3b 0a 20 20 20 20 69 66 28 20 75  _SIZE;.    if( u
d720: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
d730: 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20  e, &lock) ){.   
d740: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
d750: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
d760: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
d770: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
d780: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
d790: 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  K);.    }..    /
d7a0: 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f  * Drop the tempo
d7b0: 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63  rary PENDING loc
d7c0: 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  k */.    lock.l_
d7d0: 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f  start = PENDING_
d7e0: 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  BYTE;.    lock.l
d7f0: 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 6c  _len = 1L;.    l
d800: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
d810: 4e 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 75 6e  NLCK;.    if( un
d820: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
d830: 2c 20 26 6c 6f 63 6b 29 20 26 26 20 72 63 3d 3d  , &lock) && rc==
d840: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d850: 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 75 6c 64     /* This could
d860: 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 20 6e   happen with a n
d870: 65 74 77 6f 72 6b 20 6d 6f 75 6e 74 20 2a 2f 0a  etwork mount */.
d880: 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
d890: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
d8a0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
d8b0: 4c 4f 43 4b 3b 20 0a 20 20 20 20 7d 0a 0a 20 20  LOCK; .    }..  
d8c0: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
d8d0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
d8e0: 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20  _BUSY ){.       
d8f0: 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
d900: 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
d910: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
d920: 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  to end_lock;.   
d930: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46   }else{.      pF
d940: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
d950: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
d960: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
d970: 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64  k++;.      pInod
d980: 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a  e->nShared = 1;.
d990: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
d9a0: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  ( eFileLock==EXC
d9b0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70  LUSIVE_LOCK && p
d9c0: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31  Inode->nShared>1
d9d0: 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72   ){.    /* We ar
d9e0: 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20  e trying for an 
d9f0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62  exclusive lock b
da00: 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  ut another threa
da10: 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a  d in this.    **
da20: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73   same process is
da30: 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
da40: 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f   shared lock. */
da50: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
da60: 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BUSY;.  }else{.
da70: 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
da80: 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53  st was for a RES
da90: 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
daa0: 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a  VE lock.  It is.
dab0: 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74      ** assumed t
dac0: 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53  hat there is a S
dad0: 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72  HARED or greater
dae0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
daf0: 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79  e.    ** already
db00: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
db10: 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65  ert( 0!=pFile->e
db20: 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  FileLock );.    
db30: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
db40: 57 52 4c 43 4b 3b 0a 0a 20 20 20 20 61 73 73 65  WRLCK;..    asse
db50: 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52  rt( eFileLock==R
db60: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
db70: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
db80: 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
db90: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
dba0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b  RESERVED_LOCK ){
dbb0: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  .      lock.l_st
dbc0: 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42  art = RESERVED_B
dbd0: 59 54 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  YTE;.      lock.
dbe0: 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20  l_len = 1L;.    
dbf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 6f 63  }else{.      loc
dc00: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
dc10: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
dc20: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41  lock.l_len = SHA
dc30: 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 0a  RED_SIZE;.    }.
dc40: 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c  .    if( unixFil
dc50: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
dc60: 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72  ck) ){.      tEr
dc70: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
dc80: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
dc90: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
dca0: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
dcb0: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20  _IOERR_LOCK);.  
dcc0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
dcd0: 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
dce0: 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
dcf0: 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
dd00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
dd10: 20 20 7d 0a 20 20 0a 0a 23 69 66 64 65 66 20 53    }.  ..#ifdef S
dd20: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
dd30: 20 53 65 74 20 75 70 20 74 68 65 20 74 72 61 6e   Set up the tran
dd40: 73 61 63 74 69 6f 6e 2d 63 6f 75 6e 74 65 72 20  saction-counter 
dd50: 63 68 61 6e 67 65 20 63 68 65 63 6b 69 6e 67 20  change checking 
dd60: 66 6c 61 67 73 20 77 68 65 6e 0a 20 20 2a 2a 20  flags when.  ** 
dd70: 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72  transitioning fr
dd80: 6f 6d 20 61 20 53 48 41 52 45 44 20 74 6f 20 61  om a SHARED to a
dd90: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20   RESERVED lock. 
dda0: 20 54 68 65 20 63 68 61 6e 67 65 0a 20 20 2a 2a   The change.  **
ddb0: 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20   from SHARED to 
ddc0: 52 45 53 45 52 56 45 44 20 6d 61 72 6b 73 20 74  RESERVED marks t
ddd0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
dde0: 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 77 72  a normal.  ** wr
ddf0: 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 28 6e  ite operation (n
de00: 6f 74 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ot a hot journal
de10: 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20 2a 2f   rollback)..  */
de20: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
de30: 45 5f 4f 4b 0a 20 20 20 26 26 20 70 46 69 6c 65  E_OK.   && pFile
de40: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ->eFileLock<=SHA
de50: 52 45 44 5f 4c 4f 43 4b 0a 20 20 20 26 26 20 65  RED_LOCK.   && e
de60: 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  FileLock==RESERV
de70: 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b 0a 20 20 20  ED_LOCK.  ){.   
de80: 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74   pFile->transCnt
de90: 72 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 70  rChng = 0;.    p
dea0: 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20 3d  File->dbUpdate =
deb0: 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69   0;.    pFile->i
dec0: 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 31  nNormalWrite = 1
ded0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20  ;.  }.#endif... 
dee0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
def0: 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  OK ){.    pFile-
df00: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
df10: 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f  leLock;.    pIno
df20: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
df30: 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c  eFileLock;.  }el
df40: 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  se if( eFileLock
df50: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
df60: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
df70: 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49  FileLock = PENDI
df80: 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e  NG_LOCK;.    pIn
df90: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
dfa0: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
dfb0: 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20   }..end_lock:.  
dfc0: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
dfd0: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f  ;.  OSTRACE(("LO
dfe0: 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28  CK    %d %s %s (
dff0: 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  unix)\n", pFile-
e000: 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65  >h, azFileLock(e
e010: 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20  FileLock), .    
e020: 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20    rc==SQLITE_OK 
e030: 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
e040: 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  "));.  return rc
e050: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74  ;.}../*.** Add t
e060: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
e070: 6f 72 20 75 73 65 64 20 62 79 20 66 69 6c 65 20  or used by file 
e080: 68 61 6e 64 6c 65 20 70 46 69 6c 65 20 74 6f 20  handle pFile to 
e090: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
e0a0: 67 0a 2a 2a 20 70 55 6e 75 73 65 64 20 6c 69 73  g.** pUnused lis
e0b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
e0c0: 64 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 75  d setPendingFd(u
e0d0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
e0e0: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
e0f0: 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
e100: 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78  ->pInode;.  Unix
e110: 55 6e 75 73 65 64 46 64 20 2a 70 20 3d 20 70 46  UnusedFd *p = pF
e120: 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20  ile->pUnused;.  
e130: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64  p->pNext = pInod
e140: 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70 49  e->pUnused;.  pI
e150: 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20  node->pUnused = 
e160: 70 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20  p;.  pFile->h = 
e170: 2d 31 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 55 6e  -1;.  pFile->pUn
e180: 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  used = 0;.}../*.
e190: 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
e1a0: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
e1b0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
e1c0: 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
e1d0: 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
e1e0: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
e1f0: 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
e200: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
e210: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
e220: 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
e230: 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
e240: 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
e250: 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
e260: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
e270: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
e280: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20  a no-op..** .** 
e290: 49 66 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  If handleNFSUnlo
e2a0: 63 6b 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ck is true, then
e2b0: 20 6f 6e 20 64 6f 77 6e 67 72 61 64 69 6e 67 20   on downgrading 
e2c0: 61 6e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  an EXCLUSIVE_LOC
e2d0: 4b 20 74 6f 20 53 48 41 52 45 44 0a 2a 2a 20 74  K to SHARED.** t
e2e0: 68 65 20 62 79 74 65 20 72 61 6e 67 65 20 69 73  he byte range is
e2f0: 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20 32 20   divided into 2 
e300: 70 61 72 74 73 20 61 6e 64 20 74 68 65 20 66 69  parts and the fi
e310: 72 73 74 20 70 61 72 74 20 69 73 20 75 6e 6c 6f  rst part is unlo
e320: 63 6b 65 64 20 74 68 65 6e 0a 2a 2a 20 73 65 74  cked then.** set
e330: 20 74 6f 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c   to a read lock,
e340: 20 74 68 65 6e 20 74 68 65 20 6f 74 68 65 72 20   then the other 
e350: 70 61 72 74 20 69 73 20 73 69 6d 70 6c 79 20 75  part is simply u
e360: 6e 6c 6f 63 6b 65 64 2e 20 20 54 68 69 73 20 77  nlocked.  This w
e370: 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f 75 6e 64 20  orks .** around 
e380: 61 20 62 75 67 20 69 6e 20 42 53 44 20 4e 46 53  a bug in BSD NFS
e390: 20 6c 6f 63 6b 64 20 28 61 6c 73 6f 20 73 65 65   lockd (also see
e3a0: 6e 20 6f 6e 20 4d 61 63 4f 53 58 20 31 30 2e 33  n on MacOSX 10.3
e3b0: 2b 29 20 74 68 61 74 20 66 61 69 6c 73 20 74 6f  +) that fails to
e3c0: 20 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20   .** remove the 
e3d0: 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 61 20  write lock on a 
e3e0: 72 65 67 69 6f 6e 20 77 68 65 6e 20 61 20 72 65  region when a re
e3f0: 61 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 2e 0a  ad lock is set..
e400: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f  */.static int po
e410: 73 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  sixUnlock(sqlite
e420: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
e430: 65 46 69 6c 65 4c 6f 63 6b 2c 20 69 6e 74 20 68  eFileLock, int h
e440: 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 29 7b  andleNFSUnlock){
e450: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
e460: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
e470: 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  id;.  unixInodeI
e480: 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 73  nfo *pInode;.  s
e490: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
e4a0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
e4b0: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
e4c0: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
e4d0: 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20  TRACE(("UNLOCK  
e4e0: 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64 2c  %d %d was %d(%d,
e4f0: 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69 78  %d) pid=%d (unix
e500: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
e510: 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20  eFileLock,.     
e520: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
e530: 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  k, pFile->pInode
e540: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69  ->eFileLock, pFi
e550: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  le->pInode->nSha
e560: 72 65 64 2c 0a 20 20 20 20 20 20 6f 73 47 65 74  red,.      osGet
e570: 70 69 64 28 30 29 29 29 3b 0a 0a 20 20 61 73 73  pid(0)));..  ass
e580: 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ert( eFileLock<=
e590: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
e5a0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
e5b0: 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b  eLock<=eFileLock
e5c0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
e5d0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
e5e0: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
e5f0: 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69  ;.  pInode = pFi
e600: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73  le->pInode;.  as
e610: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
e620: 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69 66  hared!=0 );.  if
e630: 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
e640: 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
e650: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  {.    assert( pI
e660: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
e670: 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  =pFile->eFileLoc
e680: 6b 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  k );..#ifdef SQL
e690: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a  ITE_DEBUG.    /*
e6a0: 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61   When reducing a
e6b0: 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20   lock such that 
e6c0: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
e6d0: 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a  can start.    **
e6e0: 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74   reading the dat
e6f0: 61 62 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e  abase file again
e700: 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  , make sure that
e710: 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
e720: 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
e730: 77 61 73 20 75 70 64 61 74 65 64 20 69 66 20 61  was updated if a
e740: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  ny part of the d
e750: 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66  atabase.    ** f
e760: 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66  ile changed.  If
e770: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
e780: 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20   counter is not 
e790: 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20  updated,.    ** 
e7a0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
e7b0: 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69  s to the same fi
e7c0: 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61  le might not rea
e7d0: 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  lize that.    **
e7e0: 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 63 68   the file has ch
e7f0: 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20  anged and hence 
e800: 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74  might not know t
e810: 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20  o flush their.  
e820: 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65    ** cache.  The
e830: 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20   use of a stale 
e840: 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74  cache can lead t
e850: 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  o database corru
e860: 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ption..    */.  
e870: 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61    pFile->inNorma
e880: 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64  lWrite = 0;.#end
e890: 69 66 0a 0a 20 20 20 20 2f 2a 20 64 6f 77 6e 67  if..    /* downg
e8a0: 72 61 64 69 6e 67 20 74 6f 20 61 20 73 68 61 72  rading to a shar
e8b0: 65 64 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53 20 69  ed lock on NFS i
e8c0: 6e 76 6f 6c 76 65 73 20 63 6c 65 61 72 69 6e 67  nvolves clearing
e8d0: 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 0a   the write lock.
e8e0: 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 65 73      ** before es
e8f0: 74 61 62 6c 69 73 68 69 6e 67 20 74 68 65 20 72  tablishing the r
e900: 65 61 64 6c 6f 63 6b 20 2d 20 74 6f 20 61 76 6f  eadlock - to avo
e910: 69 64 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74  id a race condit
e920: 69 6f 6e 20 77 65 20 64 6f 77 6e 67 72 61 64 65  ion we downgrade
e930: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b  .    ** the lock
e940: 20 69 6e 20 32 20 62 6c 6f 63 6b 73 2c 20 73 6f   in 2 blocks, so
e950: 20 74 68 61 74 20 70 61 72 74 20 6f 66 20 74 68   that part of th
e960: 65 20 72 61 6e 67 65 20 77 69 6c 6c 20 62 65 20  e range will be 
e970: 63 6f 76 65 72 65 64 20 62 79 20 61 20 0a 20 20  covered by a .  
e980: 20 20 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20    ** write lock 
e990: 75 6e 74 69 6c 20 74 68 65 20 72 65 73 74 20 69  until the rest i
e9a0: 73 20 63 6f 76 65 72 65 64 20 62 79 20 61 20 72  s covered by a r
e9b0: 65 61 64 20 6c 6f 63 6b 3a 0a 20 20 20 20 2a 2a  ead lock:.    **
e9c0: 20 20 31 3a 20 20 20 5b 57 57 57 57 57 5d 0a 20    1:   [WWWWW]. 
e9d0: 20 20 20 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e 2e     **  2:   [...
e9e0: 2e 57 5d 0a 20 20 20 20 2a 2a 20 20 33 3a 20 20  .W].    **  3:  
e9f0: 20 5b 52 52 52 52 57 5d 0a 20 20 20 20 2a 2a 20   [RRRRW].    ** 
ea00: 20 34 3a 20 20 20 5b 52 52 52 52 2e 5d 0a 20 20   4:   [RRRR.].  
ea10: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 46 69    */.    if( eFi
ea20: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
ea30: 4f 43 4b 20 29 7b 0a 23 69 66 20 21 64 65 66 69  OCK ){.#if !defi
ea40: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c  ned(__APPLE__) |
ea50: 7c 20 21 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  | !SQLITE_ENABLE
ea60: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
ea70: 20 20 20 20 20 28 76 6f 69 64 29 68 61 6e 64 6c       (void)handl
ea80: 65 4e 46 53 55 6e 6c 6f 63 6b 3b 0a 20 20 20 20  eNFSUnlock;.    
ea90: 20 20 61 73 73 65 72 74 28 20 68 61 6e 64 6c 65    assert( handle
eaa0: 4e 46 53 55 6e 6c 6f 63 6b 3d 3d 30 20 29 3b 0a  NFSUnlock==0 );.
eab0: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
eac0: 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
ead0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
eae0: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20  OCKING_STYLE.   
eaf0: 20 20 20 69 66 28 20 68 61 6e 64 6c 65 4e 46 53     if( handleNFS
eb00: 55 6e 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  Unlock ){.      
eb10: 20 20 69 6e 74 20 74 45 72 72 6e 6f 3b 20 20 20    int tErrno;   
eb20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
eb30: 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 73  rror code from s
eb40: 79 73 74 65 6d 20 63 61 6c 6c 20 65 72 72 6f 72  ystem call error
eb50: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 66 66  s */.        off
eb60: 5f 74 20 64 69 76 53 69 7a 65 20 3d 20 53 48 41  _t divSize = SHA
eb70: 52 45 44 5f 53 49 5a 45 20 2d 20 31 3b 0a 20 20  RED_SIZE - 1;.  
eb80: 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 6c        .        l
eb90: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
eba0: 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f  NLCK;.        lo
ebb0: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
ebc0: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20  EK_SET;.        
ebd0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
ebe0: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
ebf0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
ec00: 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20  = divSize;.     
ec10: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
ec20: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
ec30: 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  )==(-1) ){.     
ec40: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
ec50: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
ec60: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
ec70: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  _UNLOCK;.       
ec80: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
ec90: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
eca0: 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
ecb0: 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
ecc0: 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  rrno);.         
ecd0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74   }.          got
ece0: 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20  o end_unlock;.  
ecf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ed00: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
ed10: 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c  RDLCK;.        l
ed20: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
ed30: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20  EEK_SET;.       
ed40: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
ed50: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
ed60: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
ed70: 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20   = divSize;.    
ed80: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
ed90: 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
eda0: 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20  k)==(-1) ){.    
edb0: 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
edc0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
edd0: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
ede0: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
edf0: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
ee00: 45 52 52 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20 20  ERR_RDLOCK);.   
ee10: 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f         if( IS_LO
ee20: 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
ee30: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 6f 72              stor
ee40: 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
ee50: 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  , tErrno);.     
ee60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
ee70: 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b   goto end_unlock
ee80: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ee90: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
eea0: 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20  = F_UNLCK;.     
eeb0: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
eec0: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
eed0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
eee0: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
eef0: 2b 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20  +divSize;.      
ef00: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
ef10: 48 41 52 45 44 5f 53 49 5a 45 2d 64 69 76 53 69  HARED_SIZE-divSi
ef20: 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ze;.        if( 
ef30: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
ef40: 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29  le, &lock)==(-1)
ef50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45   ){.          tE
ef60: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
ef70: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
ef80: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
ef90: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
efa0: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
efb0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
efc0: 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
efd0: 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
efe0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
eff0: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75        goto end_u
f000: 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  nlock;.        }
f010: 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  .      }else.#en
f020: 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f  dif /* defined(_
f030: 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
f040: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
f050: 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 20 20 20 20  NG_STYLE */.    
f060: 20 20 7b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b    {.        lock
f070: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
f080: 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
f090: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
f0a0: 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
f0b0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
f0c0: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
f0d0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
f0e0: 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
f0f0: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
f100: 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
f110: 6b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  k) ){.          
f120: 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68  /* In theory, th
f130: 65 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46 69  e call to unixFi
f140: 6c 65 4c 6f 63 6b 28 29 20 63 61 6e 6e 6f 74 20  leLock() cannot 
f150: 66 61 69 6c 20 62 65 63 61 75 73 65 20 61 6e 6f  fail because ano
f160: 74 68 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a  ther.          *
f170: 2a 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c  * process is hol
f180: 64 69 6e 67 20 61 6e 20 69 6e 63 6f 6d 70 61 74  ding an incompat
f190: 69 62 6c 65 20 6c 6f 63 6b 2e 20 49 66 20 69 74  ible lock. If it
f1a0: 20 64 6f 65 73 2c 20 74 68 69 73 20 0a 20 20 20   does, this .   
f1b0: 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 61         ** indica
f1c0: 74 65 73 20 74 68 61 74 20 74 68 65 20 6f 74 68  tes that the oth
f1d0: 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f  er process is no
f1e0: 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  t following the 
f1f0: 6c 6f 63 6b 69 6e 67 0a 20 20 20 20 20 20 20 20  locking.        
f200: 20 20 2a 2a 20 70 72 6f 74 6f 63 6f 6c 2e 20 49    ** protocol. I
f210: 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20  f this happens, 
f220: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
f230: 45 52 52 5f 52 44 4c 4f 43 4b 2e 20 52 65 74 75  ERR_RDLOCK. Retu
f240: 72 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  rning.          
f250: 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77  ** SQLITE_BUSY w
f260: 6f 75 6c 64 20 63 6f 6e 66 75 73 65 20 74 68 65  ould confuse the
f270: 20 75 70 70 65 72 20 6c 61 79 65 72 20 28 69 6e   upper layer (in
f280: 20 70 72 61 63 74 69 63 65 20 69 74 20 63 61 75   practice it cau
f290: 73 65 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ses .          *
f2a0: 2a 20 61 6e 20 61 73 73 65 72 74 20 74 6f 20 66  * an assert to f
f2b0: 61 69 6c 29 2e 20 2a 2f 20 0a 20 20 20 20 20 20  ail). */ .      
f2c0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
f2d0: 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3b 0a 20 20  IOERR_RDLOCK;.  
f2e0: 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
f2f0: 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72  tErrno(pFile, er
f300: 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rno);.          
f310: 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b  goto end_unlock;
f320: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f330: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63   }.    }.    loc
f340: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
f350: 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  CK;.    lock.l_w
f360: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
f370: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  ;.    lock.l_sta
f380: 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  rt = PENDING_BYT
f390: 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  E;.    lock.l_le
f3a0: 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65 72 74 28  n = 2L;  assert(
f3b0: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d   PENDING_BYTE+1=
f3c0: 3d 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 29  =RESERVED_BYTE )
f3d0: 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69  ;.    if( unixFi
f3e0: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
f3f0: 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ock)==0 ){.     
f400: 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
f410: 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
f420: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
f430: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
f440: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  OERR_UNLOCK;.   
f450: 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
f460: 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b  o(pFile, errno);
f470: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
f480: 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  unlock;.    }.  
f490: 7d 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  }.  if( eFileLoc
f4a0: 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20  k==NO_LOCK ){.  
f4b0: 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
f4c0: 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63  he shared lock c
f4d0: 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65  ounter.  Release
f4e0: 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20   the lock using 
f4f0: 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c  an.    ** OS cal
f500: 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20  l only when all 
f510: 74 68 72 65 61 64 73 20 69 6e 20 74 68 69 73 20  threads in this 
f520: 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76  same process hav
f530: 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a  e released.    *
f540: 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20  * the lock..    
f550: 2a 2f 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  */.    pInode->n
f560: 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66  Shared--;.    if
f570: 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
f580: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c 6f  d==0 ){.      lo
f590: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
f5a0: 4c 43 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  LCK;.      lock.
f5b0: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
f5c0: 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  SET;.      lock.
f5d0: 6c 5f 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c  l_start = lock.l
f5e0: 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 20  _len = 0L;.     
f5f0: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
f600: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d  k(pFile, &lock)=
f610: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  =0 ){.        pI
f620: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
f630: 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  = NO_LOCK;.     
f640: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f650: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
f660: 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  R_UNLOCK;.      
f670: 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
f680: 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a  (pFile, errno);.
f690: 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
f6a0: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
f6b0: 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69  OCK;.        pFi
f6c0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
f6d0: 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d  NO_LOCK;.      }
f6e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
f6f0: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 63 6f 75  ecrement the cou
f700: 6e 74 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69  nt of locks agai
f710: 6e 73 74 20 74 68 69 73 20 73 61 6d 65 20 66 69  nst this same fi
f720: 6c 65 2e 20 20 57 68 65 6e 20 74 68 65 0a 20 20  le.  When the.  
f730: 20 20 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63 68    ** count reach
f740: 65 73 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61  es zero, close a
f750: 6e 79 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65  ny other file de
f760: 73 63 72 69 70 74 6f 72 73 20 77 68 6f 73 65 20  scriptors whose 
f770: 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61 73  close.    ** was
f780: 20 64 65 66 65 72 72 65 64 20 62 65 63 61 75 73   deferred becaus
f790: 65 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  e of outstanding
f7a0: 20 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20   locks..    */. 
f7b0: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
f7c0: 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  --;.    assert( 
f7d0: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30  pInode->nLock>=0
f7e0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f   );.    if( pIno
f7f0: 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  de->nLock==0 ){.
f800: 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69        closePendi
f810: 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20  ngFds(pFile);.  
f820: 20 20 7d 0a 20 20 7d 0a 0a 65 6e 64 5f 75 6e 6c    }.  }..end_unl
f830: 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65  ock:.  unixLeave
f840: 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72  Mutex();.  if( r
f850: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70  c==SQLITE_OK ) p
f860: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
f870: 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72  = eFileLock;.  r
f880: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
f890: 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
f8a0: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
f8b0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
f8c0: 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
f8d0: 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
f8e0: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
f8f0: 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
f900: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
f910: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
f920: 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
f930: 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
f940: 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
f950: 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
f960: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
f970: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
f980: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
f990: 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63  ic int unixUnloc
f9a0: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
f9b0: 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
f9c0: 6b 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  k){.#if SQLITE_M
f9d0: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
f9e0: 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
f9f0: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
fa00: 7c 7c 20 28 28 75 6e 69 78 46 69 6c 65 20 2a 29  || ((unixFile *)
fa10: 69 64 29 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d  id)->nFetchOut==
fa20: 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  0 );.#endif.  re
fa30: 74 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b  turn posixUnlock
fa40: 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20  (id, eFileLock, 
fa50: 30 29 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  0);.}..#if SQLIT
fa60: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
fa70: 30 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  0.static int uni
fa80: 78 4d 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c  xMapfile(unixFil
fa90: 65 20 2a 70 46 64 2c 20 69 36 34 20 6e 42 79 74  e *pFd, i64 nByt
faa0: 65 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  e);.static void 
fab0: 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e  unixUnmapfile(un
fac0: 69 78 46 69 6c 65 20 2a 70 46 64 29 3b 0a 23 65  ixFile *pFd);.#e
fad0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
fae0: 20 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72   function perfor
faf0: 6d 73 20 74 68 65 20 70 61 72 74 73 20 6f 66 20  ms the parts of 
fb00: 74 68 65 20 22 63 6c 6f 73 65 20 66 69 6c 65 22  the "close file"
fb10: 20 6f 70 65 72 61 74 69 6f 6e 20 0a 2a 2a 20 63   operation .** c
fb20: 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63  ommon to all loc
fb30: 6b 69 6e 67 20 73 63 68 65 6d 65 73 2e 20 49 74  king schemes. It
fb40: 20 63 6c 6f 73 65 73 20 74 68 65 20 64 69 72 65   closes the dire
fb50: 63 74 6f 72 79 20 61 6e 64 20 66 69 6c 65 0a 2a  ctory and file.*
fb60: 2a 20 68 61 6e 64 6c 65 73 2c 20 69 66 20 74 68  * handles, if th
fb70: 65 79 20 61 72 65 20 76 61 6c 69 64 2c 20 61 6e  ey are valid, an
fb80: 64 20 73 65 74 73 20 61 6c 6c 20 66 69 65 6c 64  d sets all field
fb90: 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c  s of the unixFil
fba0: 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74  e.** structure t
fbb0: 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  o 0..**.** It is
fbc0: 20 2a 6e 6f 74 2a 20 6e 65 63 65 73 73 61 72 79   *not* necessary
fbd0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74   to hold the mut
fbe0: 65 78 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ex when this rou
fbf0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 0a  tine is called,.
fc00: 2a 2a 20 65 76 65 6e 20 6f 6e 20 56 78 57 6f 72  ** even on VxWor
fc10: 6b 73 2e 20 20 41 20 6d 75 74 65 78 20 77 69 6c  ks.  A mutex wil
fc20: 6c 20 62 65 20 61 63 71 75 69 72 65 64 20 6f 6e  l be acquired on
fc30: 20 56 78 57 6f 72 6b 73 20 62 79 20 74 68 65 0a   VxWorks by the.
fc40: 2a 2a 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73  ** vxworksReleas
fc50: 65 46 69 6c 65 49 64 28 29 20 72 6f 75 74 69 6e  eFileId() routin
fc60: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
fc70: 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 73   closeUnixFile(s
fc80: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
fc90: 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
fca0: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
fcb0: 29 69 64 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  )id;.#if SQLITE_
fcc0: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
fcd0: 20 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28    unixUnmapfile(
fce0: 70 46 69 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20  pFile);.#endif. 
fcf0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30   if( pFile->h>=0
fd00: 20 29 7b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63   ){.    robust_c
fd10: 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 46 69 6c  lose(pFile, pFil
fd20: 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  e->h, __LINE__);
fd30: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20  .    pFile->h = 
fd40: 2d 31 3b 0a 20 20 7d 0a 23 69 66 20 4f 53 5f 56  -1;.  }.#if OS_V
fd50: 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 70 46 69  XWORKS.  if( pFi
fd60: 6c 65 2d 3e 70 49 64 20 29 7b 0a 20 20 20 20 69  le->pId ){.    i
fd70: 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  f( pFile->ctrlFl
fd80: 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44  ags & UNIXFILE_D
fd90: 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 20 20 6f  ELETE ){.      o
fda0: 73 55 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 70  sUnlink(pFile->p
fdb0: 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  Id->zCanonicalNa
fdc0: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76  me);.    }.    v
fdd0: 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c  xworksReleaseFil
fde0: 65 49 64 28 70 46 69 6c 65 2d 3e 70 49 64 29 3b  eId(pFile->pId);
fdf0: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 49 64 20  .    pFile->pId 
fe00: 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  = 0;.  }.#endif.
fe10: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e  #ifdef SQLITE_UN
fe20: 4c 49 4e 4b 5f 41 46 54 45 52 5f 43 4c 4f 53 45  LINK_AFTER_CLOSE
fe30: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74  .  if( pFile->ct
fe40: 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49  rlFlags & UNIXFI
fe50: 4c 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20  LE_DELETE ){.   
fe60: 20 6f 73 55 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d   osUnlink(pFile-
fe70: 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c  >zPath);.    sql
fe80: 69 74 65 33 5f 66 72 65 65 28 2a 28 63 68 61 72  ite3_free(*(char
fe90: 2a 2a 29 26 70 46 69 6c 65 2d 3e 7a 50 61 74 68  **)&pFile->zPath
fea0: 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a 50  );.    pFile->zP
feb0: 61 74 68 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e  ath = 0;.  }.#en
fec0: 64 69 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22  dif.  OSTRACE(("
fed0: 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c  CLOSE   %-3d\n",
fee0: 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 4f   pFile->h));.  O
fef0: 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a  penCounter(-1);.
ff00: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
ff10: 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 29 3b 0a  File->pUnused);.
ff20: 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20    memset(pFile, 
ff30: 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69  0, sizeof(unixFi
ff40: 6c 65 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  le));.  return S
ff50: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
ff60: 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
ff70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
ff80: 6e 69 78 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  nixClose(sqlite3
ff90: 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e  _file *id){.  in
ffa0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
ffb0: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
ffc0: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  ile = (unixFile 
ffd0: 2a 29 69 64 3b 0a 20 20 76 65 72 69 66 79 44 62  *)id;.  verifyDb
ffe0: 46 69 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20 75  File(pFile);.  u
fff0: 6e 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  nixUnlock(id, NO
10000 5f 4c 4f 43 4b 29 3b 0a 20 20 75 6e 69 78 45 6e  _LOCK);.  unixEn
10010 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f  terMutex();..  /
10020 2a 20 75 6e 69 78 46 69 6c 65 2e 70 49 6e 6f 64  * unixFile.pInod
10030 65 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69  e is always vali
10040 64 20 68 65 72 65 2e 20 4f 74 68 65 72 77 69 73  d here. Otherwis
10050 65 2c 20 61 20 64 69 66 66 65 72 65 6e 74 20 63  e, a different c
10060 6c 6f 73 65 0a 20 20 2a 2a 20 72 6f 75 74 69 6e  lose.  ** routin
10070 65 20 28 65 2e 67 2e 20 6e 6f 6c 6f 63 6b 43 6c  e (e.g. nolockCl
10080 6f 73 65 28 29 29 20 77 6f 75 6c 64 20 62 65 20  ose()) would be 
10090 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 2e 0a  called instead..
100a0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
100b0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c  File->pInode->nL
100c0 6f 63 6b 3e 30 20 7c 7c 20 70 46 69 6c 65 2d 3e  ock>0 || pFile->
100d0 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
100e0 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Lock==0 );.  if(
100f0 20 41 4c 57 41 59 53 28 70 46 69 6c 65 2d 3e 70   ALWAYS(pFile->p
10100 49 6e 6f 64 65 29 20 26 26 20 70 46 69 6c 65 2d  Inode) && pFile-
10110 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29  >pInode->nLock )
10120 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
10130 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
10140 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20  g locks, do not 
10150 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74  actually close t
10160 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20  he file just.   
10170 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20   ** yet because 
10180 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72  that would clear
10190 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49   those locks.  I
101a0 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20  nstead, add the 
101b0 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73 63  file.    ** desc
101c0 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65  riptor to pInode
101d0 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 20  ->pUnused list. 
101e0 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f   It will be auto
101f0 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64  matically closed
10200 20 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68   .    ** when th
10210 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63  e last lock is c
10220 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  leared..    */. 
10230 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28     setPendingFd(
10240 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65  pFile);.  }.  re
10250 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70  leaseInodeInfo(p
10260 46 69 6c 65 29 3b 0a 20 20 72 63 20 3d 20 63 6c  File);.  rc = cl
10270 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b  oseUnixFile(id);
10280 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
10290 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  x();.  return rc
102a0 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}../**********
102b0 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
102c0 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c  posix advisory l
102d0 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
102e0 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
102f0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
10300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10340 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
10350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10390 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
103a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
103b0 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69  **** No-op Locki
103c0 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
103d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
103e0 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74  *****.**.** Of t
103f0 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69  he various locki
10400 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ng implementatio
10410 6e 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68  ns available, th
10420 69 73 20 69 73 20 62 79 20 66 61 72 20 74 68 65  is is by far the
10430 0a 2a 2a 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c  .** simplest:  l
10440 6f 63 6b 69 6e 67 20 69 73 20 69 67 6e 6f 72 65  ocking is ignore
10450 64 2e 20 20 4e 6f 20 61 74 74 65 6d 70 74 20 69  d.  No attempt i
10460 73 20 6d 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74  s made to lock t
10470 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
10480 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20  ile for reading 
10490 6f 72 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a  or writing..**.*
104a0 2a 20 54 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d  * This locking m
104b0 6f 64 65 20 69 73 20 61 70 70 72 6f 70 72 69 61  ode is appropria
104c0 74 65 20 66 6f 72 20 75 73 65 20 6f 6e 20 72 65  te for use on re
104d0 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
104e0 73 0a 2a 2a 20 28 65 78 3a 20 64 61 74 61 62 61  s.** (ex: databa
104f0 73 65 73 20 74 68 61 74 20 61 72 65 20 62 75 72  ses that are bur
10500 6e 65 64 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c  ned into CD-ROM,
10510 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 29 20 20   for example.)  
10520 49 74 20 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62  It can.** also b
10530 65 20 75 73 65 64 20 69 66 20 74 68 65 20 61 70  e used if the ap
10540 70 6c 69 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79  plication employ
10550 73 20 73 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20  s some external 
10560 6d 65 63 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20  mechanism to.** 
10570 70 72 65 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e  prevent simultan
10580 65 6f 75 73 20 61 63 63 65 73 73 20 6f 66 20 74  eous access of t
10590 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
105a0 20 62 79 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a   by two or more.
105b0 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
105c0 65 63 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68  ections.  But th
105d0 65 72 65 20 69 73 20 61 20 73 65 72 69 6f 75 73  ere is a serious
105e0 20 72 69 73 6b 20 6f 66 20 64 61 74 61 62 61 73   risk of databas
105f0 65 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20  e.** corruption 
10600 69 66 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  if this locking 
10610 6d 6f 64 65 20 69 73 20 75 73 65 64 20 69 6e 20  mode is used in 
10620 73 69 74 75 61 74 69 6f 6e 73 20 77 68 65 72 65  situations where
10630 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74   multiple.** dat
10640 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
10650 73 20 61 72 65 20 61 63 63 65 73 73 69 6e 67 20  s are accessing 
10660 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
10670 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61  e file at the sa
10680 6d 65 0a 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f  me.** time and o
10690 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
106a0 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ose connections 
106b0 61 72 65 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a  are writing..*/.
106c0 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f  .static int nolo
106d0 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
106e0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
106f0 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 2a   *NotUsed, int *
10700 70 52 65 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53  pResOut){.  UNUS
10710 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
10720 55 73 65 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75  Used);.  *pResOu
10730 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  t = 0;.  return 
10740 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61  SQLITE_OK;.}.sta
10750 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f  tic int nolockLo
10760 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
10770 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f  *NotUsed, int No
10780 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45  tUsed2){.  UNUSE
10790 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
107a0 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b  Used, NotUsed2);
107b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
107c0 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  _OK;.}.static in
107d0 74 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73  t nolockUnlock(s
107e0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74  qlite3_file *Not
107f0 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65  Used, int NotUse
10800 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d2){.  UNUSED_PA
10810 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
10820 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72  , NotUsed2);.  r
10830 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10840 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
10850 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  the file..*/.sta
10860 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c  tic int nolockCl
10870 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
10880 20 2a 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e   *id) {.  return
10890 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
108a0 64 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  d);.}../********
108b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
108c0 6f 66 20 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63  of the no-op loc
108d0 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
108e0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
108f0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
10900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10940 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
10950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10990 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
109a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109b0 2a 20 42 65 67 69 6e 20 64 6f 74 2d 66 69 6c 65  * Begin dot-file
109c0 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
109d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109e0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
109f0 65 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  e dotfile lockin
10a00 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  g implementation
10a10 20 75 73 65 73 20 74 68 65 20 65 78 69 73 74 65   uses the existe
10a20 6e 63 65 20 6f 66 20 73 65 70 61 72 61 74 65 20  nce of separate 
10a30 6c 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73 20 28 72  lock.** files (r
10a40 65 61 6c 6c 79 20 61 20 64 69 72 65 63 74 6f 72  eally a director
10a50 79 29 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63  y) to control ac
10a60 63 65 73 73 20 74 6f 20 74 68 65 20 64 61 74 61  cess to the data
10a70 62 61 73 65 2e 20 20 54 68 69 73 20 77 6f 72 6b  base.  This work
10a80 73 0a 2a 2a 20 6f 6e 20 6a 75 73 74 20 61 62 6f  s.** on just abo
10a90 75 74 20 65 76 65 72 79 20 66 69 6c 65 73 79 73  ut every filesys
10aa0 74 65 6d 20 69 6d 61 67 69 6e 61 62 6c 65 2e 20  tem imaginable. 
10ab0 20 42 75 74 20 74 68 65 72 65 20 61 72 65 20 73   But there are s
10ac0 65 72 69 6f 75 73 20 64 6f 77 6e 73 69 64 65 73  erious downsides
10ad0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  :.**.**    (1)  
10ae0 54 68 65 72 65 20 69 73 20 7a 65 72 6f 20 63 6f  There is zero co
10af0 6e 63 75 72 72 65 6e 63 79 2e 20 20 41 20 73 69  ncurrency.  A si
10b00 6e 67 6c 65 20 72 65 61 64 65 72 20 62 6c 6f 63  ngle reader bloc
10b10 6b 73 20 61 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20  ks all other.** 
10b20 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69          connecti
10b30 6f 6e 73 20 66 72 6f 6d 20 72 65 61 64 69 6e 67  ons from reading
10b40 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
10b50 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
10b60 20 20 20 28 32 29 20 20 41 6e 20 61 70 70 6c 69     (2)  An appli
10b70 63 61 74 69 6f 6e 20 63 72 61 73 68 20 6f 72 20  cation crash or 
10b80 70 6f 77 65 72 20 6c 6f 73 73 20 63 61 6e 20 6c  power loss can l
10b90 65 61 76 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20  eave stale lock 
10ba0 66 69 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  files.**        
10bb0 20 73 69 74 74 69 6e 67 20 61 72 6f 75 6e 64 20   sitting around 
10bc0 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
10bd0 63 6c 65 61 72 65 64 20 6d 61 6e 75 61 6c 6c 79  cleared manually
10be0 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76 65 72 74 68 65  ..**.** Neverthe
10bf0 6c 65 73 73 2c 20 61 20 64 6f 74 6c 6f 63 6b 20  less, a dotlock 
10c00 69 73 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  is an appropriat
10c10 65 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 66  e locking mode f
10c20 6f 72 20 75 73 65 20 69 66 20 6e 6f 0a 2a 2a 20  or use if no.** 
10c30 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 73 74  other locking st
10c40 72 61 74 65 67 79 20 69 73 20 61 76 61 69 6c 61  rategy is availa
10c50 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 74 66 69  ble..**.** Dotfi
10c60 6c 65 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73  le locking works
10c70 20 62 79 20 63 72 65 61 74 69 6e 67 20 61 20 73   by creating a s
10c80 75 62 64 69 72 65 63 74 6f 72 79 20 69 6e 20 74  ubdirectory in t
10c90 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72  he same director
10ca0 79 20 61 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  y as.** the data
10cb0 62 61 73 65 20 61 6e 64 20 77 69 74 68 20 74 68  base and with th
10cc0 65 20 73 61 6d 65 20 6e 61 6d 65 20 62 75 74 20  e same name but 
10cd0 77 69 74 68 20 61 20 22 2e 6c 6f 63 6b 22 20 65  with a ".lock" e
10ce0 78 74 65 6e 73 69 6f 6e 20 61 64 64 65 64 2e 0a  xtension added..
10cf0 2a 2a 20 54 68 65 20 65 78 69 73 74 65 6e 63 65  ** The existence
10d00 20 6f 66 20 61 20 6c 6f 63 6b 20 64 69 72 65 63   of a lock direc
10d10 74 6f 72 79 20 69 6d 70 6c 69 65 73 20 61 6e 20  tory implies an 
10d20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
10d30 20 41 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 6c 6f   All other.** lo
10d40 63 6b 20 74 79 70 65 73 20 28 53 48 41 52 45 44  ck types (SHARED
10d50 2c 20 52 45 53 45 52 56 45 44 2c 20 50 45 4e 44  , RESERVED, PEND
10d60 49 4e 47 29 20 61 72 65 20 6d 61 70 70 65 64 20  ING) are mapped 
10d70 69 6e 74 6f 20 45 58 43 4c 55 53 49 56 45 2e 0a  into EXCLUSIVE..
10d80 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69  */../*.** The fi
10d90 6c 65 20 73 75 66 66 69 78 20 61 64 64 65 64 20  le suffix added 
10da0 74 6f 20 74 68 65 20 64 61 74 61 20 62 61 73 65  to the data base
10db0 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6f 72 64   filename in ord
10dc0 65 72 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  er to create the
10dd0 0a 2a 2a 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f  .** lock directo
10de0 72 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44  ry..*/.#define D
10df0 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 20 22 2e  OTLOCK_SUFFIX ".
10e00 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  lock"../*.** Thi
10e10 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
10e20 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
10e30 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
10e40 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
10e50 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
10e60 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
10e70 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
10e80 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
10e90 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
10ea0 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
10eb0 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
10ec0 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
10ed0 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
10ee0 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
10ef0 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
10f00 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
10f10 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
10f20 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
10f30 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 64 6f 74 66 69  ..**.** In dotfi
10f40 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 65 69 74 68  le locking, eith
10f50 65 72 20 61 20 6c 6f 63 6b 20 65 78 69 73 74 73  er a lock exists
10f60 20 6f 72 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e   or it does not.
10f70 20 20 53 6f 20 69 6e 20 74 68 69 73 0a 2a 2a 20    So in this.** 
10f80 76 61 72 69 61 74 69 6f 6e 20 6f 66 20 43 68 65  variation of Che
10f90 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29  ckReservedLock()
10fa0 2c 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  , *pResOut is se
10fb0 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 6e 79  t to true if any
10fc0 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 68 65 6c 64   lock.** is held
10fd0 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64   on the file and
10fe0 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 66 69   false if the fi
10ff0 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 0a  le is unlocked..
11000 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f  */.static int do
11010 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  tlockCheckReserv
11020 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
11030 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
11040 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72  esOut) {.  int r
11050 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
11060 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
11070 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
11080 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
11090 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  *)id;..  Simulat
110a0 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
110b0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
110c0 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
110d0 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28   );.  .  assert(
110e0 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20   pFile );..  /* 
110f0 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
11100 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
11110 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
11120 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
11130 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
11140 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
11150 20 2f 2a 20 45 69 74 68 65 72 20 74 68 69 73 20   /* Either this 
11160 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 73 6f  connection or so
11170 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  me other connect
11180 69 6f 6e 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ion in the same 
11190 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 68  process.    ** h
111a0 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20 74  olds a lock on t
111b0 68 65 20 66 69 6c 65 2e 20 20 4e 6f 20 6e 65 65  he file.  No nee
111c0 64 20 74 6f 20 63 68 65 63 6b 20 66 75 72 74 68  d to check furth
111d0 65 72 2e 20 2a 2f 0a 20 20 20 20 72 65 73 65 72  er. */.    reser
111e0 76 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  ved = 1;.  }else
111f0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63  {.    /* The loc
11200 6b 20 69 73 20 68 65 6c 64 20 69 66 20 61 6e 64  k is held if and
11210 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 6c 6f 63   only if the loc
11220 6b 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a  kfile exists */.
11230 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
11240 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 6f 6e  zLockFile = (con
11250 73 74 20 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e  st char*)pFile->
11260 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
11270 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 6f      reserved = o
11280 73 41 63 63 65 73 73 28 7a 4c 6f 63 6b 46 69 6c  sAccess(zLockFil
11290 65 2c 20 30 29 3d 3d 30 3b 0a 20 20 7d 0a 20 20  e, 0)==0;.  }.  
112a0 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
112b0 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
112c0 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46  (dotlock)\n", pF
112d0 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65  ile->h, rc, rese
112e0 72 76 65 64 29 29 3b 0a 20 20 2a 70 52 65 73 4f  rved));.  *pResO
112f0 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
11300 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11310 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
11320 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
11330 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
11340 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
11350 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
11360 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
11370 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
11380 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
11390 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
113a0 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
113b0 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
113c0 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
113d0 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
113e0 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
113f0 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
11400 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
11410 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
11420 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
11430 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
11440 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
11450 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
11460 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
11470 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
11480 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
11490 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
114a0 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
114b0 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
114c0 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
114d0 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
114e0 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
114f0 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
11500 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
11510 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
11520 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
11530 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
11540 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
11550 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
11560 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
11570 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
11580 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
11590 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
115a0 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
115b0 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
115c0 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
115d0 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
115e0 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
115f0 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
11600 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
11610 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
11620 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
11630 2a 2a 0a 2a 2a 20 57 69 74 68 20 64 6f 74 66 69  **.** With dotfi
11640 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 77 65 20 72  le locking, we r
11650 65 61 6c 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f  eally only suppo
11660 72 74 20 73 74 61 74 65 20 28 34 29 3a 20 45 58  rt state (4): EX
11670 43 4c 55 53 49 56 45 2e 0a 2a 2a 20 42 75 74 20  CLUSIVE..** But 
11680 77 65 20 74 72 61 63 6b 20 74 68 65 20 6f 74 68  we track the oth
11690 65 72 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  er locking level
116a0 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 2a 2f  s internally..*/
116b0 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c  .static int dotl
116c0 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  ockLock(sqlite3_
116d0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
116e0 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
116f0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
11700 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
11710 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20  char *zLockFile 
11720 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d  = (char *)pFile-
11730 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
11740 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
11750 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66  TE_OK;...  /* If
11760 20 77 65 20 68 61 76 65 20 61 6e 79 20 6c 6f 63   we have any loc
11770 6b 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b  k, then the lock
11780 20 66 69 6c 65 20 61 6c 72 65 61 64 79 20 65 78   file already ex
11790 69 73 74 73 2e 20 20 41 6c 6c 20 77 65 20 68 61  ists.  All we ha
117a0 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73  ve.  ** to do is
117b0 20 61 64 6a 75 73 74 20 6f 75 72 20 69 6e 74 65   adjust our inte
117c0 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74  rnal record of t
117d0 68 65 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20  he lock level.. 
117e0 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
117f0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f  >eFileLock > NO_
11800 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  LOCK ){.    pFil
11810 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
11820 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 2f 2a  FileLock;.    /*
11830 20 41 6c 77 61 79 73 20 75 70 64 61 74 65 20 74   Always update t
11840 68 65 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e 20  he timestamp on 
11850 74 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a  the old file */.
11860 23 69 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d  #ifdef HAVE_UTIM
11870 45 0a 20 20 20 20 75 74 69 6d 65 28 7a 4c 6f 63  E.    utime(zLoc
11880 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65  kFile, NULL);.#e
11890 6c 73 65 0a 20 20 20 20 75 74 69 6d 65 73 28 7a  lse.    utimes(z
118a0 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b  LockFile, NULL);
118b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
118c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
118d0 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61  }.  .  /* grab a
118e0 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
118f0 20 2a 2f 0a 20 20 72 63 20 3d 20 6f 73 4d 6b 64   */.  rc = osMkd
11900 69 72 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 37  ir(zLockFile, 07
11910 37 37 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20  77);.  if( rc<0 
11920 29 7b 0a 20 20 20 20 2f 2a 20 66 61 69 6c 65 64  ){.    /* failed
11930 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20   to open/create 
11940 74 68 65 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f  the lock directo
11950 72 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 45  ry */.    int tE
11960 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
11970 20 20 69 66 28 20 45 45 58 49 53 54 20 3d 3d 20    if( EEXIST == 
11980 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20  tErrno ){.      
11990 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
119a0 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
119b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
119c0 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
119d0 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
119e0 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
119f0 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
11a00 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
11a10 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
11a20 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
11a30 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rno);.      }.  
11a40 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
11a50 63 3b 0a 20 20 7d 20 0a 20 20 0a 20 20 2f 2a 20  c;.  } .  .  /* 
11a60 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20  got it, set the 
11a70 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20  type and return 
11a80 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65  ok */.  pFile->e
11a90 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
11aa0 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72  Lock;.  return r
11ab0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  c;.}../*.** Lowe
11ac0 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
11ad0 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
11ae0 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
11af0 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
11b00 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65  eLock.** must be
11b10 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
11b20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
11b30 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
11b40 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
11b50 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
11b60 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
11b70 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
11b80 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
11b90 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
11ba0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
11bb0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65  ..**.** When the
11bc0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 72   locking level r
11bd0 65 61 63 68 65 73 20 4e 4f 5f 4c 4f 43 4b 2c 20  eaches NO_LOCK, 
11be0 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20  delete the lock 
11bf0 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
11c00 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63  int dotlockUnloc
11c10 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
11c20 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
11c30 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  k) {.  unixFile 
11c40 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
11c50 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72 20 2a  le*)id;.  char *
11c60 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61  zLockFile = (cha
11c70 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  r *)pFile->locki
11c80 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74  ngContext;.  int
11c90 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
11ca0 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
11cb0 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE(("UNLOCK  %d 
11cc0 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64  %d was %d pid=%d
11cd0 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70   (dotlock)\n", p
11ce0 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f  File->h, eFileLo
11cf0 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  ck,.           p
11d00 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  File->eFileLock,
11d10 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a   osGetpid(0)));.
11d20 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
11d30 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
11d40 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f   );.  .  /* no-o
11d50 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f  p if possible */
11d60 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
11d70 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f  ileLock==eFileLo
11d80 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
11d90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
11da0 0a 20 20 2f 2a 20 54 6f 20 64 6f 77 6e 67 72 61  .  /* To downgra
11db0 64 65 20 74 6f 20 73 68 61 72 65 64 2c 20 73 69  de to shared, si
11dc0 6d 70 6c 79 20 75 70 64 61 74 65 20 6f 75 72 20  mply update our 
11dd0 69 6e 74 65 72 6e 61 6c 20 6e 6f 74 69 6f 6e 20  internal notion 
11de0 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 63 6b  of the.  ** lock
11df0 20 73 74 61 74 65 2e 20 20 4e 6f 20 6e 65 65 64   state.  No need
11e00 20 74 6f 20 6d 65 73 73 20 77 69 74 68 20 74 68   to mess with th
11e10 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a  e file on disk..
11e20 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
11e30 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
11e40 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
11e50 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
11e60 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74  ED_LOCK;.    ret
11e70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
11e80 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 6f 20 66 75   }.  .  /* To fu
11e90 6c 6c 79 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64  lly unlock the d
11ea0 61 74 61 62 61 73 65 2c 20 64 65 6c 65 74 65 20  atabase, delete 
11eb0 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f  the lock file */
11ec0 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
11ed0 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b  Lock==NO_LOCK );
11ee0 0a 20 20 72 63 20 3d 20 6f 73 52 6d 64 69 72 28  .  rc = osRmdir(
11ef0 7a 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20 20 69 66  zLockFile);.  if
11f00 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( rc<0 && errno=
11f10 3d 45 4e 4f 54 44 49 52 20 29 20 72 63 20 3d 20  =ENOTDIR ) rc = 
11f20 6f 73 55 6e 6c 69 6e 6b 28 7a 4c 6f 63 6b 46 69  osUnlink(zLockFi
11f30 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20  le);.  if( rc<0 
11f40 29 7b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e  ){.    int tErrn
11f50 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72  o = errno;.    r
11f60 63 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 45  c = 0;.    if( E
11f70 4e 4f 45 4e 54 20 21 3d 20 74 45 72 72 6e 6f 20  NOENT != tErrno 
11f80 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
11f90 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
11fa0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
11fb0 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
11fc0 63 29 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72  c) ){.      stor
11fd0 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
11fe0 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d  , tErrno);.    }
11ff0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20  .    return rc; 
12000 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46  .  }.  pFile->eF
12010 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
12020 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  K;.  return SQLI
12030 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
12040 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 20 20 4d  Close a file.  M
12050 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
12060 6b 20 68 61 73 20 62 65 65 6e 20 72 65 6c 65 61  k has been relea
12070 73 65 64 20 62 65 66 6f 72 65 20 63 6c 6f 73 69  sed before closi
12080 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
12090 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 28 73  t dotlockClose(s
120a0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
120b0 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
120c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69  LITE_OK;.  if( i
120d0 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  d ){.    unixFil
120e0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
120f0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 64 6f  File*)id;.    do
12100 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20  tlockUnlock(id, 
12110 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 73 71  NO_LOCK);.    sq
12120 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65  lite3_free(pFile
12130 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
12140 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 6f 73  );.    rc = clos
12150 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20  eUnixFile(id);. 
12160 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
12170 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }./*************
12180 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
12190 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 20 69   dot-file lock i
121a0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
121b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
121c0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
121d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
121e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
121f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12210 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
12220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12260 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
12270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
12280 67 69 6e 20 66 6c 6f 63 6b 20 4c 6f 63 6b 69 6e  gin flock Lockin
12290 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
122a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
122b0 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65  **.**.** Use the
122c0 20 66 6c 6f 63 6b 28 29 20 73 79 73 74 65 6d 20   flock() system 
122d0 63 61 6c 6c 20 74 6f 20 64 6f 20 66 69 6c 65 20  call to do file 
122e0 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66  locking..**.** f
122f0 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 69  lock() locking i
12300 73 20 6c 69 6b 65 20 64 6f 74 2d 66 69 6c 65 20  s like dot-file 
12310 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68 61 74 20  locking in that 
12320 74 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a 20 66  the various.** f
12330 69 6e 65 2d 67 72 61 69 6e 20 6c 6f 63 6b 69 6e  ine-grain lockin
12340 67 20 6c 65 76 65 6c 73 20 73 75 70 70 6f 72 74  g levels support
12350 65 64 20 62 79 20 53 51 4c 69 74 65 20 61 72 65  ed by SQLite are
12360 20 63 6f 6c 6c 61 70 73 65 64 20 69 6e 74 6f 0a   collapsed into.
12370 2a 2a 20 61 20 73 69 6e 67 6c 65 20 65 78 63 6c  ** a single excl
12380 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49 6e 20  usive lock.  In 
12390 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 53 48 41  other words, SHA
123a0 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20 61  RED, RESERVED, a
123b0 6e 64 0a 2a 2a 20 50 45 4e 44 49 4e 47 20 6c 6f  nd.** PENDING lo
123c0 63 6b 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  cks are the same
123d0 20 74 68 69 6e 67 20 61 73 20 61 6e 20 45 58 43   thing as an EXC
123e0 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 53 51  LUSIVE lock.  SQ
123f0 4c 69 74 65 0a 2a 2a 20 73 74 69 6c 6c 20 77 6f  Lite.** still wo
12400 72 6b 73 20 77 68 65 6e 20 79 6f 75 20 64 6f 20  rks when you do 
12410 74 68 69 73 2c 20 62 75 74 20 63 6f 6e 63 75 72  this, but concur
12420 72 65 6e 63 79 20 69 73 20 72 65 64 75 63 65 64  rency is reduced
12430 20 73 69 6e 63 65 0a 2a 2a 20 6f 6e 6c 79 20 61   since.** only a
12440 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20   single process 
12450 63 61 6e 20 62 65 20 72 65 61 64 69 6e 67 20 74  can be reading t
12460 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20 61  he database at a
12470 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69   time..**.** Omi
12480 74 20 74 68 69 73 20 73 65 63 74 69 6f 6e 20 69  t this section i
12490 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
124a0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 69 73  LOCKING_STYLE is
124b0 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a 2f 0a 23   turned off.*/.#
124c0 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
124d0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a  _LOCKING_STYLE..
124e0 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 66 6c 6f 63  /*.** Retry floc
124f0 6b 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 66  k() calls that f
12500 61 69 6c 20 77 69 74 68 20 45 49 4e 54 52 0a 2a  ail with EINTR.*
12510 2f 0a 23 69 66 64 65 66 20 45 49 4e 54 52 0a 73  /.#ifdef EINTR.s
12520 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74  tatic int robust
12530 5f 66 6c 6f 63 6b 28 69 6e 74 20 66 64 2c 20 69  _flock(int fd, i
12540 6e 74 20 6f 70 29 7b 0a 20 20 69 6e 74 20 72 63  nt op){.  int rc
12550 3b 0a 20 20 64 6f 7b 20 72 63 20 3d 20 66 6c 6f  ;.  do{ rc = flo
12560 63 6b 28 66 64 2c 6f 70 29 3b 20 7d 77 68 69 6c  ck(fd,op); }whil
12570 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f  e( rc<0 && errno
12580 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74  ==EINTR );.  ret
12590 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a  urn rc;.}.#else.
125a0 23 20 64 65 66 69 6e 65 20 72 6f 62 75 73 74 5f  # define robust_
125b0 66 6c 6f 63 6b 28 61 2c 62 29 20 66 6c 6f 63 6b  flock(a,b) flock
125c0 28 61 2c 62 29 0a 23 65 6e 64 69 66 0a 20 20 20  (a,b).#endif.   
125d0 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72    ../*.** This r
125e0 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
125f0 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
12600 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
12610 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
12620 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
12630 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
12640 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
12650 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65  lock is held, se
12660 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f  t *pResOut.** to
12670 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
12680 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65  e otherwise *pRe
12690 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a  sOut is set to z
126a0 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ero.  The return
126b0 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
126c0 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e   to SQLITE_OK un
126d0 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f  less an I/O erro
126e0 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
126f0 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a  lock checking..*
12700 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f  /.static int flo
12710 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
12720 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
12730 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f   *id, int *pResO
12740 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ut){.  int rc = 
12750 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
12760 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20   reserved = 0;. 
12770 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
12780 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
12790 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49  ;.  .  SimulateI
127a0 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
127b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
127c0 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
127d0 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
127e0 46 69 6c 65 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  File );.  .  /* 
127f0 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
12800 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
12810 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
12820 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
12830 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
12840 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
12850 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
12860 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72   }.  .  /* Other
12870 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
12880 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
12890 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66  olds it. */.  if
128a0 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20  ( !reserved ){. 
128b0 20 20 20 2f 2a 20 61 74 74 65 6d 70 74 20 74 6f     /* attempt to
128c0 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 2a 2f   get the lock */
128d0 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 72  .    int lrc = r
128e0 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c  obust_flock(pFil
128f0 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20  e->h, LOCK_EX | 
12900 4c 4f 43 4b 5f 4e 42 29 3b 0a 20 20 20 20 69 66  LOCK_NB);.    if
12910 28 20 21 6c 72 63 20 29 7b 0a 20 20 20 20 20 20  ( !lrc ){.      
12920 2f 2a 20 67 6f 74 20 74 68 65 20 6c 6f 63 6b 2c  /* got the lock,
12930 20 75 6e 6c 6f 63 6b 20 69 74 20 2a 2f 0a 20 20   unlock it */.  
12940 20 20 20 20 6c 72 63 20 3d 20 72 6f 62 75 73 74      lrc = robust
12950 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c  _flock(pFile->h,
12960 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20 20 20 20   LOCK_UN);.     
12970 20 69 66 20 28 20 6c 72 63 20 29 20 7b 0a 20 20   if ( lrc ) {.  
12980 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f        int tErrno
12990 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
129a0 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66 61 69 6c    /* unlock fail
129b0 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72  ed with an error
129c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 6c 72 63 20   */.        lrc 
129d0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
129e0 4e 4c 4f 43 4b 3b 20 0a 20 20 20 20 20 20 20 20  NLOCK; .        
129f0 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
12a00 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20  R(lrc) ){.      
12a10 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
12a20 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f  no(pFile, tErrno
12a30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
12a40 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  = lrc;.        }
12a50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65  .      }.    } e
12a60 6c 73 65 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  lse {.      int 
12a70 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
12a80 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d        reserved =
12a90 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 73 6f 6d   1;.      /* som
12aa0 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67 68 74 20  eone else might 
12ab0 68 61 76 65 20 69 74 20 72 65 73 65 72 76 65 64  have it reserved
12ac0 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20   */.      lrc = 
12ad0 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
12ae0 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
12af0 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
12b00 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 69 66 28  OCK); .      if(
12b10 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
12b20 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  rc) ){.        s
12b30 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
12b40 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
12b50 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a        rc = lrc;.
12b60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12b70 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  }.  OSTRACE(("TE
12b80 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
12b90 20 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20   %d (flock)\n", 
12ba0 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65  pFile->h, rc, re
12bb0 73 65 72 76 65 64 29 29 3b 0a 0a 23 69 66 64 65  served));..#ifde
12bc0 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  f SQLITE_IGNORE_
12bd0 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
12be0 53 0a 20 20 69 66 28 20 28 72 63 20 26 20 53 51  S.  if( (rc & SQ
12bf0 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53  LITE_IOERR) == S
12c00 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20  QLITE_IOERR ){. 
12c10 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
12c20 4b 3b 0a 20 20 20 20 72 65 73 65 72 76 65 64 3d  K;.    reserved=
12c30 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  1;.  }.#endif /*
12c40 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
12c50 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
12c60 20 2a 2f 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d   */.  *pResOut =
12c70 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74   reserved;.  ret
12c80 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
12c90 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77   Lock the file w
12ca0 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65  ith the lock spe
12cb0 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
12cc0 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20  ter eFileLock - 
12cd0 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
12ce0 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
12cf0 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
12d00 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
12d10 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
12d20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
12d30 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
12d40 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
12d50 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
12d60 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
12d70 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
12d80 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
12d90 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
12da0 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
12db0 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
12dc0 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
12dd0 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
12de0 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
12df0 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
12e00 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
12e10 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
12e20 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
12e30 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
12e40 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
12e50 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
12e60 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
12e70 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
12e80 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
12e90 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
12ea0 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
12eb0 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
12ec0 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
12ed0 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
12ee0 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
12ef0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
12f00 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
12f10 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
12f20 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
12f30 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
12f40 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6f 6e 6c 79  .** flock() only
12f50 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20   really support 
12f60 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e  EXCLUSIVE locks.
12f70 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72    We track inter
12f80 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20  mediate.** lock 
12f90 73 74 61 74 65 73 20 69 6e 20 74 68 65 20 73 71  states in the sq
12fa0 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63  lite3_file struc
12fb0 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f  ture, but all lo
12fc0 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a  cks SHARED or.**
12fd0 20 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c   above are reall
12fe0 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  y EXCLUSIVE lock
12ff0 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c  s and exclude al
13000 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  l other processe
13010 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73  s from.** access
13020 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
13030 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
13040 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
13050 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68   a lock.  Use th
13060 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  e sqlite3OsUnloc
13070 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  k().** routine t
13080 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e  o lower a lockin
13090 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74  g level..*/.stat
130a0 69 63 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f 63 6b  ic int flockLock
130b0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
130c0 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
130d0 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
130e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
130f0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
13100 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  nixFile*)id;..  
13110 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
13120 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72  ..  /* if we alr
13130 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b  eady have a lock
13140 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73 69 76  , it is exclusiv
13150 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61  e.  .  ** Just a
13160 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20  djust level and 
13170 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65  punt on outta he
13180 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69  re. */.  if (pFi
13190 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20  le->eFileLock > 
131a0 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70  NO_LOCK) {.    p
131b0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
131c0 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  = eFileLock;.   
131d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
131e0 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67  K;.  }.  .  /* g
131f0 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65  rab an exclusive
13200 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20 69 66   lock */.  .  if
13210 20 28 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70   (robust_flock(p
13220 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58  File->h, LOCK_EX
13230 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20   | LOCK_NB)) {. 
13240 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
13250 65 72 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20 64 69  errno;.    /* di
13260 64 6e 27 74 20 67 65 74 2c 20 6d 75 73 74 20 62  dn't get, must b
13270 65 20 62 75 73 79 20 2a 2f 0a 20 20 20 20 72 63  e busy */.    rc
13280 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
13290 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
132a0 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
132b0 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  R_LOCK);.    if(
132c0 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
132d0 63 29 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72  c) ){.      stor
132e0 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
132f0 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d  , tErrno);.    }
13300 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
13310 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74  /* got it, set t
13320 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75  he type and retu
13330 72 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20 70 46 69  rn ok */.    pFi
13340 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
13350 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20  eFileLock;.  }. 
13360 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
13370 20 20 20 25 64 20 25 73 20 25 73 20 28 66 6c 6f     %d %s %s (flo
13380 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ck)\n", pFile->h
13390 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69  , azFileLock(eFi
133a0 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20  leLock), .      
133b0 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
133c0 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
133d0 6c 65 64 22 29 29 3b 0a 23 69 66 64 65 66 20 53  led"));.#ifdef S
133e0 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f  QLITE_IGNORE_FLO
133f0 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20  CK_LOCK_ERRORS. 
13400 20 69 66 28 20 28 72 63 20 26 20 53 51 4c 49 54   if( (rc & SQLIT
13410 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49  E_IOERR) == SQLI
13420 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20  TE_IOERR ){.    
13430 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
13440 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
13450 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
13460 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20  OCK_LOCK_ERRORS 
13470 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  */.  return rc;.
13480 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  }.../*.** Lower 
13490 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
134a0 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
134b0 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
134c0 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
134d0 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
134e0 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
134f0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
13500 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
13510 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
13520 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
13530 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
13540 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
13550 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
13560 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
13570 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
13580 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
13590 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  ockUnlock(sqlite
135a0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
135b0 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75  eFileLock) {.  u
135c0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
135d0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
135e0 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
135f0 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
13600 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
13610 77 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 66  was %d pid=%d (f
13620 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  lock)\n", pFile-
13630 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
13640 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
13650 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 6f 73 47 65  >eFileLock, osGe
13660 74 70 69 64 28 30 29 29 29 3b 0a 20 20 61 73 73  tpid(0)));.  ass
13670 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ert( eFileLock<=
13680 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
13690 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20   .  /* no-op if 
136a0 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66  possible */.  if
136b0 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
136c0 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck==eFileLock ){
136d0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
136e0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
136f0 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75  /* shared can ju
13700 73 74 20 62 65 20 73 65 74 20 62 65 63 61 75 73  st be set becaus
13710 65 20 77 65 20 61 6c 77 61 79 73 20 68 61 76 65  e we always have
13720 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f   an exclusive */
13730 0a 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b  .  if (eFileLock
13740 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b  ==SHARED_LOCK) {
13750 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
13760 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
13770 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  k;.    return SQ
13780 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
13790 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c    /* no, really,
137a0 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66   unlock. */.  if
137b0 28 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70  ( robust_flock(p
137c0 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e  File->h, LOCK_UN
137d0 29 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ) ){.#ifdef SQLI
137e0 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
137f0 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20  LOCK_ERRORS.    
13800 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13810 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
13820 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
13830 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20  LOCK_ERRORS */. 
13840 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13850 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20  _IOERR_UNLOCK;. 
13860 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c   }else{.    pFil
13870 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
13880 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75  O_LOCK;.    retu
13890 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
138a0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  }.}../*.** Close
138b0 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74   a file..*/.stat
138c0 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 6c 6f 73  ic int flockClos
138d0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
138e0 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d  id) {.  int rc =
138f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
13900 28 20 69 64 20 29 7b 0a 20 20 20 20 66 6c 6f 63  ( id ){.    floc
13910 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  kUnlock(id, NO_L
13920 4f 43 4b 29 3b 0a 20 20 20 20 72 63 20 3d 20 63  OCK);.    rc = c
13930 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
13940 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
13950 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  c;.}..#endif /* 
13960 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
13970 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21  CKING_STYLE && !
13980 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f 0a 0a 2f 2a  OS_VXWORK */../*
13990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
139a0 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 66 6c  ** End of the fl
139b0 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  ock lock impleme
139c0 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
139d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
139e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
139f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
13a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
13a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a90 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 61  ******* Begin Na
13aa0 6d 65 64 20 53 65 6d 61 70 68 6f 72 65 20 4c 6f  med Semaphore Lo
13ab0 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
13ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
13ad0 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70  *.** Named semap
13ae0 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20  hore locking is 
13af0 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64 20 6f  only supported o
13b00 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a  n VxWorks..**.**
13b10 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69   Semaphore locki
13b20 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d 6c  ng is like dot-l
13b30 6f 63 6b 20 61 6e 64 20 66 6c 6f 63 6b 20 69 6e  ock and flock in
13b40 20 74 68 61 74 20 69 74 20 72 65 61 6c 6c 79 20   that it really 
13b50 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70 6f 72 74 73  only.** supports
13b60 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 69   EXCLUSIVE locki
13b70 6e 67 2e 20 20 4f 6e 6c 79 20 61 20 73 69 6e 67  ng.  Only a sing
13b80 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20 72  le process can r
13b90 65 61 64 20 6f 72 20 77 72 69 74 65 0a 2a 2a 20  ead or write.** 
13ba0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
13bb0 65 20 61 74 20 61 20 74 69 6d 65 2e 20 20 54 68  e at a time.  Th
13bc0 69 73 20 72 65 64 75 63 65 73 20 70 6f 74 65 6e  is reduces poten
13bd0 74 69 61 6c 20 63 6f 6e 63 75 72 72 65 6e 63 79  tial concurrency
13be0 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b 65 73 20 74  , but.** makes t
13bf0 68 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  he lock implemen
13c00 74 61 74 69 6f 6e 20 6d 75 63 68 20 65 61 73 69  tation much easi
13c10 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f 53 5f 56 58  er..*/.#if OS_VX
13c20 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  WORKS../*.** Thi
13c30 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
13c40 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
13c50 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
13c60 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
13c70 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
13c80 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
13c90 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
13ca0 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
13cb0 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
13cc0 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
13cd0 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
13ce0 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
13cf0 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
13d00 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
13d10 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
13d20 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
13d30 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
13d40 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
13d50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13d60 73 65 6d 58 43 68 65 63 6b 52 65 73 65 72 76 65  semXCheckReserve
13d70 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
13d80 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
13d90 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63  sOut) {.  int rc
13da0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
13db0 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30  int reserved = 0
13dc0 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
13dd0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
13de0 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  )id;..  Simulate
13df0 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
13e00 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
13e10 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
13e20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  );.  .  assert( 
13e30 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43  pFile );..  /* C
13e40 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
13e50 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
13e60 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
13e70 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
13e80 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
13e90 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
13ea0 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
13eb0 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77  }.  .  /* Otherw
13ec0 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20  ise see if some 
13ed0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f  other process ho
13ee0 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28  lds it. */.  if(
13ef0 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20   !reserved ){.  
13f00 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20    sem_t *pSem = 
13f10 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pFile->pInode->p
13f20 53 65 6d 3b 0a 0a 20 20 20 20 69 66 28 20 73 65  Sem;..    if( se
13f30 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d  m_trywait(pSem)=
13f40 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  =-1 ){.      int
13f50 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
13f60 0a 20 20 20 20 20 20 69 66 28 20 45 41 47 41 49  .      if( EAGAI
13f70 4e 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20  N != tErrno ){. 
13f80 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
13f90 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
13fa0 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
13fb0 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
13fc0 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20  RESERVEDLOCK);. 
13fd0 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
13fe0 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
13ff0 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c  rno);.      } el
14000 73 65 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  se {.        /* 
14010 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61 73  someone else has
14020 20 74 68 65 20 6c 6f 63 6b 20 77 68 65 6e 20 77   the lock when w
14030 65 20 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f 43 4b  e are in NO_LOCK
14040 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65   */.        rese
14050 72 76 65 64 20 3d 20 28 70 46 69 6c 65 2d 3e 65  rved = (pFile->e
14060 46 69 6c 65 4c 6f 63 6b 20 3c 20 53 48 41 52 45  FileLock < SHARE
14070 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  D_LOCK);.      }
14080 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14090 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64 20 68 61    /* we could ha
140a0 76 65 20 69 74 20 69 66 20 77 65 20 77 61 6e 74  ve it if we want
140b0 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 73 65 6d   it */.      sem
140c0 5f 70 6f 73 74 28 70 53 65 6d 29 3b 0a 20 20 20  _post(pSem);.   
140d0 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45   }.  }.  OSTRACE
140e0 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20  (("TEST WR-LOCK 
140f0 25 64 20 25 64 20 25 64 20 28 73 65 6d 29 5c 6e  %d %d %d (sem)\n
14100 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c  ", pFile->h, rc,
14110 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20 20   reserved));..  
14120 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
14130 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
14140 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
14150 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
14160 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
14170 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46   by parameter eF
14180 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a  ileLock - one.**
14190 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
141a0 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
141b0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
141c0 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
141d0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
141e0 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
141f0 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
14200 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
14210 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
14220 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
14230 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
14240 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
14250 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
14260 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
14270 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
14280 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
14290 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
142a0 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
142b0 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
142c0 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
142d0 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
142e0 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
142f0 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
14300 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
14310 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
14320 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
14330 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
14340 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
14350 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
14360 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
14370 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
14380 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
14390 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
143a0 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
143b0 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
143c0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
143d0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
143e0 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
143f0 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 53 65  CLUSIVE.**.** Se
14400 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 6f 6e  maphore locks on
14410 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72  ly really suppor
14420 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  t EXCLUSIVE lock
14430 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74  s.  We track int
14440 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63  ermediate.** loc
14450 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68 65 20  k states in the 
14460 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72  sqlite3_file str
14470 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20  ucture, but all 
14480 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a  locks SHARED or.
14490 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65 61  ** above are rea
144a0 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  lly EXCLUSIVE lo
144b0 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20  cks and exclude 
144c0 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73  all other proces
144d0 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65  ses from.** acce
144e0 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a  ss the file..**.
144f0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
14500 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
14510 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
14520 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
14530 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
14540 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
14550 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ing level..*/.st
14560 61 74 69 63 20 69 6e 74 20 73 65 6d 58 4c 6f 63  atic int semXLoc
14570 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
14580 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
14590 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  k) {.  unixFile 
145a0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
145b0 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74 20  le*)id;.  sem_t 
145c0 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70  *pSem = pFile->p
145d0 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20 20 69  Inode->pSem;.  i
145e0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
145f0 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61  K;..  /* if we a
14600 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f  lready have a lo
14610 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73  ck, it is exclus
14620 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74  ive.  .  ** Just
14630 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e   adjust level an
14640 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20  d punt on outta 
14650 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70  here. */.  if (p
14660 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
14670 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  > NO_LOCK) {.   
14680 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
14690 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
146a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
146b0 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f  K;.    goto sem_
146c0 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  end_lock;.  }.  
146d0 0a 20 20 2f 2a 20 6c 6f 63 6b 20 73 65 6d 61 70  .  /* lock semap
146e0 68 6f 72 65 20 6e 6f 77 20 62 75 74 20 62 61 69  hore now but bai
146f0 6c 20 6f 75 74 20 77 68 65 6e 20 61 6c 72 65 61  l out when alrea
14700 64 79 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20  dy locked. */.  
14710 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28  if( sem_trywait(
14720 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20  pSem)==-1 ){.   
14730 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
14740 59 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f  Y;.    goto sem_
14750 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20  end_lock;.  }.. 
14760 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20   /* got it, set 
14770 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74  the type and ret
14780 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c  urn ok */.  pFil
14790 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
147a0 46 69 6c 65 4c 6f 63 6b 3b 0a 0a 20 73 65 6d 5f  FileLock;.. sem_
147b0 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65 74 75  end_lock:.  retu
147c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
147d0 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
147e0 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
147f0 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
14800 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
14810 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
14820 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
14830 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
14840 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
14850 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
14860 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
14870 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
14880 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
14890 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
148a0 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
148b0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
148c0 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
148d0 69 6e 74 20 73 65 6d 58 55 6e 6c 6f 63 6b 28 73  int semXUnlock(s
148e0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
148f0 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
14900 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
14910 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
14920 29 69 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53  )id;.  sem_t *pS
14930 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  em = pFile->pIno
14940 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20 61 73 73  de->pSem;..  ass
14950 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
14960 61 73 73 65 72 74 28 20 70 53 65 6d 20 29 3b 0a  assert( pSem );.
14970 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f    OSTRACE(("UNLO
14980 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
14990 20 70 69 64 3d 25 64 20 28 73 65 6d 29 5c 6e 22   pid=%d (sem)\n"
149a0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c  , pFile->h, eFil
149b0 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20  eLock,.         
149c0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
149d0 63 6b 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29  ck, osGetpid(0))
149e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
149f0 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c  leLock<=SHARED_L
14a00 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e  OCK );.  .  /* n
14a10 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65  o-op if possible
14a20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
14a30 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c  >eFileLock==eFil
14a40 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74  eLock ){.    ret
14a50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
14a60 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65   }.  .  /* share
14a70 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65  d can just be se
14a80 74 20 62 65 63 61 75 73 65 20 77 65 20 61 6c 77  t because we alw
14a90 61 79 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c  ays have an excl
14aa0 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 65  usive */.  if (e
14ab0 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
14ac0 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69  _LOCK) {.    pFi
14ad0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
14ae0 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72  eFileLock;.    r
14af0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14b00 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c  .  }.  .  /* no,
14b10 20 72 65 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20   really unlock. 
14b20 2a 2f 0a 20 20 69 66 20 28 20 73 65 6d 5f 70 6f  */.  if ( sem_po
14b30 73 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 20 7b  st(pSem)==-1 ) {
14b40 0a 20 20 20 20 69 6e 74 20 72 63 2c 20 74 45 72  .    int rc, tEr
14b50 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
14b60 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
14b70 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
14b80 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
14b90 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20  OERR_UNLOCK);.  
14ba0 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
14bb0 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
14bc0 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
14bd0 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
14be0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
14bf0 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c   rc; .  }.  pFil
14c00 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
14c10 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e  O_LOCK;.  return
14c20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
14c30 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  *. ** Close a fi
14c40 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  le.. */.static i
14c50 6e 74 20 73 65 6d 58 43 6c 6f 73 65 28 73 71 6c  nt semXClose(sql
14c60 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
14c70 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20  .  if( id ){.   
14c80 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
14c90 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
14ca0 3b 0a 20 20 20 20 73 65 6d 58 55 6e 6c 6f 63 6b  ;.    semXUnlock
14cb0 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  (id, NO_LOCK);. 
14cc0 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
14cd0 20 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65   );.    unixEnte
14ce0 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65  rMutex();.    re
14cf0 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70  leaseInodeInfo(p
14d00 46 69 6c 65 29 3b 0a 20 20 20 20 75 6e 69 78 4c  File);.    unixL
14d10 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20  eaveMutex();.   
14d20 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
14d30 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  d);.  }.  return
14d40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
14d50 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f  endif /* OS_VXWO
14d60 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d  RKS */./*.** Nam
14d70 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ed semaphore loc
14d80 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61  king is only ava
14d90 69 6c 61 62 6c 65 20 6f 6e 20 56 78 57 6f 72 6b  ilable on VxWork
14da0 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s..**.**********
14db0 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
14dc0 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   named semaphore
14dd0 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
14de0 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
14df0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
14e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14e40 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ****/.../*******
14e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14e90 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
14ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14eb0 2a 2a 2a 20 42 65 67 69 6e 20 41 46 50 20 4c 6f  *** Begin AFP Lo
14ec0 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
14ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14ee0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46  *******.**.** AF
14ef0 50 20 69 73 20 74 68 65 20 41 70 70 6c 65 20 46  P is the Apple F
14f00 69 6c 69 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e 20  iling Protocol. 
14f10 20 41 46 50 20 69 73 20 61 20 6e 65 74 77 6f 72   AFP is a networ
14f20 6b 20 66 69 6c 65 73 79 73 74 65 6d 20 66 6f 75  k filesystem fou
14f30 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65 20 4d  nd.** on Apple M
14f40 61 63 69 6e 74 6f 73 68 20 63 6f 6d 70 75 74 65  acintosh compute
14f50 72 73 20 2d 20 62 6f 74 68 20 4f 53 39 20 61 6e  rs - both OS9 an
14f60 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  d OSX..**.** Thi
14f70 72 64 2d 70 61 72 74 79 20 69 6d 70 6c 65 6d 65  rd-party impleme
14f80 6e 74 61 74 69 6f 6e 73 20 6f 66 20 41 46 50 20  ntations of AFP 
14f90 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 20 20  are available.  
14fa0 42 75 74 20 74 68 69 73 20 63 6f 64 65 20 68 65  But this code he
14fb0 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73  re.** only works
14fc0 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66   on OSX..*/..#if
14fd0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
14fe0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
14ff0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
15000 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 66 70  LE./*.** The afp
15010 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73  LockingContext s
15020 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
15030 73 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73  s all afp lock s
15040 70 65 63 69 66 69 63 20 73 74 61 74 65 0a 2a 2f  pecific state.*/
15050 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
15060 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
15070 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  t afpLockingCont
15080 65 78 74 3b 0a 73 74 72 75 63 74 20 61 66 70 4c  ext;.struct afpL
15090 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a  ockingContext {.
150a0 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 3b 0a    int reserved;.
150b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62    const char *db
150c0 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  Path;           
150d0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
150e0 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b   open file */.};
150f0 0a 0a 73 74 72 75 63 74 20 42 79 74 65 52 61 6e  ..struct ByteRan
15100 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e  geLockPB2.{.  un
15110 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
15120 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20   offset;        
15130 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20 66 69 72  /* offset to fir
15140 73 74 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20  st byte to lock 
15150 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
15160 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20  ng long length; 
15170 20 20 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66         /* nbr of
15180 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a   bytes to lock *
15190 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
151a0 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65 53  g long retRangeS
151b0 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20  tart; /* nbr of 
151c0 31 73 74 20 62 79 74 65 20 6c 6f 63 6b 65 64 20  1st byte locked 
151d0 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 2a 2f  if successful */
151e0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
151f0 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20   unLockFlag;    
15200 20 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f       /* 1 = unlo
15210 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a  ck, 0 = lock */.
15220 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
15230 73 74 61 72 74 45 6e 64 46 6c 61 67 3b 20 20 20  startEndFlag;   
15240 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20      /* 1=rel to 
15250 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72  end of fork, 0=r
15260 65 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20  el to start */. 
15270 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20   int fd;        
15280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15290 20 20 20 2f 2a 20 66 69 6c 65 20 64 65 73 63 20     /* file desc 
152a0 74 6f 20 61 73 73 6f 63 20 74 68 69 73 20 6c 6f  to assoc this lo
152b0 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23  ck with */.};..#
152c0 64 65 66 69 6e 65 20 61 66 70 66 73 42 79 74 65  define afpfsByte
152d0 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20  RangeLock2FSCTL 
152e0 20 20 20 20 20 20 20 5f 49 4f 57 52 28 27 7a 27         _IOWR('z'
152f0 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74  , 23, struct Byt
15300 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a  eRangeLockPB2)..
15310 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
15320 75 74 69 6c 69 74 79 20 66 6f 72 20 73 65 74 74  utility for sett
15330 69 6e 67 20 6f 72 20 63 6c 65 61 72 69 6e 67 20  ing or clearing 
15340 61 20 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63 6b  a bit-range lock
15350 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50 20 66 69   on an.** AFP fi
15360 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a  lesystem..** .**
15370 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
15380 4b 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 53 51  K on success, SQ
15390 4c 49 54 45 5f 42 55 53 59 20 6f 6e 20 66 61 69  LITE_BUSY on fai
153a0 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lure..*/.static 
153b0 69 6e 74 20 61 66 70 53 65 74 4c 6f 63 6b 28 0a  int afpSetLock(.
153c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61    const char *pa
153d0 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
153e0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
153f0 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  file to be locke
15400 64 20 6f 72 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f  d or unlocked */
15410 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
15420 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
15430 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64    /* Open file d
15440 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 70 61 74  escriptor on pat
15450 68 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  h */.  unsigned 
15460 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74  long long offset
15470 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62  ,     /* First b
15480 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  yte to be locked
15490 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
154a0 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c  ong long length,
154b0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
154c0 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20  f bytes to lock 
154d0 2a 2f 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63 6b  */.  int setLock
154e0 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20  Flag            
154f0 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73      /* True to s
15500 65 74 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65 20  et lock.  False 
15510 74 6f 20 63 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f  to clear lock */
15520 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 42 79 74  .){.  struct Byt
15530 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20 70 62  eRangeLockPB2 pb
15540 3b 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a  ;.  int err;.  .
15550 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20    pb.unLockFlag 
15560 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20  = setLockFlag ? 
15570 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61 72  0 : 1;.  pb.star
15580 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20  tEndFlag = 0;.  
15590 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66 73  pb.offset = offs
155a0 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20  et;.  pb.length 
155b0 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e  = length; .  pb.
155c0 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20  fd = pFile->h;. 
155d0 20 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41 46   .  OSTRACE(("AF
155e0 50 53 45 54 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f  PSETLOCK [%s] fo
155f0 72 20 25 64 25 73 20 69 6e 20 72 61 6e 67 65 20  r %d%s in range 
15600 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20  %llx:%llx\n", . 
15610 20 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f     (setLockFlag?
15620 22 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 70 46 69  "ON":"OFF"), pFi
15630 6c 65 2d 3e 68 2c 20 28 70 62 2e 66 64 3d 3d 2d  le->h, (pb.fd==-
15640 31 3f 22 5b 74 65 73 74 76 61 6c 2d 31 5d 22 3a  1?"[testval-1]":
15650 22 22 29 2c 0a 20 20 20 20 6f 66 66 73 65 74 2c  ""),.    offset,
15660 20 6c 65 6e 67 74 68 29 29 3b 0a 20 20 65 72 72   length));.  err
15670 20 3d 20 66 73 63 74 6c 28 70 61 74 68 2c 20 61   = fsctl(path, a
15680 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63  fpfsByteRangeLoc
15690 6b 32 46 53 43 54 4c 2c 20 26 70 62 2c 20 30 29  k2FSCTL, &pb, 0)
156a0 3b 0a 20 20 69 66 20 28 20 65 72 72 3d 3d 2d 31  ;.  if ( err==-1
156b0 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b   ) {.    int rc;
156c0 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  .    int tErrno 
156d0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54  = errno;.    OST
156e0 52 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43  RACE(("AFPSETLOC
156f0 4b 20 66 61 69 6c 65 64 20 74 6f 20 66 73 63 74  K failed to fsct
15700 6c 28 29 20 27 25 73 27 20 25 64 20 25 73 5c 6e  l() '%s' %d %s\n
15710 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
15720 70 61 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73 74  path, tErrno, st
15730 72 65 72 72 6f 72 28 74 45 72 72 6e 6f 29 29 29  rerror(tErrno)))
15740 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
15750 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f  IGNORE_AFP_LOCK_
15760 45 52 52 4f 52 53 0a 20 20 20 20 72 63 20 3d 20  ERRORS.    rc = 
15770 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 23 65 6c  SQLITE_BUSY;.#el
15780 73 65 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  se.    rc = sqli
15790 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
157a0 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 0a 20 20  Error(tErrno,.  
157b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157c0 20 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20    setLockFlag ? 
157d0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
157e0 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  K : SQLITE_IOERR
157f0 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66  _UNLOCK);.#endif
15800 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52   /* SQLITE_IGNOR
15810 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52  E_AFP_LOCK_ERROR
15820 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 5f  S */.    if( IS_
15830 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
15840 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  {.      storeLas
15850 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
15860 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rrno);.    }.   
15870 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20   return rc;.  } 
15880 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72  else {.    retur
15890 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
158a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
158b0 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
158c0 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
158d0 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
158e0 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
158f0 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
15900 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
15910 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
15920 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65  lock is held, se
15930 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f  t *pResOut.** to
15940 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
15950 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65  e otherwise *pRe
15960 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a  sOut is set to z
15970 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ero.  The return
15980 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
15990 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e   to SQLITE_OK un
159a0 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f  less an I/O erro
159b0 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
159c0 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a  lock checking..*
159d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
159e0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
159f0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
15a00 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
15a10 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
15a20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
15a30 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
15a40 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
15a50 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
15a60 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74    afpLockingCont
15a70 65 78 74 20 2a 63 6f 6e 74 65 78 74 3b 0a 20 20  ext *context;.  
15a80 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
15a90 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
15aa0 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
15ab0 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20  ERVEDLOCK; );.  
15ac0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
15ad0 20 29 3b 0a 20 20 63 6f 6e 74 65 78 74 20 3d 20   );.  context = 
15ae0 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
15af0 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63  xt *) pFile->loc
15b00 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69  kingContext;.  i
15b10 66 28 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65  f( context->rese
15b20 72 76 65 64 20 29 7b 0a 20 20 20 20 2a 70 52 65  rved ){.    *pRe
15b30 73 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 72 65  sOut = 1;.    re
15b40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15b50 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d    }.  unixEnterM
15b60 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75  utex(); /* Becau
15b70 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  se pFile->pInode
15b80 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73   is shared acros
15b90 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 20 20 0a  s threads */.  .
15ba0 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20    /* Check if a 
15bb0 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70  thread in this p
15bc0 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63  rocess holds suc
15bd0 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  h a lock */.  if
15be0 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  ( pFile->pInode-
15bf0 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45  >eFileLock>SHARE
15c00 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  D_LOCK ){.    re
15c10 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  served = 1;.  }.
15c20 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73    .  /* Otherwis
15c30 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74  e see if some ot
15c40 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  her process hold
15c50 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20 20 69 66  s it..   */.  if
15c60 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20  ( !reserved ){. 
15c70 20 20 20 2f 2a 20 6c 6f 63 6b 20 74 68 65 20 52     /* lock the R
15c80 45 53 45 52 56 45 44 20 62 79 74 65 20 2a 2f 0a  ESERVED byte */.
15c90 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 61 66      int lrc = af
15ca0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
15cb0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
15cc0 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
15cd0 31 2c 31 29 3b 20 20 0a 20 20 20 20 69 66 28 20  1,1);  .    if( 
15ce0 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63 20 29  SQLITE_OK==lrc )
15cf0 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65  {.      /* if we
15d00 20 73 75 63 63 65 65 64 65 64 20 69 6e 20 74 61   succeeded in ta
15d10 6b 69 6e 67 20 74 68 65 20 72 65 73 65 72 76 65  king the reserve
15d20 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69  d lock, unlock i
15d30 74 20 74 6f 20 72 65 73 74 6f 72 65 0a 20 20 20  t to restore.   
15d40 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e     ** the origin
15d50 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20  al state */.    
15d60 20 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f    lrc = afpSetLo
15d70 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
15d80 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52  th, pFile, RESER
15d90 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b  VED_BYTE, 1, 0);
15da0 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
15db0 20 20 20 20 2f 2a 20 69 66 20 77 65 20 66 61 69      /* if we fai
15dc0 6c 65 64 20 74 6f 20 67 65 74 20 74 68 65 20 6c  led to get the l
15dd0 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65 6f 6e 65  ock then someone
15de0 20 65 6c 73 65 20 6d 75 73 74 20 68 61 76 65 20   else must have 
15df0 69 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 73 65  it */.      rese
15e00 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  rved = 1;.    }.
15e10 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
15e20 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20  ERROR(lrc) ){.  
15e30 20 20 20 20 72 63 3d 6c 72 63 3b 0a 20 20 20 20      rc=lrc;.    
15e40 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c  }.  }.  .  unixL
15e50 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f  eaveMutex();.  O
15e60 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
15e70 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28  -LOCK %d %d %d (
15e80 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  afp)\n", pFile->
15e90 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29  h, rc, reserved)
15ea0 29 3b 0a 20 20 0a 20 20 2a 70 52 65 73 4f 75 74  );.  .  *pResOut
15eb0 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72   = reserved;.  r
15ec0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
15ed0 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
15ee0 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
15ef0 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
15f00 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20  meter eFileLock 
15f10 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
15f20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
15f30 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
15f40 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
15f50 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
15f60 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
15f70 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
15f80 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
15f90 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
15fa0 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
15fb0 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
15fc0 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
15fd0 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
15fe0 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
15ff0 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
16000 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
16010 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
16020 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
16030 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
16040 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
16050 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
16060 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
16070 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
16080 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
16090 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
160a0 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
160b0 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
160c0 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
160d0 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
160e0 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
160f0 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
16100 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
16110 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
16120 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
16130 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
16140 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
16150 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
16160 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
16170 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
16180 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
16190 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
161a0 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55  rease a lock.  U
161b0 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  se the sqlite3Os
161c0 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  Unlock().** rout
161d0 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c  ine to lower a l
161e0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f  ocking level..*/
161f0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 4c  .static int afpL
16200 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
16210 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
16220 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ock){.  int rc =
16230 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
16240 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
16250 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
16260 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
16270 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
16280 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63  pInode;.  afpLoc
16290 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e  kingContext *con
162a0 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69  text = (afpLocki
162b0 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69  ngContext *) pFi
162c0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
162d0 78 74 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28  xt;.  .  assert(
162e0 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
162f0 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
16300 20 25 73 20 77 61 73 20 25 73 28 25 73 2c 25 64   %s was %s(%s,%d
16310 29 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e  ) pid=%d (afp)\n
16320 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
16330 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f          azFileLo
16340 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61  ck(eFileLock), a
16350 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d  zFileLock(pFile-
16360 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20  >eFileLock),.   
16370 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f          azFileLo
16380 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  ck(pInode->eFile
16390 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e 6e  Lock), pInode->n
163a0 53 68 61 72 65 64 20 2c 20 6f 73 47 65 74 70 69  Shared , osGetpi
163b0 64 28 30 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  d(0)));..  /* If
163c0 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
163d0 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73  y a lock of this
163e0 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65   type or more re
163f0 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65  strictive on the
16400 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20  .  ** unixFile, 
16410 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27  do nothing. Don'
16420 74 20 75 73 65 20 74 68 65 20 61 66 70 5f 65 6e  t use the afp_en
16430 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74  d_lock: exit pat
16440 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45  h, as.  ** unixE
16450 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e  nterMutex() hasn
16460 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79  't been called y
16470 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  et..  */.  if( p
16480 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
16490 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
164a0 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
164b0 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c      %d %s ok (al
164c0 72 65 61 64 79 20 68 65 6c 64 29 20 28 61 66 70  ready held) (afp
164d0 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
164e0 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c             azFil
164f0 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
16500 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
16510 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
16520 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
16530 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e  e locking sequen
16540 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20  ce is correct.  
16550 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65 72  **  (1) We never
16560 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63   move from unloc
16570 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20  ked to anything 
16580 68 69 67 68 65 72 20 74 68 61 6e 20 73 68 61 72  higher than shar
16590 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28  ed lock..  **  (
165a0 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20  2) SQLite never 
165b0 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65  explicitly reque
165c0 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63  sts a pendig loc
165d0 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73  k..  **  (3) A s
165e0 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c  hared lock is al
165f0 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61  ways held when a
16600 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73   reserve lock is
16610 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f   requested..  */
16620 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
16630 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f  ->eFileLock!=NO_
16640 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63  LOCK || eFileLoc
16650 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
16660 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
16670 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c  eLock!=PENDING_L
16680 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
16690 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45   eFileLock!=RESE
166a0 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69  RVED_LOCK || pFi
166b0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  le->eFileLock==S
166c0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
166d0 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78  .  /* This mutex
166e0 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75   is needed becau
166f0 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  se pFile->pInode
16700 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73   is shared acros
16710 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20  s threads.  */. 
16720 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
16730 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46  );.  pInode = pF
16740 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20  ile->pInode;..  
16750 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61  /* If some threa
16760 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
16770 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20   has a lock via 
16780 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78  a different unix
16790 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c  File*.  ** handl
167a0 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65 73  e that precludes
167b0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
167c0 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59  ock, return BUSY
167d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46  ..  */.  if( (pF
167e0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d  ile->eFileLock!=
167f0 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
16800 6b 20 26 26 20 0a 20 20 20 20 20 20 20 28 70 49  k && .       (pI
16810 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  node->eFileLock>
16820 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c  =PENDING_LOCK ||
16830 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45   eFileLock>SHARE
16840 44 5f 4c 4f 43 4b 29 29 0a 20 20 20 20 20 29 7b  D_LOCK)).     ){
16850 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
16860 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20  _BUSY;.    goto 
16870 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
16880 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 20 53  }.  .  /* If a S
16890 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65  HARED lock is re
168a0 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d  quested, and som
168b0 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74  e thread using t
168c0 68 69 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a  his PID already.
168d0 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45    ** has a SHARE
168e0 44 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f  D or RESERVED lo
168f0 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65  ck, then increme
16900 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  nt reference cou
16910 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74  nts and.  ** ret
16920 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20  urn SQLITE_OK.. 
16930 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
16940 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
16950 20 26 26 20 0a 20 20 20 20 20 28 70 49 6e 6f 64   && .     (pInod
16960 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  e->eFileLock==SH
16970 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e  ARED_LOCK || pIn
16980 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
16990 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29  RESERVED_LOCK) )
169a0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 46  {.    assert( eF
169b0 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
169c0 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  LOCK );.    asse
169d0 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  rt( pFile->eFile
169e0 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Lock==0 );.    a
169f0 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
16a00 53 68 61 72 65 64 3e 30 20 29 3b 0a 20 20 20 20  Shared>0 );.    
16a10 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
16a20 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
16a30 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61      pInode->nSha
16a40 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64  red++;.    pInod
16a50 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  e->nLock++;.    
16a60 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
16a70 6b 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f 2a  k;.  }.    .  /*
16a80 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
16a90 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65  is needed before
16aa0 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41   acquiring a SHA
16ab0 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66  RED lock and bef
16ac0 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69  ore.  ** acquiri
16ad0 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
16ae0 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53  lock.  For the S
16af0 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20  HARED lock, the 
16b00 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a  PENDING will.  *
16b10 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20  * be released.. 
16b20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
16b30 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
16b40 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c   .      || (eFil
16b50 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
16b60 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e  _LOCK && pFile->
16b70 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e  eFileLock<PENDIN
16b80 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20  G_LOCK).  ){.   
16b90 20 69 6e 74 20 66 61 69 6c 65 64 3b 0a 20 20 20   int failed;.   
16ba0 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74   failed = afpSet
16bb0 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
16bc0 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e  Path, pFile, PEN
16bd0 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 31 29  DING_BYTE, 1, 1)
16be0 3b 0a 20 20 20 20 69 66 20 28 66 61 69 6c 65 64  ;.    if (failed
16bf0 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  ) {.      rc = f
16c00 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 67 6f 74  ailed;.      got
16c10 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
16c20 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f      }.  }.  .  /
16c30 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74  * If control get
16c40 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  s to this point,
16c50 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67   then actually g
16c60 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65  o ahead and make
16c70 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20  .  ** operating 
16c80 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72  system calls for
16c90 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c   the specified l
16ca0 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ock..  */.  if( 
16cb0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
16cc0 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e  D_LOCK ){.    in
16cd0 74 20 6c 72 63 31 2c 20 6c 72 63 32 2c 20 6c 72  t lrc1, lrc2, lr
16ce0 63 31 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 20  c1Errno = 0;.   
16cf0 20 6c 6f 6e 67 20 6c 6b 2c 20 6d 61 73 6b 3b 0a   long lk, mask;.
16d00 20 20 20 20 0a 20 20 20 20 61 73 73 65 72 74 28      .    assert(
16d10 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
16d20 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
16d30 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  t( pInode->eFile
16d40 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Lock==0 );.     
16d50 20 20 20 0a 20 20 20 20 6d 61 73 6b 20 3d 20 28     .    mask = (
16d60 73 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38 29  sizeof(long)==8)
16d70 20 3f 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34   ? LARGEST_INT64
16d80 20 3a 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20   : 0x7fffffff;. 
16d90 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68     /* Now get th
16da0 65 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41 52  e read-lock SHAR
16db0 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 2f  ED_LOCK */.    /
16dc0 2a 20 6e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * note that the 
16dd0 71 75 61 6c 69 74 79 20 6f 66 20 74 68 65 20 72  quality of the r
16de0 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e 27  andomness doesn'
16df0 74 20 6d 61 74 74 65 72 20 74 68 61 74 20 6d 75  t matter that mu
16e00 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20 72  ch */.    lk = r
16e10 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20 70 49  andom(); .    pI
16e20 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65  node->sharedByte
16e30 20 3d 20 28 6c 6b 20 26 20 6d 61 73 6b 29 25 28   = (lk & mask)%(
16e40 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29  SHARED_SIZE - 1)
16e50 3b 0a 20 20 20 20 6c 72 63 31 20 3d 20 61 66 70  ;.    lrc1 = afp
16e60 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
16e70 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
16e80 0a 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45  .          SHARE
16e90 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e  D_FIRST+pInode->
16ea0 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31  sharedByte, 1, 1
16eb0 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  );.    if( IS_LO
16ec0 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29  CK_ERROR(lrc1) )
16ed0 7b 0a 20 20 20 20 20 20 6c 72 63 31 45 72 72 6e  {.      lrc1Errn
16ee0 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  o = pFile->lastE
16ef0 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rrno;.    }.    
16f00 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70  /* Drop the temp
16f10 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f  orary PENDING lo
16f20 63 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32 20 3d  ck */.    lrc2 =
16f30 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
16f40 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
16f50 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  le, PENDING_BYTE
16f60 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a 20 20  , 1, 0);.    .  
16f70 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
16f80 52 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a 20 20  ROR(lrc1) ) {.  
16f90 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
16fa0 6e 6f 28 70 46 69 6c 65 2c 20 6c 72 63 31 45 72  no(pFile, lrc1Er
16fb0 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  rno);.      rc =
16fc0 20 6c 72 63 31 3b 0a 20 20 20 20 20 20 67 6f 74   lrc1;.      got
16fd0 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
16fe0 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 49      } else if( I
16ff0 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
17000 32 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  2) ){.      rc =
17010 20 6c 72 63 32 3b 0a 20 20 20 20 20 20 67 6f 74   lrc2;.      got
17020 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
17030 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c      } else if( l
17040 72 63 31 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b  rc1 != SQLITE_OK
17050 20 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20   ) {.      rc = 
17060 6c 72 63 31 3b 0a 20 20 20 20 7d 20 65 6c 73 65  lrc1;.    } else
17070 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
17080 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
17090 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70  ED_LOCK;.      p
170a0 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  Inode->nLock++;.
170b0 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53        pInode->nS
170c0 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  hared = 1;.    }
170d0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69  .  }else if( eFi
170e0 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
170f0 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65  E_LOCK && pInode
17100 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20  ->nShared>1 ){. 
17110 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79     /* We are try
17120 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75  ing for an exclu
17130 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e  sive lock but an
17140 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 6e 20  other thread in 
17150 74 68 69 73 0a 20 20 20 20 20 2a 2a 20 73 61 6d  this.     ** sam
17160 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69  e process is sti
17170 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61  ll holding a sha
17180 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20  red lock. */.   
17190 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
171a0 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
171b0 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 77  /* The request w
171c0 61 73 20 66 6f 72 20 61 20 52 45 53 45 52 56 45  as for a RESERVE
171d0 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
171e0 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20  ock.  It is.    
171f0 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  ** assumed that 
17200 74 68 65 72 65 20 69 73 20 61 20 53 48 41 52 45  there is a SHARE
17210 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  D or greater loc
17220 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20  k on the file.  
17230 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20    ** already..  
17240 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66 61 69    */.    int fai
17250 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  led = 0;.    ass
17260 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65  ert( 0!=pFile->e
17270 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  FileLock );.    
17280 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 20 3e 3d  if (eFileLock >=
17290 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26   RESERVED_LOCK &
172a0 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  & pFile->eFileLo
172b0 63 6b 20 3c 20 52 45 53 45 52 56 45 44 5f 4c 4f  ck < RESERVED_LO
172c0 43 4b 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  CK) {.        /*
172d0 20 41 63 71 75 69 72 65 20 61 20 52 45 53 45 52   Acquire a RESER
172e0 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  VED lock */.    
172f0 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70      failed = afp
17300 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
17310 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
17320 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31  RESERVED_BYTE, 1
17330 2c 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ,1);.      if( !
17340 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  failed ){.      
17350 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72    context->reser
17360 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ved = 1;.      }
17370 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21  .    }.    if (!
17380 66 61 69 6c 65 64 20 26 26 20 65 46 69 6c 65 4c  failed && eFileL
17390 6f 63 6b 20 3d 3d 20 45 58 43 4c 55 53 49 56 45  ock == EXCLUSIVE
173a0 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 2f  _LOCK) {.      /
173b0 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45 58 43  * Acquire an EXC
173c0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a 20  LUSIVE lock */. 
173d0 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a         .      /*
173e0 20 52 65 6d 6f 76 65 20 74 68 65 20 73 68 61 72   Remove the shar
173f0 65 64 20 6c 6f 63 6b 20 62 65 66 6f 72 65 20 74  ed lock before t
17400 72 79 69 6e 67 20 74 68 65 20 72 61 6e 67 65 2e  rying the range.
17410 20 20 77 65 27 6c 6c 20 6e 65 65 64 20 74 6f 20    we'll need to 
17420 0a 20 20 20 20 20 20 2a 2a 20 72 65 65 73 74 61  .      ** reesta
17430 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64  blish the shared
17440 20 6c 6f 63 6b 20 69 66 20 77 65 20 63 61 6e 27   lock if we can'
17450 74 20 67 65 74 20 74 68 65 20 20 61 66 70 55 6e  t get the  afpUn
17460 6c 6f 63 6b 0a 20 20 20 20 20 20 2a 2f 0a 20 20  lock.      */.  
17470 20 20 20 20 69 66 28 20 21 28 66 61 69 6c 65 64      if( !(failed
17480 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
17490 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
174a0 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52  File, SHARED_FIR
174b0 53 54 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20  ST +.           
174c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
174d0 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65  node->sharedByte
174e0 2c 20 31 2c 20 30 29 29 20 29 7b 0a 20 20 20 20  , 1, 0)) ){.    
174f0 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 32 20      int failed2 
17500 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
17510 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61 74 74 65       /* now atte
17520 6d 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20  mmpt to get the 
17530 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 72  exclusive lock r
17540 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  ange */.        
17550 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c  failed = afpSetL
17560 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
17570 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52  ath, pFile, SHAR
17580 45 44 5f 46 49 52 53 54 2c 20 0a 20 20 20 20 20  ED_FIRST, .     
17590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
175a0 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
175b0 5f 53 49 5a 45 2c 20 31 29 3b 0a 20 20 20 20 20  _SIZE, 1);.     
175c0 20 20 20 69 66 28 20 66 61 69 6c 65 64 20 26 26     if( failed &&
175d0 20 28 66 61 69 6c 65 64 32 20 3d 20 61 66 70 53   (failed2 = afpS
175e0 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
175f0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a  dbPath, pFile, .
17600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17610 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49         SHARED_FI
17620 52 53 54 20 2b 20 70 49 6e 6f 64 65 2d 3e 73 68  RST + pInode->sh
17630 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29 29  aredByte, 1, 1))
17640 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
17650 20 43 61 6e 27 74 20 72 65 65 73 74 61 62 6c 69   Can't reestabli
17660 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  sh the shared lo
17670 63 6b 2e 20 20 53 71 6c 69 74 65 20 63 61 6e 27  ck.  Sqlite can'
17680 74 20 64 65 61 6c 2c 20 74 68 69 73 20 69 73 0a  t deal, this is.
17690 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63            ** a c
176a0 72 69 74 69 63 61 6c 20 49 2f 4f 20 65 72 72 6f  ritical I/O erro
176b0 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  r.          */. 
176c0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 28 28           rc = ((
176d0 66 61 69 6c 65 64 20 26 20 53 51 4c 49 54 45 5f  failed & SQLITE_
176e0 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45  IOERR) == SQLITE
176f0 5f 49 4f 45 52 52 29 20 3f 20 66 61 69 6c 65 64  _IOERR) ? failed
17700 32 20 3a 20 0a 20 20 20 20 20 20 20 20 20 20 20  2 : .           
17710 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52      SQLITE_IOERR
17720 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20  _LOCK;.         
17730 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
17740 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 20 0a 20  ck;.        } . 
17750 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
17760 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b      rc = failed;
17770 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a   .      }.    }.
17780 20 20 20 20 69 66 28 20 66 61 69 6c 65 64 20 29      if( failed )
17790 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61 69  {.      rc = fai
177a0 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  led;.    }.  }. 
177b0 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49   .  if( rc==SQLI
177c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69  TE_OK ){.    pFi
177d0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
177e0 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70  eFileLock;.    p
177f0 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
17800 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
17810 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c  }else if( eFileL
17820 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
17830 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  OCK ){.    pFile
17840 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45  ->eFileLock = PE
17850 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20  NDING_LOCK;.    
17860 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
17870 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  k = PENDING_LOCK
17880 3b 0a 20 20 7d 0a 20 20 0a 61 66 70 5f 65 6e 64  ;.  }.  .afp_end
17890 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61  _lock:.  unixLea
178a0 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54  veMutex();.  OST
178b0 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
178c0 64 20 25 73 20 25 73 20 28 61 66 70 29 5c 6e 22  d %s %s (afp)\n"
178d0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69  , pFile->h, azFi
178e0 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
178f0 29 2c 20 0a 20 20 20 20 20 20 20 20 20 72 63 3d  ), .         rc=
17900 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b  =SQLITE_OK ? "ok
17910 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
17920 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17930 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
17940 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
17950 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
17960 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c   pFile to eFileL
17970 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a  ock.  eFileLock.
17980 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
17990 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
179a0 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
179b0 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
179c0 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
179d0 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
179e0 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
179f0 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
17a00 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
17a10 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
17a20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
17a30 74 61 74 69 63 20 69 6e 74 20 61 66 70 55 6e 6c  tatic int afpUnl
17a40 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
17a50 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
17a60 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  ock) {.  int rc 
17a70 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
17a80 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
17a90 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
17aa0 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
17ab0 2a 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f  *pInode;.  afpLo
17ac0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f  ckingContext *co
17ad0 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b  ntext = (afpLock
17ae0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46  ingContext *) pF
17af0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
17b00 65 78 74 3b 0a 20 20 69 6e 74 20 73 6b 69 70 53  ext;.  int skipS
17b10 68 61 72 65 64 20 3d 20 30 3b 0a 23 69 66 64 65  hared = 0;.#ifde
17b20 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
17b30 69 6e 74 20 68 20 3d 20 70 46 69 6c 65 2d 3e 68  int h = pFile->h
17b40 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
17b50 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
17b60 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  STRACE(("UNLOCK 
17b70 20 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64   %d %d was %d(%d
17b80 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61 66 70  ,%d) pid=%d (afp
17b90 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
17ba0 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20  eFileLock,.     
17bb0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
17bc0 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70  leLock, pFile->p
17bd0 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
17be0 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  , pFile->pInode-
17bf0 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20  >nShared,.      
17c00 20 20 20 20 20 6f 73 47 65 74 70 69 64 28 30 29       osGetpid(0)
17c10 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65  ));..  assert( e
17c20 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  FileLock<=SHARED
17c30 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  _LOCK );.  if( p
17c40 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c  File->eFileLock<
17c50 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
17c60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17c70 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e  OK;.  }.  unixEn
17c80 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49  terMutex();.  pI
17c90 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
17ca0 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  node;.  assert( 
17cb0 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21  pInode->nShared!
17cc0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  =0 );.  if( pFil
17cd0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
17ce0 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
17cf0 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
17d00 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65  eFileLock==pFile
17d10 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20  ->eFileLock );. 
17d20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
17d30 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
17d40 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
17d50 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 53  ( h=(-1) ).    S
17d60 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
17d70 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 0a 23 69  nign(0);.    .#i
17d80 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
17d90 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65  G.    /* When re
17da0 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75  ducing a lock su
17db0 63 68 20 74 68 61 74 20 6f 74 68 65 72 20 70 72  ch that other pr
17dc0 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74 61 72  ocesses can star
17dd0 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67  t.    ** reading
17de0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
17df0 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73  le again, make s
17e00 75 72 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  ure that the.   
17e10 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
17e20 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61  counter was upda
17e30 74 65 64 20 69 66 20 61 6e 79 20 70 61 72 74 20  ted if any part 
17e40 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
17e50 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e      ** file chan
17e60 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61  ged.  If the tra
17e70 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
17e80 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c   is not updated,
17e90 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f  .    ** other co
17ea0 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65  nnections to the
17eb0 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74   same file might
17ec0 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61   not realize tha
17ed0 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c  t.    ** the fil
17ee0 65 20 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e  e has changed an
17ef0 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f  d hence might no
17f00 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20  t know to flush 
17f10 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63  their.    ** cac
17f20 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20  he.  The use of 
17f30 61 20 73 74 61 6c 65 20 63 61 63 68 65 20 63 61  a stale cache ca
17f40 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61  n lead to databa
17f50 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  se corruption.. 
17f60 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
17f70 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61  ( pFile->inNorma
17f80 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20 20 20 20  lWrite==0.      
17f90 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 64       || pFile->d
17fa0 62 55 70 64 61 74 65 3d 3d 30 0a 20 20 20 20 20  bUpdate==0.     
17fb0 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e        || pFile->
17fc0 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d 31  transCntrChng==1
17fd0 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69   );.    pFile->i
17fe0 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30  nNormalWrite = 0
17ff0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 20 20  ;.#endif.    .  
18000 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
18010 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
18020 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  E_LOCK ){.      
18030 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
18040 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
18050 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46   pFile, SHARED_F
18060 49 52 53 54 2c 20 53 48 41 52 45 44 5f 53 49 5a  IRST, SHARED_SIZ
18070 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  E, 0);.      if(
18080 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
18090 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  & (eFileLock==SH
180a0 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e  ARED_LOCK || pIn
180b0 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29 20  ode->nShared>1) 
180c0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6f 6e  ){.        /* on
180d0 6c 79 20 72 65 2d 65 73 74 61 62 6c 69 73 68 20  ly re-establish 
180e0 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
180f0 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a  if necessary */.
18100 20 20 20 20 20 20 20 20 69 6e 74 20 73 68 61 72          int shar
18110 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41  edLockByte = SHA
18120 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65  RED_FIRST+pInode
18130 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20  ->sharedByte;.  
18140 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
18150 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
18160 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68  bPath, pFile, sh
18170 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c  aredLockByte, 1,
18180 20 31 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73   1);.      } els
18190 65 20 7b 0a 20 20 20 20 20 20 20 20 73 6b 69 70  e {.        skip
181a0 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20  Shared = 1;.    
181b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
181c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
181d0 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
181e0 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock>=PENDING_LOC
181f0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
18200 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
18210 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
18220 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  e, PENDING_BYTE,
18230 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 0a 20   1, 0);.    } . 
18240 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18250 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65  E_OK && pFile->e
18260 46 69 6c 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56  FileLock>=RESERV
18270 45 44 5f 4c 4f 43 4b 20 26 26 20 63 6f 6e 74 65  ED_LOCK && conte
18280 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b 0a  xt->reserved ){.
18290 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
182a0 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
182b0 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45  bPath, pFile, RE
182c0 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20  SERVED_BYTE, 1, 
182d0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 72  0);.      if( !r
182e0 63 20 29 7b 20 0a 20 20 20 20 20 20 20 20 63 6f  c ){ .        co
182f0 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20  ntext->reserved 
18300 3d 20 30 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  = 0; .      }.  
18310 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
18320 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46  SQLITE_OK && (eF
18330 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
18340 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
18350 6e 53 68 61 72 65 64 3e 31 29 29 7b 0a 20 20 20  nShared>1)){.   
18360 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
18370 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
18380 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  CK;.    }.  }.  
18390 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
183a0 4b 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  K && eFileLock==
183b0 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20 20 20  NO_LOCK ){..    
183c0 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
183d0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75   shared lock cou
183e0 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74  nter.  Release t
183f0 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e  he lock using an
18400 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20  .    ** OS call 
18410 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68  only when all th
18420 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 73 61  reads in this sa
18430 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 65 20  me process have 
18440 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20  released.    ** 
18450 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f  the lock..    */
18460 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  .    unsigned lo
18470 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 4c 6f  ng long sharedLo
18480 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f  ckByte = SHARED_
18490 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68  FIRST+pInode->sh
184a0 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20 70 49  aredByte;.    pI
184b0 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b  node->nShared--;
184c0 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
184d0 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20  >nShared==0 ){. 
184e0 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
184f0 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
18500 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
18510 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20  rror( h=(-1) ). 
18520 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
18530 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
18540 20 20 20 20 20 69 66 28 20 21 73 6b 69 70 53 68       if( !skipSh
18550 61 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  ared ){.        
18560 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
18570 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
18580 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f   pFile, sharedLo
18590 63 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a 20  ckByte, 1, 0);. 
185a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
185b0 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20   !rc ){.        
185c0 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
185d0 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20  k = NO_LOCK;.   
185e0 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
185f0 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
18600 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18610 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18620 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 49  E_OK ){.      pI
18630 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20  node->nLock--;. 
18640 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
18650 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b  ode->nLock>=0 );
18660 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64  .      if( pInod
18670 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20  e->nLock==0 ){. 
18680 20 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64         closePend
18690 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20  ingFds(pFile);. 
186a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
186b0 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  .  .  unixLeaveM
186c0 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63  utex();.  if( rc
186d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46  ==SQLITE_OK ) pF
186e0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
186f0 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65   eFileLock;.  re
18700 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
18710 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 26  * Close a file &
18720 20 63 6c 65 61 6e 75 70 20 41 46 50 20 73 70 65   cleanup AFP spe
18730 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63 6f  cific locking co
18740 6e 74 65 78 74 20 0a 2a 2f 0a 73 74 61 74 69 63  ntext .*/.static
18750 20 69 6e 74 20 61 66 70 43 6c 6f 73 65 28 73 71   int afpClose(sq
18760 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
18770 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
18780 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 64  ITE_OK;.  if( id
18790 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65   ){.    unixFile
187a0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
187b0 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 61 66 70  ile*)id;.    afp
187c0 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f  Unlock(id, NO_LO
187d0 43 4b 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74  CK);.    unixEnt
187e0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 69  erMutex();.    i
187f0 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  f( pFile->pInode
18800 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64   && pFile->pInod
18810 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  e->nLock ){.    
18820 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
18830 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f  e outstanding lo
18840 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75  cks, do not actu
18850 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66  ally close the f
18860 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 20 20 2a  ile just.      *
18870 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74 68  * yet because th
18880 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74  at would clear t
18890 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73  hose locks.  Ins
188a0 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66 69  tead, add the fi
188b0 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63  le.      ** desc
188c0 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65  riptor to pInode
188d0 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74 20  ->aPending.  It 
188e0 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69  will be automati
188f0 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68 65  cally closed whe
18900 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c  n.      ** the l
18910 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61  ast lock is clea
18920 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  red..      */.  
18930 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64      setPendingFd
18940 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20  (pFile);.    }. 
18950 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49     releaseInodeI
18960 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  nfo(pFile);.    
18970 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69  sqlite3_free(pFi
18980 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
18990 78 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c  xt);.    rc = cl
189a0 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b  oseUnixFile(id);
189b0 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  .    unixLeaveMu
189c0 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74  tex();.  }.  ret
189d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69  urn rc;.}..#endi
189e0 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41  f /* defined(__A
189f0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
18a00 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
18a10 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20  _STYLE */./*.** 
18a20 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69  The code above i
18a30 73 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69  s the AFP lock i
18a40 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20  mplementation.  
18a50 54 68 65 20 63 6f 64 65 20 69 73 20 73 70 65 63  The code is spec
18a60 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53  ific.** to MacOS
18a70 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77  X and does not w
18a80 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69  ork on other uni
18a90 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f  x platforms.  No
18aa0 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20   alternative.** 
18ab0 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 49  is available.  I
18ac0 66 20 79 6f 75 20 64 6f 6e 27 74 20 63 6f 6d 70  f you don't comp
18ad0 69 6c 65 20 66 6f 72 20 61 20 6d 61 63 2c 20 74  ile for a mac, t
18ae0 68 65 6e 20 74 68 65 20 22 75 6e 69 78 2d 61 66  hen the "unix-af
18af0 70 22 0a 2a 2a 20 56 46 53 20 69 73 20 6e 6f 74  p".** VFS is not
18b00 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a   available..**.*
18b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18b20 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
18b30 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  AFP lock impleme
18b40 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
18b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
18b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
18bb0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
18bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
18c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
18c20 6e 20 4e 46 53 20 4c 6f 63 6b 69 6e 67 20 2a 2a  n NFS Locking **
18c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
18c50 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
18c60 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
18c70 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
18c80 5f 53 54 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f  _STYLE./*. ** Lo
18c90 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
18ca0 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
18cb0 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
18cc0 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
18cd0 69 6c 65 4c 6f 63 6b 0a 20 2a 2a 20 6d 75 73 74  ileLock. ** must
18ce0 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
18cf0 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
18d00 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20 49 66 20 74 68  K.. **. ** If th
18d10 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
18d20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
18d30 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
18d40 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 20 2a  y at or below. *
18d50 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
18d60 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
18d70 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
18d80 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73 74 61 74   no-op.. */.stat
18d90 69 63 20 69 6e 74 20 6e 66 73 55 6e 6c 6f 63 6b  ic int nfsUnlock
18da0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
18db0 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
18dc0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 6f 73 69  ){.  return posi
18dd0 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c  xUnlock(id, eFil
18de0 65 4c 6f 63 6b 2c 20 31 29 3b 0a 7d 0a 0a 23 65  eLock, 1);.}..#e
18df0 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
18e00 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
18e10 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
18e20 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a  ING_STYLE */./*.
18e30 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76  ** The code abov
18e40 65 20 69 73 20 74 68 65 20 4e 46 53 20 6c 6f 63  e is the NFS loc
18e50 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
18e60 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73 20 73  .  The code is s
18e70 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61  pecific.** to Ma
18e80 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f  cOSX and does no
18e90 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20  t work on other 
18ea0 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20  unix platforms. 
18eb0 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a   No alternative.
18ec0 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e  ** is available.
18ed0 20 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a    .**.**********
18ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
18ef0 6f 66 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20  of the NFS lock 
18f00 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
18f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18f20 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
18f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18f70 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
18f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18fc0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
18fd0 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b  ******* Non-lock
18fe0 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ing sqlite3_file
18ff0 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   methods *******
19000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19010 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65  ******.**.** The
19020 20 6e 65 78 74 20 64 69 76 69 73 69 6f 6e 20 63   next division c
19030 6f 6e 74 61 69 6e 73 20 69 6d 70 6c 65 6d 65 6e  ontains implemen
19040 74 61 74 69 6f 6e 73 20 66 6f 72 20 61 6c 6c 20  tations for all 
19050 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20 0a  methods of the .
19060 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ** sqlite3_file 
19070 6f 62 6a 65 63 74 20 6f 74 68 65 72 20 74 68 61  object other tha
19080 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 65  n the locking me
19090 74 68 6f 64 73 2e 20 20 54 68 65 20 6c 6f 63 6b  thods.  The lock
190a0 69 6e 67 0a 2a 2a 20 6d 65 74 68 6f 64 73 20 77  ing.** methods w
190b0 65 72 65 20 64 65 66 69 6e 65 64 20 69 6e 20 64  ere defined in d
190c0 69 76 69 73 69 6f 6e 73 20 61 62 6f 76 65 20 28  ivisions above (
190d0 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  one locking meth
190e0 6f 64 20 70 65 72 0a 2a 2a 20 64 69 76 69 73 69  od per.** divisi
190f0 6f 6e 29 2e 20 20 54 68 6f 73 65 20 6d 65 74 68  on).  Those meth
19100 6f 64 73 20 74 68 61 74 20 61 72 65 20 63 6f 6d  ods that are com
19110 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69  mon to all locki
19120 6e 67 20 6d 6f 64 65 73 0a 2a 2a 20 61 72 65 20  ng modes.** are 
19130 67 61 74 68 65 72 20 74 6f 67 65 74 68 65 72 20  gather together 
19140 69 6e 74 6f 20 74 68 69 73 20 64 69 76 69 73 69  into this divisi
19150 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65  on..*/../*.** Se
19160 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74  ek to the offset
19170 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
19180 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20  econd argument, 
19190 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 0a 2a  then read cnt .*
191a0 2a 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75  * bytes into pBu
191b0 66 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  f. Return the nu
191c0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
191d0 74 75 61 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a 0a  tually read..**.
191e0 2a 2a 20 4e 42 3a 20 20 49 66 20 79 6f 75 20 64  ** NB:  If you d
191f0 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44 20  efine USE_PREAD 
19200 6f 72 20 55 53 45 5f 50 52 45 41 44 36 34 2c 20  or USE_PREAD64, 
19210 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 61 6c  then it might al
19220 73 6f 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73 61  so.** be necessa
19230 72 79 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f  ry to define _XO
19240 50 45 4e 5f 53 4f 55 52 43 45 20 74 6f 20 62 65  PEN_SOURCE to be
19250 20 35 30 30 2e 20 20 54 68 69 73 20 76 61 72 69   500.  This vari
19260 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20 73  es from.** one s
19270 79 73 74 65 6d 20 74 6f 20 61 6e 6f 74 68 65 72  ystem to another
19280 2e 20 20 53 69 6e 63 65 20 53 51 4c 69 74 65 20  .  Since SQLite 
19290 64 6f 65 73 20 6e 6f 74 20 64 65 66 69 6e 65 20  does not define 
192a0 55 53 45 5f 50 52 45 41 44 0a 2a 2a 20 69 6e 20  USE_PREAD.** in 
192b0 61 6e 79 20 66 6f 72 6d 20 62 79 20 64 65 66 61  any form by defa
192c0 75 6c 74 2c 20 77 65 20 77 69 6c 6c 20 6e 6f 74  ult, we will not
192d0 20 61 74 74 65 6d 70 74 20 74 6f 20 64 65 66 69   attempt to defi
192e0 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45  ne _XOPEN_SOURCE
192f0 2e 0a 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 73  ..** See tickets
19300 20 23 32 37 34 31 20 61 6e 64 20 23 32 36 38 31   #2741 and #2681
19310 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64  ..**.** To avoid
19320 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72   stomping the er
19330 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66  rno value on a f
19340 61 69 6c 65 64 20 72 65 61 64 20 74 68 65 20 6c  ailed read the l
19350 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a  astErrno value.*
19360 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72 65 20  * is set before 
19370 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74  returning..*/.st
19380 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64  atic int seekAnd
19390 52 65 61 64 28 75 6e 69 78 46 69 6c 65 20 2a 69  Read(unixFile *i
193a0 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  d, sqlite3_int64
193b0 20 6f 66 66 73 65 74 2c 20 76 6f 69 64 20 2a 70   offset, void *p
193c0 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20  Buf, int cnt){. 
193d0 20 69 6e 74 20 67 6f 74 3b 0a 20 20 69 6e 74 20   int got;.  int 
193e0 70 72 69 6f 72 20 3d 20 30 3b 0a 23 69 66 20 28  prior = 0;.#if (
193f0 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45  !defined(USE_PRE
19400 41 44 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  AD) && !defined(
19410 55 53 45 5f 50 52 45 41 44 36 34 29 29 0a 20 20  USE_PREAD64)).  
19420 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23  i64 newOffset;.#
19430 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 53 54  endif.  TIMER_ST
19440 41 52 54 3b 0a 20 20 61 73 73 65 72 74 28 20 63  ART;.  assert( c
19450 6e 74 3d 3d 28 63 6e 74 26 30 78 31 66 66 66 66  nt==(cnt&0x1ffff
19460 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ) );.  assert( i
19470 64 2d 3e 68 3e 32 20 29 3b 0a 20 20 64 6f 7b 0a  d->h>2 );.  do{.
19480 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
19490 50 52 45 41 44 29 0a 20 20 20 20 67 6f 74 20 3d  PREAD).    got =
194a0 20 6f 73 50 72 65 61 64 28 69 64 2d 3e 68 2c 20   osPread(id->h, 
194b0 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65  pBuf, cnt, offse
194c0 74 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  t);.    Simulate
194d0 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d  IOError( got = -
194e0 31 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  1 );.#elif defin
194f0 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a  ed(USE_PREAD64).
19500 20 20 20 20 67 6f 74 20 3d 20 6f 73 50 72 65 61      got = osPrea
19510 64 36 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  d64(id->h, pBuf,
19520 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20   cnt, offset);. 
19530 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
19540 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a  or( got = -1 );.
19550 23 65 6c 73 65 0a 20 20 20 20 6e 65 77 4f 66 66  #else.    newOff
19560 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e  set = lseek(id->
19570 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f  h, offset, SEEK_
19580 53 45 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  SET);.    Simula
19590 74 65 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66  teIOError( newOf
195a0 66 73 65 74 2d 2d 20 29 3b 0a 20 20 20 20 69 66  fset-- );.    if
195b0 28 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66 66  ( newOffset!=off
195c0 73 65 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  set ){.      if(
195d0 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31   newOffset == -1
195e0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72   ){.        stor
195f0 65 4c 61 73 74 45 72 72 6e 6f 28 28 75 6e 69 78  eLastErrno((unix
19600 46 69 6c 65 2a 29 69 64 2c 20 65 72 72 6e 6f 29  File*)id, errno)
19610 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
19620 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
19630 45 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65 2a  Errno((unixFile*
19640 29 69 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  )id, 0);.      }
19650 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
19660 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 20  ;.    }.    got 
19670 3d 20 6f 73 52 65 61 64 28 69 64 2d 3e 68 2c 20  = osRead(id->h, 
19680 70 42 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64  pBuf, cnt);.#end
19690 69 66 0a 20 20 20 20 69 66 28 20 67 6f 74 3d 3d  if.    if( got==
196a0 63 6e 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  cnt ) break;.   
196b0 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20   if( got<0 ){.  
196c0 20 20 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45      if( errno==E
196d0 49 4e 54 52 20 29 7b 20 67 6f 74 20 3d 20 31 3b  INTR ){ got = 1;
196e0 20 63 6f 6e 74 69 6e 75 65 3b 20 7d 0a 20 20 20   continue; }.   
196f0 20 20 20 70 72 69 6f 72 20 3d 20 30 3b 0a 20 20     prior = 0;.  
19700 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
19710 6e 6f 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  no((unixFile*)id
19720 2c 20 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20  ,  errno);.     
19730 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73   break;.    }els
19740 65 20 69 66 28 20 67 6f 74 3e 30 20 29 7b 0a 20  e if( got>0 ){. 
19750 20 20 20 20 20 63 6e 74 20 2d 3d 20 67 6f 74 3b       cnt -= got;
19760 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  .      offset +=
19770 20 67 6f 74 3b 0a 20 20 20 20 20 20 70 72 69 6f   got;.      prio
19780 72 20 2b 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20  r += got;.      
19790 70 42 75 66 20 3d 20 28 76 6f 69 64 2a 29 28 67  pBuf = (void*)(g
197a0 6f 74 20 2b 20 28 63 68 61 72 2a 29 70 42 75 66  ot + (char*)pBuf
197b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c  );.    }.  }whil
197c0 65 28 20 67 6f 74 3e 30 20 29 3b 0a 20 20 54 49  e( got>0 );.  TI
197d0 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41  MER_END;.  OSTRA
197e0 43 45 28 28 22 52 45 41 44 20 20 20 20 25 2d 33  CE(("READ    %-3
197f0 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75  d %5d %7lld %llu
19800 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
19810 20 69 64 2d 3e 68 2c 20 67 6f 74 2b 70 72 69 6f   id->h, got+prio
19820 72 2c 20 6f 66 66 73 65 74 2d 70 72 69 6f 72 2c  r, offset-prior,
19830 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29   TIMER_ELAPSED))
19840 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 2b 70  ;.  return got+p
19850 72 69 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rior;.}../*.** R
19860 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20  ead data from a 
19870 66 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66  file into a buff
19880 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  er.  Return SQLI
19890 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20  TE_OK if all.** 
198a0 62 79 74 65 73 20 77 65 72 65 20 72 65 61 64 20  bytes were read 
198b0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64  successfully and
198c0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66   SQLITE_IOERR if
198d0 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
198e0 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  * wrong..*/.stat
198f0 69 63 20 69 6e 74 20 75 6e 69 78 52 65 61 64 28  ic int unixRead(
19900 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
19910 2a 69 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70 42  *id, .  void *pB
19920 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a  uf, .  int amt,.
19930 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
19940 6f 66 66 73 65 74 0a 29 7b 0a 20 20 75 6e 69 78  offset.){.  unix
19950 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
19960 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20  nixFile *)id;.  
19970 69 6e 74 20 67 6f 74 3b 0a 20 20 61 73 73 65 72  int got;.  asser
19980 74 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65 72  t( id );.  asser
19990 74 28 20 6f 66 66 73 65 74 3e 3d 30 20 29 3b 0a  t( offset>=0 );.
199a0 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20    assert( amt>0 
199b0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
199c0 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20 66   is a database f
199d0 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e  ile (not a journ
199e0 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  al, master-journ
199f0 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20  al or temp.  ** 
19a00 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73  file), the bytes
19a10 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   in the locking 
19a20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76  range should nev
19a30 65 72 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  er be read or wr
19a40 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a  itten. */.#if 0.
19a50 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
19a60 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20  >pUnused==0.    
19a70 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45     || offset>=PE
19a80 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20  NDING_BYTE+512. 
19a90 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b        || offset+
19aa0 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54  amt<=PENDING_BYT
19ab0 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  E .  );.#endif..
19ac0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
19ad0 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20  MAP_SIZE>0.  /* 
19ae0 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75 63  Deal with as muc
19af0 68 20 6f 66 20 74 68 69 73 20 72 65 61 64 20 72  h of this read r
19b00 65 71 75 65 73 74 20 61 73 20 70 6f 73 73 69 62  equest as possib
19b10 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72 69 6e  le by transferin
19b20 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d  g.  ** data from
19b30 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70   the memory mapp
19b40 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70 79  ing using memcpy
19b50 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66  ().  */.  if( of
19b60 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70  fset<pFile->mmap
19b70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20  Size ){.    if( 
19b80 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46  offset+amt <= pF
19b90 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
19ba0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42  .      memcpy(pB
19bb0 75 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46 69  uf, &((u8 *)(pFi
19bc0 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29  le->pMapRegion))
19bd0 5b 6f 66 66 73 65 74 5d 2c 20 61 6d 74 29 3b 0a  [offset], amt);.
19be0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
19bf0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
19c00 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  e{.      int nCo
19c10 70 79 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  py = pFile->mmap
19c20 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20  Size - offset;. 
19c30 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66       memcpy(pBuf
19c40 2c 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65  , &((u8 *)(pFile
19c50 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f  ->pMapRegion))[o
19c60 66 66 73 65 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a  ffset], nCopy);.
19c70 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 28 28        pBuf = &((
19c80 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79  u8 *)pBuf)[nCopy
19c90 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d 20  ];.      amt -= 
19ca0 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 66  nCopy;.      off
19cb0 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20  set += nCopy;.  
19cc0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
19cd0 20 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64 52    got = seekAndR
19ce0 65 61 64 28 70 46 69 6c 65 2c 20 6f 66 66 73 65  ead(pFile, offse
19cf0 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20  t, pBuf, amt);. 
19d00 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b   if( got==amt ){
19d10 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
19d20 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69  TE_OK;.  }else i
19d30 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20  f( got<0 ){.    
19d40 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74  /* lastErrno set
19d50 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64 20   by seekAndRead 
19d60 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
19d70 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b  LITE_IOERR_READ;
19d80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74  .  }else{.    st
19d90 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
19da0 6c 65 2c 20 30 29 3b 20 20 20 2f 2a 20 6e 6f 74  le, 0);   /* not
19db0 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72 20   a system error 
19dc0 2a 2f 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64  */.    /* Unread
19dd0 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 62 75   parts of the bu
19de0 66 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72  ffer must be zer
19df0 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20  o-filled */.    
19e00 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29  memset(&((char*)
19e10 70 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20 61  pBuf)[got], 0, a
19e20 6d 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65 74  mt-got);.    ret
19e30 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
19e40 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d  _SHORT_READ;.  }
19e50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
19e60 74 20 74 6f 20 73 65 65 6b 20 74 68 65 20 66 69  t to seek the fi
19e70 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 70 61  le-descriptor pa
19e80 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
19e90 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 0a 2a 2a  t argument to.**
19ea0 20 61 62 73 6f 6c 75 74 65 20 6f 66 66 73 65 74   absolute offset
19eb0 20 69 4f 66 66 2c 20 74 68 65 6e 20 61 74 74 65   iOff, then atte
19ec0 6d 70 74 20 74 6f 20 77 72 69 74 65 20 6e 42 75  mpt to write nBu
19ed0 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  f bytes of data 
19ee0 66 72 6f 6d 0a 2a 2a 20 70 42 75 66 20 74 6f 20  from.** pBuf to 
19ef0 69 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  it. If an error 
19f00 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 2d  occurs, return -
19f10 31 20 61 6e 64 20 73 65 74 20 2a 70 69 45 72 72  1 and set *piErr
19f20 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a  no. Otherwise, .
19f30 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 61 63  ** return the ac
19f40 74 75 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62  tual number of b
19f50 79 74 65 73 20 77 72 69 74 74 65 6e 20 28 77 68  ytes written (wh
19f60 69 63 68 20 6d 61 79 20 62 65 20 6c 65 73 73 20  ich may be less 
19f70 74 68 61 6e 0a 2a 2a 20 6e 42 75 66 29 2e 0a 2a  than.** nBuf)..*
19f80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
19f90 6b 41 6e 64 57 72 69 74 65 46 64 28 0a 20 20 69  kAndWriteFd(.  i
19fa0 6e 74 20 66 64 2c 20 20 20 20 20 20 20 20 20 20  nt fd,          
19fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19fc0 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
19fd0 72 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f  r to write to */
19fe0 0a 20 20 69 36 34 20 69 4f 66 66 2c 20 20 20 20  .  i64 iOff,    
19ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a000 20 20 20 2f 2a 20 46 69 6c 65 20 6f 66 66 73 65     /* File offse
1a010 74 20 74 6f 20 62 65 67 69 6e 20 77 72 69 74 69  t to begin writi
1a020 6e 67 20 61 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  ng at */.  const
1a030 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
1a040 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1a050 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69  py data from thi
1a060 73 20 62 75 66 66 65 72 20 74 6f 20 74 68 65 20  s buffer to the 
1a070 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  file */.  int nB
1a080 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
1a090 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1a0a0 65 20 6f 66 20 62 75 66 66 65 72 20 70 42 75 66  e of buffer pBuf
1a0b0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
1a0c0 6e 74 20 2a 70 69 45 72 72 6e 6f 20 20 20 20 20  nt *piErrno     
1a0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a0e0 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 6e 75 6d  * OUT: Error num
1a0f0 62 65 72 20 69 66 20 65 72 72 6f 72 20 6f 63 63  ber if error occ
1a100 75 72 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  urs */.){.  int 
1a110 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  rc = 0;         
1a120 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
1a130 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
1a140 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a   system call */.
1a150 0a 20 20 61 73 73 65 72 74 28 20 6e 42 75 66 3d  .  assert( nBuf=
1a160 3d 28 6e 42 75 66 26 30 78 31 66 66 66 66 29 20  =(nBuf&0x1ffff) 
1a170 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 64 3e  );.  assert( fd>
1a180 32 20 29 3b 0a 20 20 6e 42 75 66 20 26 3d 20 30  2 );.  nBuf &= 0
1a190 78 31 66 66 66 66 3b 0a 20 20 54 49 4d 45 52 5f  x1ffff;.  TIMER_
1a1a0 53 54 41 52 54 3b 0a 0a 23 69 66 20 64 65 66 69  START;..#if defi
1a1b0 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20  ned(USE_PREAD). 
1a1c0 20 64 6f 7b 20 72 63 20 3d 20 28 69 6e 74 29 6f   do{ rc = (int)o
1a1d0 73 50 77 72 69 74 65 28 66 64 2c 20 70 42 75 66  sPwrite(fd, pBuf
1a1e0 2c 20 6e 42 75 66 2c 20 69 4f 66 66 29 3b 20 7d  , nBuf, iOff); }
1a1f0 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
1a200 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23  rrno==EINTR );.#
1a210 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  elif defined(USE
1a220 5f 50 52 45 41 44 36 34 29 0a 20 20 64 6f 7b 20  _PREAD64).  do{ 
1a230 72 63 20 3d 20 28 69 6e 74 29 6f 73 50 77 72 69  rc = (int)osPwri
1a240 74 65 36 34 28 66 64 2c 20 70 42 75 66 2c 20 6e  te64(fd, pBuf, n
1a250 42 75 66 2c 20 69 4f 66 66 29 3b 7d 77 68 69 6c  Buf, iOff);}whil
1a260 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f  e( rc<0 && errno
1a270 3d 3d 45 49 4e 54 52 29 3b 0a 23 65 6c 73 65 0a  ==EINTR);.#else.
1a280 20 20 64 6f 7b 0a 20 20 20 20 69 36 34 20 69 53    do{.    i64 iS
1a290 65 65 6b 20 3d 20 6c 73 65 65 6b 28 66 64 2c 20  eek = lseek(fd, 
1a2a0 69 4f 66 66 2c 20 53 45 45 4b 5f 53 45 54 29 3b  iOff, SEEK_SET);
1a2b0 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
1a2c0 72 72 6f 72 28 20 69 53 65 65 6b 2d 2d 20 29 3b  rror( iSeek-- );
1a2d0 0a 0a 20 20 20 20 69 66 28 20 69 53 65 65 6b 21  ..    if( iSeek!
1a2e0 3d 69 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 69  =iOff ){.      i
1a2f0 66 28 20 70 69 45 72 72 6e 6f 20 29 20 2a 70 69  f( piErrno ) *pi
1a300 45 72 72 6e 6f 20 3d 20 28 69 53 65 65 6b 3d 3d  Errno = (iSeek==
1a310 2d 31 20 3f 20 65 72 72 6e 6f 20 3a 20 30 29 3b  -1 ? errno : 0);
1a320 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
1a330 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
1a340 20 6f 73 57 72 69 74 65 28 66 64 2c 20 70 42 75   osWrite(fd, pBu
1a350 66 2c 20 6e 42 75 66 29 3b 0a 20 20 7d 77 68 69  f, nBuf);.  }whi
1a360 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e  le( rc<0 && errn
1a370 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6e 64  o==EINTR );.#end
1a380 69 66 0a 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b  if..  TIMER_END;
1a390 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49  .  OSTRACE(("WRI
1a3a0 54 45 20 20 20 25 2d 33 64 20 25 35 64 20 25 37  TE   %-3d %5d %7
1a3b0 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 66 64 2c  lld %llu\n", fd,
1a3c0 20 72 63 2c 20 69 4f 66 66 2c 20 54 49 4d 45 52   rc, iOff, TIMER
1a3d0 5f 45 4c 41 50 53 45 44 29 29 3b 0a 0a 20 20 69  _ELAPSED));..  i
1a3e0 66 28 20 72 63 3c 30 20 26 26 20 70 69 45 72 72  f( rc<0 && piErr
1a3f0 6e 6f 20 29 20 2a 70 69 45 72 72 6e 6f 20 3d 20  no ) *piErrno = 
1a400 65 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20  errno;.  return 
1a410 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65  rc;.}.../*.** Se
1a420 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74  ek to the offset
1a430 20 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74 20 74   in id->offset t
1a440 68 65 6e 20 72 65 61 64 20 63 6e 74 20 62 79 74  hen read cnt byt
1a450 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a  es into pBuf..**
1a460 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
1a470 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
1a480 61 6c 6c 79 20 72 65 61 64 2e 20 20 55 70 64 61  ally read.  Upda
1a490 74 65 20 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a  te the offset..*
1a4a0 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74  *.** To avoid st
1a4b0 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f  omping the errno
1a4c0 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c   value on a fail
1a4d0 65 64 20 77 72 69 74 65 20 74 68 65 20 6c 61 73  ed write the las
1a4e0 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20  tErrno value.** 
1a4f0 69 73 20 73 65 74 20 62 65 66 6f 72 65 20 72 65  is set before re
1a500 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
1a510 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 57 72  ic int seekAndWr
1a520 69 74 65 28 75 6e 69 78 46 69 6c 65 20 2a 69 64  ite(unixFile *id
1a530 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 63 6f  , i64 offset, co
1a540 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  nst void *pBuf, 
1a550 69 6e 74 20 63 6e 74 29 7b 0a 20 20 72 65 74 75  int cnt){.  retu
1a560 72 6e 20 73 65 65 6b 41 6e 64 57 72 69 74 65 46  rn seekAndWriteF
1a570 64 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c  d(id->h, offset,
1a580 20 70 42 75 66 2c 20 63 6e 74 2c 20 26 69 64 2d   pBuf, cnt, &id-
1a590 3e 6c 61 73 74 45 72 72 6e 6f 29 3b 0a 7d 0a 0a  >lastErrno);.}..
1a5a0 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74  ./*.** Write dat
1a5b0 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20  a from a buffer 
1a5c0 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65  into a file.  Re
1a5d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
1a5e0 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20  n success.** or 
1a5f0 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72  some other error
1a600 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65   code on failure
1a610 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1a620 75 6e 69 78 57 72 69 74 65 28 0a 20 20 73 71 6c  unixWrite(.  sql
1a630 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a  ite3_file *id, .
1a640 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42    const void *pB
1a650 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a  uf, .  int amt,.
1a660 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1a670 6f 66 66 73 65 74 20 0a 29 7b 0a 20 20 75 6e 69  offset .){.  uni
1a680 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
1a690 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
1a6a0 69 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20  int wrote = 0;. 
1a6b0 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20   assert( id );. 
1a6c0 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29   assert( amt>0 )
1a6d0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
1a6e0 69 73 20 61 20 64 61 74 61 62 61 73 65 20 66 69  is a database fi
1a6f0 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61  le (not a journa
1a700 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  l, master-journa
1a710 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66  l or temp.  ** f
1a720 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73 20  ile), the bytes 
1a730 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72  in the locking r
1a740 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  ange should neve
1a750 72 20 62 65 20 72 65 61 64 20 6f 72 20 77 72 69  r be read or wri
1a760 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20  tten. */.#if 0. 
1a770 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
1a780 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20 20  pUnused==0.     
1a790 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e    || offset>=PEN
1a7a0 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20 20  DING_BYTE+512.  
1a7b0 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61       || offset+a
1a7c0 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  mt<=PENDING_BYTE
1a7d0 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 23   .  );.#endif..#
1a7e0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1a7f0 55 47 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72  UG.  /* If we ar
1a800 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c  e doing a normal
1a810 20 77 72 69 74 65 20 74 6f 20 61 20 64 61 74 61   write to a data
1a820 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f 70  base file (as op
1a830 70 6f 73 65 64 20 74 6f 0a 20 20 2a 2a 20 64 6f  posed to.  ** do
1a840 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ing a hot-journa
1a850 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20  l rollback or a 
1a860 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66 69  write to some fi
1a870 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61 0a  le other than a.
1a880 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61    ** normal data
1a890 62 61 73 65 20 66 69 6c 65 29 20 74 68 65 6e 20  base file) then 
1a8a0 72 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  record the fact 
1a8b0 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
1a8c0 65 0a 20 20 2a 2a 20 68 61 73 20 63 68 61 6e 67  e.  ** has chang
1a8d0 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e  ed.  If the tran
1a8e0 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
1a8f0 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 72 65 63  is modified, rec
1a900 6f 72 64 20 74 68 61 74 0a 20 20 2a 2a 20 66 61  ord that.  ** fa
1a910 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69  ct too..  */.  i
1a920 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d  f( pFile->inNorm
1a930 61 6c 57 72 69 74 65 20 29 7b 0a 20 20 20 20 70  alWrite ){.    p
1a940 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20 3d  File->dbUpdate =
1a950 20 31 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61   1;  /* The data
1a960 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  base has been mo
1a970 64 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 69 66  dified */.    if
1a980 28 20 6f 66 66 73 65 74 3c 3d 32 34 20 26 26 20  ( offset<=24 && 
1a990 6f 66 66 73 65 74 2b 61 6d 74 3e 3d 32 37 20 29  offset+amt>=27 )
1a9a0 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a  {.      int rc;.
1a9b0 20 20 20 20 20 20 63 68 61 72 20 6f 6c 64 43 6e        char oldCn
1a9c0 74 72 5b 34 5d 3b 0a 20 20 20 20 20 20 53 69 6d  tr[4];.      Sim
1a9d0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
1a9e0 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 72 63 20  gn(1);.      rc 
1a9f0 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28 70 46  = seekAndRead(pF
1aa00 69 6c 65 2c 20 32 34 2c 20 6f 6c 64 43 6e 74 72  ile, 24, oldCntr
1aa10 2c 20 34 29 3b 0a 20 20 20 20 20 20 53 69 6d 75  , 4);.      Simu
1aa20 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
1aa30 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  n(0);.      if( 
1aa40 72 63 21 3d 34 20 7c 7c 20 6d 65 6d 63 6d 70 28  rc!=4 || memcmp(
1aa50 6f 6c 64 43 6e 74 72 2c 20 26 28 28 63 68 61 72  oldCntr, &((char
1aa60 2a 29 70 42 75 66 29 5b 32 34 2d 6f 66 66 73 65  *)pBuf)[24-offse
1aa70 74 5d 2c 20 34 29 21 3d 30 20 29 7b 0a 20 20 20  t], 4)!=0 ){.   
1aa80 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e       pFile->tran
1aa90 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b 20 20  sCntrChng = 1;  
1aaa0 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69  /* The transacti
1aab0 6f 6e 20 63 6f 75 6e 74 65 72 20 68 61 73 20 63  on counter has c
1aac0 68 61 6e 67 65 64 20 2a 2f 0a 20 20 20 20 20 20  hanged */.      
1aad0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
1aae0 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  if..#if defined(
1aaf0 53 51 4c 49 54 45 5f 4d 4d 41 50 5f 52 45 41 44  SQLITE_MMAP_READ
1ab00 57 52 49 54 45 29 20 26 26 20 53 51 4c 49 54 45  WRITE) && SQLITE
1ab10 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
1ab20 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20  .  /* Deal with 
1ab30 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20  as much of this 
1ab40 77 72 69 74 65 20 72 65 71 75 65 73 74 20 61 73  write request as
1ab50 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61   possible by tra
1ab60 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61  nsfering.  ** da
1ab70 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f  ta from the memo
1ab80 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67  ry mapping using
1ab90 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20   memcpy().  */. 
1aba0 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c   if( offset<pFil
1abb0 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  e->mmapSize ){. 
1abc0 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d     if( offset+am
1abd0 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  t <= pFile->mmap
1abe0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65  Size ){.      me
1abf0 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28 70 46  mcpy(&((u8 *)(pF
1ac00 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
1ac10 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c  )[offset], pBuf,
1ac20 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74   amt);.      ret
1ac30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1ac40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ac50 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70 46 69 6c  int nCopy = pFil
1ac60 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66  e->mmapSize - of
1ac70 66 73 65 74 3b 0a 20 20 20 20 20 20 6d 65 6d 63  fset;.      memc
1ac80 70 79 28 26 28 28 75 38 20 2a 29 28 70 46 69 6c  py(&((u8 *)(pFil
1ac90 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b  e->pMapRegion))[
1aca0 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 6e  offset], pBuf, n
1acb0 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42 75  Copy);.      pBu
1acc0 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75 66  f = &((u8 *)pBuf
1acd0 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20  )[nCopy];.      
1ace0 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20  amt -= nCopy;.  
1acf0 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43      offset += nC
1ad00 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  opy;.    }.  }.#
1ad10 65 6e 64 69 66 0a 20 0a 20 20 77 68 69 6c 65 28  endif. .  while(
1ad20 20 28 77 72 6f 74 65 20 3d 20 73 65 65 6b 41 6e   (wrote = seekAn
1ad30 64 57 72 69 74 65 28 70 46 69 6c 65 2c 20 6f 66  dWrite(pFile, of
1ad40 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29  fset, pBuf, amt)
1ad50 29 3c 61 6d 74 20 26 26 20 77 72 6f 74 65 3e 30  )<amt && wrote>0
1ad60 20 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77   ){.    amt -= w
1ad70 72 6f 74 65 3b 0a 20 20 20 20 6f 66 66 73 65 74  rote;.    offset
1ad80 20 2b 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 70   += wrote;.    p
1ad90 42 75 66 20 3d 20 26 28 28 63 68 61 72 2a 29 70  Buf = &((char*)p
1ada0 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d  Buf)[wrote];.  }
1adb0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
1adc0 6f 72 28 28 20 77 72 6f 74 65 3d 28 2d 31 29 2c  or(( wrote=(-1),
1add0 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20 53 69 6d   amt=1 ));.  Sim
1ade0 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72  ulateDiskfullErr
1adf0 6f 72 28 28 20 77 72 6f 74 65 3d 30 2c 20 61 6d  or(( wrote=0, am
1ae00 74 3d 31 20 29 29 3b 0a 0a 20 20 69 66 28 20 61  t=1 ));..  if( a
1ae10 6d 74 3e 77 72 6f 74 65 20 29 7b 0a 20 20 20 20  mt>wrote ){.    
1ae20 69 66 28 20 77 72 6f 74 65 3c 30 20 26 26 20 70  if( wrote<0 && p
1ae30 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 21  File->lastErrno!
1ae40 3d 45 4e 4f 53 50 43 20 29 7b 0a 20 20 20 20 20  =ENOSPC ){.     
1ae50 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65   /* lastErrno se
1ae60 74 20 62 79 20 73 65 65 6b 41 6e 64 57 72 69 74  t by seekAndWrit
1ae70 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  e */.      retur
1ae80 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  n SQLITE_IOERR_W
1ae90 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  RITE;.    }else{
1aea0 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
1aeb0 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 30 29 3b  Errno(pFile, 0);
1aec0 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74 65 6d   /* not a system
1aed0 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20   error */.      
1aee0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
1aef0 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  LL;.    }.  }.. 
1af00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1af10 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  K;.}..#ifdef SQL
1af20 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43  ITE_TEST./*.** C
1af30 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
1af40 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64  of fullsyncs and
1af50 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20   normal syncs.  
1af60 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
1af70 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e  test.** that syn
1af80 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73  cs and fullsyncs
1af90 20 61 72 65 20 6f 63 63 75 72 72 69 6e 67 20 61   are occurring a
1afa0 74 20 74 68 65 20 72 69 67 68 74 20 74 69 6d 65  t the right time
1afb0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
1afc0 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30  3_sync_count = 0
1afd0 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75  ;.int sqlite3_fu
1afe0 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30  llsync_count = 0
1aff0 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
1b000 57 65 20 64 6f 20 6e 6f 74 20 74 72 75 73 74 20  We do not trust 
1b010 73 79 73 74 65 6d 73 20 74 6f 20 70 72 6f 76 69  systems to provi
1b020 64 65 20 61 20 77 6f 72 6b 69 6e 67 20 66 64 61  de a working fda
1b030 74 61 73 79 6e 63 28 29 2e 20 20 53 6f 6d 65 20  tasync().  Some 
1b040 64 6f 2e 0a 2a 2a 20 4f 74 68 65 72 73 20 64 6f  do..** Others do
1b050 20 6e 6f 2e 20 20 54 6f 20 62 65 20 73 61 66 65   no.  To be safe
1b060 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 63 6b 20  , we will stick 
1b070 77 69 74 68 20 74 68 65 20 28 73 6c 69 67 68 74  with the (slight
1b080 6c 79 20 73 6c 6f 77 65 72 29 0a 2a 2a 20 66 73  ly slower).** fs
1b090 79 6e 63 28 29 2e 20 49 66 20 79 6f 75 20 6b 6e  ync(). If you kn
1b0a0 6f 77 20 74 68 61 74 20 79 6f 75 72 20 73 79 73  ow that your sys
1b0b0 74 65 6d 20 64 6f 65 73 20 73 75 70 70 6f 72 74  tem does support
1b0c0 20 66 64 61 74 61 73 79 6e 63 28 29 20 63 6f 72   fdatasync() cor
1b0d0 72 65 63 74 6c 79 2c 0a 2a 2a 20 74 68 65 6e 20  rectly,.** then 
1b0e0 73 69 6d 70 6c 79 20 63 6f 6d 70 69 6c 65 20 77  simply compile w
1b0f0 69 74 68 20 2d 44 66 64 61 74 61 73 79 6e 63 3d  ith -Dfdatasync=
1b100 66 64 61 74 61 73 79 6e 63 20 6f 72 20 2d 44 48  fdatasync or -DH
1b110 41 56 45 5f 46 44 41 54 41 53 59 4e 43 0a 2a 2f  AVE_FDATASYNC.*/
1b120 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 66 64  .#if !defined(fd
1b130 61 74 61 73 79 6e 63 29 20 26 26 20 21 48 41 56  atasync) && !HAV
1b140 45 5f 46 44 41 54 41 53 59 4e 43 0a 23 20 64 65  E_FDATASYNC.# de
1b150 66 69 6e 65 20 66 64 61 74 61 73 79 6e 63 20 66  fine fdatasync f
1b160 73 79 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  sync.#endif../*.
1b170 2a 2a 20 44 65 66 69 6e 65 20 48 41 56 45 5f 46  ** Define HAVE_F
1b180 55 4c 4c 46 53 59 4e 43 20 74 6f 20 30 20 6f 72  ULLFSYNC to 0 or
1b190 20 31 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20   1 depending on 
1b1a0 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a  whether or not.*
1b1b0 2a 20 74 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e  * the F_FULLFSYN
1b1c0 43 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e  C macro is defin
1b1d0 65 64 2e 20 20 46 5f 46 55 4c 4c 46 53 59 4e 43  ed.  F_FULLFSYNC
1b1e0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a   is currently.**
1b1f0 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
1b200 6f 6e 20 4d 61 63 20 4f 53 20 58 2e 20 20 42 75  on Mac OS X.  Bu
1b210 74 20 74 68 61 74 20 63 6f 75 6c 64 20 63 68 61  t that could cha
1b220 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 46  nge..*/.#ifdef F
1b230 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 20 64 65 66  _FULLFSYNC.# def
1b240 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  ine HAVE_FULLFSY
1b250 4e 43 20 31 0a 23 65 6c 73 65 0a 23 20 64 65 66  NC 1.#else.# def
1b260 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  ine HAVE_FULLFSY
1b270 4e 43 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  NC 0.#endif.../*
1b280 0a 2a 2a 20 54 68 65 20 66 73 79 6e 63 28 29 20  .** The fsync() 
1b290 73 79 73 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73  system call does
1b2a0 20 6e 6f 74 20 77 6f 72 6b 20 61 73 20 61 64 76   not work as adv
1b2b0 65 72 74 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a  ertised on many.
1b2c0 2a 2a 20 75 6e 69 78 20 73 79 73 74 65 6d 73 2e  ** unix systems.
1b2d0 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
1b2e0 70 72 6f 63 65 64 75 72 65 20 69 73 20 61 6e 20  procedure is an 
1b2f0 61 74 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a  attempt to make.
1b300 2a 2a 20 69 74 20 77 6f 72 6b 20 62 65 74 74 65  ** it work bette
1b310 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c  r..**.** The SQL
1b320 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72  ITE_NO_SYNC macr
1b330 6f 20 64 69 73 61 62 6c 65 73 20 61 6c 6c 20 66  o disables all f
1b340 73 79 6e 63 28 29 73 2e 20 20 54 68 69 73 20 69  sync()s.  This i
1b350 73 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20  s useful.** for 
1b360 74 65 73 74 69 6e 67 20 77 68 65 6e 20 77 65 20  testing when we 
1b370 77 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 72 6f  want to run thro
1b380 75 67 68 20 74 68 65 20 74 65 73 74 20 73 75 69  ugh the test sui
1b390 74 65 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59  te quickly..** Y
1b3a0 6f 75 20 61 72 65 20 73 74 72 6f 6e 67 6c 79 20  ou are strongly 
1b3b0 61 64 76 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f  advised *not* to
1b3c0 20 64 65 70 6c 6f 79 20 77 69 74 68 20 53 51 4c   deploy with SQL
1b3d0 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65  ITE_NO_SYNC.** e
1b3e0 6e 61 62 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c  nabled, however,
1b3f0 20 73 69 6e 63 65 20 77 69 74 68 20 53 51 4c 49   since with SQLI
1b400 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c  TE_NO_SYNC enabl
1b410 65 64 2c 20 61 6e 20 4f 53 20 63 72 61 73 68 0a  ed, an OS crash.
1b420 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c  ** or power fail
1b430 75 72 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  ure will likely 
1b440 63 6f 72 72 75 70 74 20 74 68 65 20 64 61 74 61  corrupt the data
1b450 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
1b460 20 53 51 4c 69 74 65 20 73 65 74 73 20 74 68 65   SQLite sets the
1b470 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 20 69   dataOnly flag i
1b480 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  f the size of th
1b490 65 20 66 69 6c 65 20 69 73 20 75 6e 63 68 61 6e  e file is unchan
1b4a0 67 65 64 2e 0a 2a 2a 20 54 68 65 20 69 64 65 61  ged..** The idea
1b4b0 20 62 65 68 69 6e 64 20 64 61 74 61 4f 6e 6c 79   behind dataOnly
1b4c0 20 69 73 20 74 68 61 74 20 69 74 20 73 68 6f 75   is that it shou
1b4d0 6c 64 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 68  ld only write th
1b4e0 65 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 0a 2a  e file content.*
1b4f0 2a 20 74 6f 20 64 69 73 6b 2c 20 6e 6f 74 20 74  * to disk, not t
1b500 68 65 20 69 6e 6f 64 65 2e 20 20 57 65 20 6f 6e  he inode.  We on
1b510 6c 79 20 73 65 74 20 64 61 74 61 4f 6e 6c 79 20  ly set dataOnly 
1b520 69 66 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  if the file size
1b530 20 69 73 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65   is .** unchange
1b540 64 20 73 69 6e 63 65 20 74 68 65 20 66 69 6c 65  d since the file
1b550 20 73 69 7a 65 20 69 73 20 70 61 72 74 20 6f 66   size is part of
1b560 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 48 6f 77   the inode.  How
1b570 65 76 65 72 2c 20 0a 2a 2a 20 54 65 64 20 54 73  ever, .** Ted Ts
1b580 27 6f 20 74 65 6c 6c 73 20 75 73 20 74 68 61 74  'o tells us that
1b590 20 66 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c   fdatasync() wil
1b5a0 6c 20 61 6c 73 6f 20 77 72 69 74 65 20 74 68 65  l also write the
1b5b0 20 69 6e 6f 64 65 20 69 66 20 74 68 65 0a 2a 2a   inode if the.**
1b5c0 20 66 69 6c 65 20 73 69 7a 65 20 68 61 73 20 63   file size has c
1b5d0 68 61 6e 67 65 64 2e 20 20 54 68 65 20 6f 6e 6c  hanged.  The onl
1b5e0 79 20 72 65 61 6c 20 64 69 66 66 65 72 65 6e 63  y real differenc
1b5f0 65 20 62 65 74 77 65 65 6e 20 66 64 61 74 61 73  e between fdatas
1b600 79 6e 63 28 29 0a 2a 2a 20 61 6e 64 20 66 73 79  ync().** and fsy
1b610 6e 63 28 29 2c 20 54 65 64 20 74 65 6c 6c 73 20  nc(), Ted tells 
1b620 75 73 2c 20 69 73 20 74 68 61 74 20 66 64 61 74  us, is that fdat
1b630 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 6e 6f 74  async() will not
1b640 20 66 6c 75 73 68 20 74 68 65 0a 2a 2a 20 69 6e   flush the.** in
1b650 6f 64 65 20 69 66 20 74 68 65 20 6d 74 69 6d 65  ode if the mtime
1b660 20 6f 72 20 6f 77 6e 65 72 20 6f 72 20 6f 74 68   or owner or oth
1b670 65 72 20 69 6e 6f 64 65 20 61 74 74 72 69 62 75  er inode attribu
1b680 74 65 73 20 68 61 76 65 20 63 68 61 6e 67 65 64  tes have changed
1b690 2e 0a 2a 2a 20 57 65 20 6f 6e 6c 79 20 63 61 72  ..** We only car
1b6a0 65 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65  e about the file
1b6b0 20 73 69 7a 65 2c 20 6e 6f 74 20 74 68 65 20 6f   size, not the o
1b6c0 74 68 65 72 20 66 69 6c 65 20 61 74 74 72 69 62  ther file attrib
1b6d0 75 74 65 73 2c 20 73 6f 0a 2a 2a 20 61 73 20 66  utes, so.** as f
1b6e0 61 72 20 61 73 20 53 51 4c 69 74 65 20 69 73 20  ar as SQLite is 
1b6f0 63 6f 6e 63 65 72 6e 65 64 2c 20 61 6e 20 66 64  concerned, an fd
1b700 61 74 61 73 79 6e 63 28 29 20 69 73 20 61 6c 77  atasync() is alw
1b710 61 79 73 20 61 64 65 71 75 61 74 65 2e 0a 2a 2a  ays adequate..**
1b720 20 53 6f 2c 20 77 65 20 61 6c 77 61 79 73 20 75   So, we always u
1b730 73 65 20 66 64 61 74 61 73 79 6e 63 28 29 20 69  se fdatasync() i
1b740 66 20 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c  f it is availabl
1b750 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  e, regardless of
1b760 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
1b770 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c   the dataOnly fl
1b780 61 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ag..*/.static in
1b790 74 20 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e 74  t full_fsync(int
1b7a0 20 66 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e   fd, int fullSyn
1b7b0 63 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29  c, int dataOnly)
1b7c0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  {.  int rc;..  /
1b7d0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1b7e0 22 69 66 64 65 66 2f 65 6c 69 66 2f 65 6c 73 65  "ifdef/elif/else
1b7f0 2f 22 20 62 6c 6f 63 6b 20 68 61 73 20 74 68 65  /" block has the
1b800 20 73 61 6d 65 20 73 74 72 75 63 74 75 72 65 20   same structure 
1b810 61 73 0a 20 20 2a 2a 20 74 68 65 20 6f 6e 65 20  as.  ** the one 
1b820 62 65 6c 6f 77 2e 20 49 74 20 69 73 20 72 65 70  below. It is rep
1b830 6c 69 63 61 74 65 64 20 68 65 72 65 20 73 6f 6c  licated here sol
1b840 65 6c 79 20 74 6f 20 61 76 6f 69 64 20 63 6c 75  ely to avoid clu
1b850 74 74 65 72 69 6e 67 20 0a 20 20 2a 2a 20 75 70  ttering .  ** up
1b860 20 74 68 65 20 72 65 61 6c 20 63 6f 64 65 20 77   the real code w
1b870 69 74 68 20 74 68 65 20 55 4e 55 53 45 44 5f 50  ith the UNUSED_P
1b880 41 52 41 4d 45 54 45 52 28 29 20 6d 61 63 72 6f  ARAMETER() macro
1b890 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  s..  */.#ifdef S
1b8a0 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20  QLITE_NO_SYNC.  
1b8b0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1b8c0 28 66 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  (fd);.  UNUSED_P
1b8d0 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e  ARAMETER(fullSyn
1b8e0 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  c);.  UNUSED_PAR
1b8f0 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29  AMETER(dataOnly)
1b900 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c  ;.#elif HAVE_FUL
1b910 4c 46 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f  LFSYNC.  UNUSED_
1b920 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e  PARAMETER(dataOn
1b930 6c 79 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55  ly);.#else.  UNU
1b940 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75  SED_PARAMETER(fu
1b950 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45  llSync);.  UNUSE
1b960 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61  D_PARAMETER(data
1b970 4f 6e 6c 79 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  Only);.#endif.. 
1b980 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 6e   /* Record the n
1b990 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74  umber of times t
1b9a0 68 61 74 20 77 65 20 64 6f 20 61 20 6e 6f 72 6d  hat we do a norm
1b9b0 61 6c 20 66 73 79 6e 63 28 29 20 61 6e 64 20 0a  al fsync() and .
1b9c0 20 20 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e 20 20    ** FULLSYNC.  
1b9d0 54 68 69 73 20 69 73 20 75 73 65 64 20 64 75 72  This is used dur
1b9e0 69 6e 67 20 74 65 73 74 69 6e 67 20 74 6f 20 76  ing testing to v
1b9f0 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73 20  erify that this 
1ba00 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 67  procedure.  ** g
1ba10 65 74 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20  ets called with 
1ba20 74 68 65 20 63 6f 72 72 65 63 74 20 61 72 67 75  the correct argu
1ba30 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69 66 64  ments..  */.#ifd
1ba40 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
1ba50 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 20   if( fullSync ) 
1ba60 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
1ba70 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69  _count++;.  sqli
1ba80 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b  te3_sync_count++
1ba90 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  ;.#endif..  /* I
1baa0 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69  f we compiled wi
1bab0 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f  th the SQLITE_NO
1bac0 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e  _SYNC flag, then
1bad0 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20   syncing is a.  
1bae0 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69  ** no-op.  */.#i
1baf0 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  fdef SQLITE_NO_S
1bb00 59 4e 43 0a 20 20 72 63 20 3d 20 53 51 4c 49 54  YNC.  rc = SQLIT
1bb10 45 5f 4f 4b 3b 0a 23 65 6c 69 66 20 48 41 56 45  E_OK;.#elif HAVE
1bb20 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66 28  _FULLFSYNC.  if(
1bb30 20 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20   fullSync ){.   
1bb40 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64   rc = osFcntl(fd
1bb50 2c 20 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30  , F_FULLFSYNC, 0
1bb60 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1bb70 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a  rc = 1;.  }.  /*
1bb80 20 49 66 20 74 68 65 20 46 55 4c 4c 46 53 59 4e   If the FULLFSYN
1bb90 43 20 66 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62  C failed, fall b
1bba0 61 63 6b 20 74 6f 20 61 74 74 65 6d 70 74 69 6e  ack to attemptin
1bbb0 67 20 61 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20  g an fsync()..  
1bbc0 2a 2a 20 49 74 20 73 68 6f 75 6c 64 6e 27 74 20  ** It shouldn't 
1bbd0 62 65 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  be possible for 
1bbe0 66 75 6c 6c 66 73 79 6e 63 20 74 6f 20 66 61 69  fullfsync to fai
1bbf0 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a  l on the local .
1bc00 20 20 2a 2a 20 66 69 6c 65 20 73 79 73 74 65 6d    ** file system
1bc10 20 28 6f 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61   (on OSX), so fa
1bc20 69 6c 75 72 65 20 69 6e 64 69 63 61 74 65 73 20  ilure indicates 
1bc30 74 68 61 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20  that FULLFSYNC. 
1bc40 20 2a 2a 20 69 73 6e 27 74 20 73 75 70 70 6f 72   ** isn't suppor
1bc50 74 65 64 20 66 6f 72 20 74 68 69 73 20 66 69 6c  ted for this fil
1bc60 65 20 73 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74  e system. So, at
1bc70 74 65 6d 70 74 20 61 6e 20 66 73 79 6e 63 20 0a  tempt an fsync .
1bc80 20 20 2a 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f    ** and (for no
1bc90 77 29 20 69 67 6e 6f 72 65 20 74 68 65 20 6f 76  w) ignore the ov
1bca0 65 72 68 65 61 64 20 6f 66 20 61 20 73 75 70 65  erhead of a supe
1bcb0 72 66 6c 75 6f 75 73 20 66 63 6e 74 6c 20 63 61  rfluous fcntl ca
1bcc0 6c 6c 2e 20 20 0a 20 20 2a 2a 20 49 74 27 64 20  ll.  .  ** It'd 
1bcd0 62 65 20 62 65 74 74 65 72 20 74 6f 20 64 65 74  be better to det
1bce0 65 63 74 20 66 75 6c 6c 66 73 79 6e 63 20 73 75  ect fullfsync su
1bcf0 70 70 6f 72 74 20 6f 6e 63 65 20 61 6e 64 20 61  pport once and a
1bd00 76 6f 69 64 20 0a 20 20 2a 2a 20 74 68 65 20 66  void .  ** the f
1bd10 63 6e 74 6c 20 63 61 6c 6c 20 65 76 65 72 79 20  cntl call every 
1bd20 74 69 6d 65 20 73 79 6e 63 20 69 73 20 63 61 6c  time sync is cal
1bd30 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  led..  */.  if( 
1bd40 72 63 20 29 20 72 63 20 3d 20 66 73 79 6e 63 28  rc ) rc = fsync(
1bd50 66 64 29 3b 0a 0a 23 65 6c 69 66 20 64 65 66 69  fd);..#elif defi
1bd60 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
1bd70 20 2f 2a 20 66 64 61 74 61 73 79 6e 63 28 29 20   /* fdatasync() 
1bd80 6f 6e 20 48 46 53 2b 20 64 6f 65 73 6e 27 74 20  on HFS+ doesn't 
1bd90 79 65 74 20 66 6c 75 73 68 20 74 68 65 20 66 69  yet flush the fi
1bda0 6c 65 20 73 69 7a 65 20 69 66 20 69 74 20 63 68  le size if it ch
1bdb0 61 6e 67 65 64 20 63 6f 72 72 65 63 74 6c 79 0a  anged correctly.
1bdc0 20 20 2a 2a 20 73 6f 20 63 75 72 72 65 6e 74 6c    ** so currentl
1bdd0 79 20 77 65 20 64 65 66 61 75 6c 74 20 74 6f 20  y we default to 
1bde0 74 68 65 20 6d 61 63 72 6f 20 74 68 61 74 20 72  the macro that r
1bdf0 65 64 65 66 69 6e 65 73 20 66 64 61 74 61 73 79  edefines fdatasy
1be00 6e 63 20 74 6f 20 66 73 79 6e 63 0a 20 20 2a 2f  nc to fsync.  */
1be10 0a 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64  .  rc = fsync(fd
1be20 29 3b 0a 23 65 6c 73 65 20 0a 20 20 72 63 20 3d  );.#else .  rc =
1be30 20 66 64 61 74 61 73 79 6e 63 28 66 64 29 3b 0a   fdatasync(fd);.
1be40 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
1be50 20 69 66 28 20 72 63 3d 3d 2d 31 20 26 26 20 65   if( rc==-1 && e
1be60 72 72 6e 6f 3d 3d 45 4e 4f 54 53 55 50 20 29 7b  rrno==ENOTSUP ){
1be70 0a 20 20 20 20 72 63 20 3d 20 66 73 79 6e 63 28  .    rc = fsync(
1be80 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  fd);.  }.#endif 
1be90 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f  /* OS_VXWORKS */
1bea0 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66  .#endif /* ifdef
1beb0 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
1bec0 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53  elif HAVE_FULLFS
1bed0 59 4e 43 20 2a 2f 0a 0a 20 20 69 66 28 20 4f 53  YNC */..  if( OS
1bee0 5f 56 58 57 4f 52 4b 53 20 26 26 20 72 63 21 3d  _VXWORKS && rc!=
1bef0 20 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20   -1 ){.    rc = 
1bf00 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1bf10 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  rc;.}../*.** Ope
1bf20 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  n a file descrip
1bf30 74 6f 72 20 74 6f 20 74 68 65 20 64 69 72 65 63  tor to the direc
1bf40 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20  tory containing 
1bf50 66 69 6c 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a  file zFilename..
1bf60 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
1bf70 2c 20 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f  , *pFd is set to
1bf80 20 74 68 65 20 6f 70 65 6e 65 64 20 66 69 6c 65   the opened file
1bf90 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 0a   descriptor and.
1bfa0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
1bfb0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
1bfc0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 65 69  error occurs, ei
1bfd0 74 68 65 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ther SQLITE_NOME
1bfe0 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43  M.** or SQLITE_C
1bff0 41 4e 54 4f 50 45 4e 20 69 73 20 72 65 74 75 72  ANTOPEN is retur
1c000 6e 65 64 20 61 6e 64 20 2a 70 46 64 20 69 73 20  ned and *pFd is 
1c010 73 65 74 20 74 6f 20 61 6e 20 75 6e 64 65 66 69  set to an undefi
1c020 6e 65 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a  ned.** value..**
1c030 0a 2a 2a 20 54 68 65 20 64 69 72 65 63 74 6f 72  .** The director
1c040 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
1c050 72 20 69 73 20 75 73 65 64 20 66 6f 72 20 6f 6e  r is used for on
1c060 6c 79 20 6f 6e 65 20 74 68 69 6e 67 20 2d 20 74  ly one thing - t
1c070 6f 0a 2a 2a 20 66 73 79 6e 63 28 29 20 61 20 64  o.** fsync() a d
1c080 69 72 65 63 74 6f 72 79 20 74 6f 20 6d 61 6b 65  irectory to make
1c090 20 73 75 72 65 20 66 69 6c 65 20 63 72 65 61 74   sure file creat
1c0a0 69 6f 6e 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e  ion and deletion
1c0b0 20 65 76 65 6e 74 73 0a 2a 2a 20 61 72 65 20 66   events.** are f
1c0c0 6c 75 73 68 65 64 20 74 6f 20 64 69 73 6b 2e 20  lushed to disk. 
1c0d0 20 53 75 63 68 20 66 73 79 6e 63 73 20 61 72 65   Such fsyncs are
1c0e0 20 6e 6f 74 20 6e 65 65 64 65 64 20 6f 6e 20 6e   not needed on n
1c0f0 65 77 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 69  ewer.** journali
1c100 6e 67 20 66 69 6c 65 73 79 73 74 65 6d 73 2c 20  ng filesystems, 
1c110 62 75 74 20 61 72 65 20 72 65 71 75 69 72 65 64  but are required
1c120 20 6f 6e 20 6f 6c 64 65 72 20 66 69 6c 65 73 79   on older filesy
1c130 73 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  stems..**.** Thi
1c140 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65  s routine can be
1c150 20 6f 76 65 72 72 69 64 64 65 6e 20 75 73 69 6e   overridden usin
1c160 67 20 74 68 65 20 78 53 65 74 53 79 73 43 61 6c  g the xSetSysCal
1c170 6c 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 20  l interface..** 
1c180 54 68 65 20 61 62 69 6c 69 74 79 20 74 6f 20 6f  The ability to o
1c190 76 65 72 72 69 64 65 20 74 68 69 73 20 72 6f 75  verride this rou
1c1a0 74 69 6e 65 20 77 61 73 20 61 64 64 65 64 20 69  tine was added i
1c1b0 6e 20 73 75 70 70 6f 72 74 20 6f 66 20 74 68 65  n support of the
1c1c0 0a 2a 2a 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e  .** chromium san
1c1d0 64 62 6f 78 2e 20 20 4f 70 65 6e 69 6e 67 20 61  dbox.  Opening a
1c1e0 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 61 20   directory is a 
1c1f0 73 65 63 75 72 69 74 79 20 72 69 73 6b 20 28 77  security risk (w
1c200 65 20 61 72 65 0a 2a 2a 20 74 6f 6c 64 29 20 73  e are.** told) s
1c210 6f 20 6d 61 6b 69 6e 67 20 69 74 20 6f 76 65 72  o making it over
1c220 72 69 64 65 61 62 6c 65 20 61 6c 6c 6f 77 73 20  rideable allows 
1c230 74 68 65 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e  the chromium san
1c240 64 62 6f 78 20 74 6f 0a 2a 2a 20 72 65 70 6c 61  dbox to.** repla
1c250 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ce this routine 
1c260 77 69 74 68 20 61 20 68 61 72 6d 6c 65 73 73 20  with a harmless 
1c270 6e 6f 2d 6f 70 2e 20 20 54 6f 20 6d 61 6b 65 20  no-op.  To make 
1c280 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
1c290 61 20 6e 6f 2d 6f 70 2c 20 72 65 70 6c 61 63 65  a no-op, replace
1c2a0 20 69 74 20 77 69 74 68 20 61 20 73 74 75 62 20   it with a stub 
1c2b0 74 68 61 74 20 72 65 74 75 72 6e 73 20 53 51 4c  that returns SQL
1c2c0 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65  ITE_OK but leave
1c2d0 73 0a 2a 2a 20 2a 70 46 64 20 73 65 74 20 74 6f  s.** *pFd set to
1c2e0 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62   a negative numb
1c2f0 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  er..**.** If SQL
1c300 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1c310 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 69  ed, the caller i
1c320 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
1c330 72 20 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65  r closing.** the
1c340 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1c350 20 2a 70 46 64 20 75 73 69 6e 67 20 63 6c 6f 73   *pFd using clos
1c360 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
1c370 6e 74 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79  nt openDirectory
1c380 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
1c390 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64  lename, int *pFd
1c3a0 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69  ){.  int ii;.  i
1c3b0 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68  nt fd = -1;.  ch
1c3c0 61 72 20 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f  ar zDirname[MAX_
1c3d0 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20  PATHNAME+1];..  
1c3e0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1c3f0 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a  (MAX_PATHNAME, z
1c400 44 69 72 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a  Dirname, "%s", z
1c410 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72  Filename);.  for
1c420 28 69 69 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28  (ii=(int)strlen(
1c430 7a 44 69 72 6e 61 6d 65 29 3b 20 69 69 3e 31 20  zDirname); ii>1 
1c440 26 26 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 21  && zDirname[ii]!
1c450 3d 27 2f 27 3b 20 69 69 2d 2d 29 3b 0a 20 20 69  ='/'; ii--);.  i
1c460 66 28 20 69 69 3e 30 20 29 7b 0a 20 20 20 20 7a  f( ii>0 ){.    z
1c470 44 69 72 6e 61 6d 65 5b 69 69 5d 20 3d 20 27 5c  Dirname[ii] = '\
1c480 30 27 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62  0';.    fd = rob
1c490 75 73 74 5f 6f 70 65 6e 28 7a 44 69 72 6e 61 6d  ust_open(zDirnam
1c4a0 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49  e, O_RDONLY|O_BI
1c4b0 4e 41 52 59 2c 20 30 29 3b 0a 20 20 20 20 69 66  NARY, 0);.    if
1c4c0 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ( fd>=0 ){.     
1c4d0 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 44   OSTRACE(("OPEND
1c4e0 49 52 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66  IR %-3d %s\n", f
1c4f0 64 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 20  d, zDirname));. 
1c500 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 46 64 20     }.  }.  *pFd 
1c510 3d 20 66 64 3b 0a 20 20 72 65 74 75 72 6e 20 28  = fd;.  return (
1c520 66 64 3e 3d 30 3f 53 51 4c 49 54 45 5f 4f 4b 3a  fd>=0?SQLITE_OK:
1c530 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
1c540 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
1c550 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 44 69 72 6e  T, "open", zDirn
1c560 61 6d 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ame));.}../*.** 
1c570 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72  Make sure all wr
1c580 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63  ites to a partic
1c590 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f  ular file are co
1c5a0 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e  mmitted to disk.
1c5b0 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e  .**.** If dataOn
1c5c0 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68 20  ly==0 then both 
1c5d0 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20  the file itself 
1c5e0 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74 61  and its metadata
1c5f0 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20   (file.** size, 
1c600 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74 63  access time, etc
1c610 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20 49  ) are synced.  I
1c620 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68  f dataOnly!=0 th
1c630 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66  en only the.** f
1c640 69 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e 63  ile data is sync
1c650 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20  ed..**.** Under 
1c660 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20  Unix, also make 
1c670 73 75 72 65 20 74 68 61 74 20 74 68 65 20 64 69  sure that the di
1c680 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f  rectory entry fo
1c690 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61  r the file.** ha
1c6a0 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 62  s been created b
1c6b0 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65 20  y fsync-ing the 
1c6c0 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63  directory that c
1c6d0 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c 65  ontains the file
1c6e0 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f  ..** If we do no
1c6f0 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77 65  t do this and we
1c700 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f 77   encounter a pow
1c710 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  er failure, the 
1c720 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74  directory.** ent
1c730 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  ry for the journ
1c740 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69  al might not exi
1c750 73 74 20 61 66 74 65 72 20 77 65 20 72 65 62 6f  st after we rebo
1c760 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a  ot.  The next.**
1c770 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65 73   SQLite to acces
1c780 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20  s the file will 
1c790 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74 68  not know that th
1c7a0 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  e journal exists
1c7b0 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65   (because.** the
1c7c0 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79   directory entry
1c7d0 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
1c7e0 20 77 61 73 20 6e 65 76 65 72 20 63 72 65 61 74   was never creat
1c7f0 65 64 29 20 61 6e 64 20 74 68 65 20 74 72 61 6e  ed) and the tran
1c800 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20  saction.** will 
1c810 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20  not roll back - 
1c820 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e 67  possibly leading
1c830 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   to database cor
1c840 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
1c850 69 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63 28  ic int unixSync(
1c860 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1c870 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
1c880 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46 69  int rc;.  unixFi
1c890 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
1c8a0 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69 6e  xFile*)id;..  in
1c8b0 74 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20 28  t isDataOnly = (
1c8c0 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 53 59 4e  flags&SQLITE_SYN
1c8d0 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20 69  C_DATAONLY);.  i
1c8e0 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d 20  nt isFullsync = 
1c8f0 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
1c900 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a  LITE_SYNC_FULL;.
1c910 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
1c920 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53   one of SQLITE_S
1c930 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55  YNC_NORMAL or FU
1c940 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f  LL was passed */
1c950 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61 67 73  .  assert((flags
1c960 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
1c970 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20  YNC_NORMAL.     
1c980 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29   || (flags&0x0F)
1c990 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
1c9a0 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e  LL.  );..  /* Un
1c9b0 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73  ix cannot, but s
1c9c0 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20  ome systems may 
1c9d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
1c9e0 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68  LL from here. Th
1c9f0 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20  is.  ** line is 
1ca00 74 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f 69  to test that doi
1ca10 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63  ng so does not c
1ca20 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d  ause any problem
1ca30 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  s..  */.  Simula
1ca40 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28  teDiskfullError(
1ca50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
1ca60 55 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  ULL );..  assert
1ca70 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
1ca80 52 41 43 45 28 28 22 53 59 4e 43 20 20 20 20 25  RACE(("SYNC    %
1ca90 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  -3d\n", pFile->h
1caa0 29 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f  ));.  rc = full_
1cab0 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20  fsync(pFile->h, 
1cac0 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61  isFullsync, isDa
1cad0 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c  taOnly);.  Simul
1cae0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31  ateIOError( rc=1
1caf0 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a   );.  if( rc ){.
1cb00 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
1cb10 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29  no(pFile, errno)
1cb20 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69  ;.    return uni
1cb30 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
1cb40 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20 22 66  _IOERR_FSYNC, "f
1cb50 75 6c 6c 5f 66 73 79 6e 63 22 2c 20 70 46 69 6c  ull_fsync", pFil
1cb60 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 0a  e->zPath);.  }..
1cb70 20 20 2f 2a 20 41 6c 73 6f 20 66 73 79 6e 63 20    /* Also fsync 
1cb80 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f  the directory co
1cb90 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 66 69 6c  ntaining the fil
1cba0 65 20 69 66 20 74 68 65 20 44 49 52 53 59 4e 43  e if the DIRSYNC
1cbb0 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20 73 65   flag.  ** is se
1cbc0 74 2e 20 20 54 68 69 73 20 69 73 20 61 20 6f 6e  t.  This is a on
1cbd0 65 2d 74 69 6d 65 20 6f 63 63 75 72 72 65 6e 63  e-time occurrenc
1cbe0 65 2e 20 20 4d 61 6e 79 20 73 79 73 74 65 6d 73  e.  Many systems
1cbf0 20 28 65 78 61 6d 70 6c 65 73 3a 20 41 49 58 29   (examples: AIX)
1cc00 0a 20 20 2a 2a 20 61 72 65 20 75 6e 61 62 6c 65  .  ** are unable
1cc10 20 74 6f 20 66 73 79 6e 63 20 61 20 64 69 72 65   to fsync a dire
1cc20 63 74 6f 72 79 2c 20 73 6f 20 69 67 6e 6f 72 65  ctory, so ignore
1cc30 20 65 72 72 6f 72 73 20 6f 6e 20 74 68 65 20 66   errors on the f
1cc40 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sync..  */.  if(
1cc50 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
1cc60 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 49 52  s & UNIXFILE_DIR
1cc70 53 59 4e 43 20 29 7b 0a 20 20 20 20 69 6e 74 20  SYNC ){.    int 
1cc80 64 69 72 66 64 3b 0a 20 20 20 20 4f 53 54 52 41  dirfd;.    OSTRA
1cc90 43 45 28 28 22 44 49 52 53 59 4e 43 20 25 73 20  CE(("DIRSYNC %s 
1cca0 28 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e 63 3d  (have_fullfsync=
1ccb0 25 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64 29 5c  %d fullsync=%d)\
1ccc0 6e 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  n", pFile->zPath
1ccd0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 48 41  ,.            HA
1cce0 56 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 69 73  VE_FULLFSYNC, is
1ccf0 46 75 6c 6c 73 79 6e 63 29 29 3b 0a 20 20 20 20  Fullsync));.    
1cd00 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63  rc = osOpenDirec
1cd10 74 6f 72 79 28 70 46 69 6c 65 2d 3e 7a 50 61 74  tory(pFile->zPat
1cd20 68 2c 20 26 64 69 72 66 64 29 3b 0a 20 20 20 20  h, &dirfd);.    
1cd30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1cd40 4b 20 26 26 20 64 69 72 66 64 3e 3d 30 20 29 7b  K && dirfd>=0 ){
1cd50 0a 20 20 20 20 20 20 66 75 6c 6c 5f 66 73 79 6e  .      full_fsyn
1cd60 63 28 64 69 72 66 64 2c 20 30 2c 20 30 29 3b 0a  c(dirfd, 0, 0);.
1cd70 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
1cd80 73 65 28 70 46 69 6c 65 2c 20 64 69 72 66 64 2c  se(pFile, dirfd,
1cd90 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
1cda0 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
1cdb0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b  LITE_CANTOPEN ){
1cdc0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1cdd0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1cde0 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
1cdf0 73 20 26 3d 20 7e 55 4e 49 58 46 49 4c 45 5f 44  s &= ~UNIXFILE_D
1ce00 49 52 53 59 4e 43 3b 0a 20 20 7d 0a 20 20 72 65  IRSYNC;.  }.  re
1ce10 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1ce20 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70  * Truncate an op
1ce30 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65  en file to a spe
1ce40 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73  cified size.*/.s
1ce50 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 54 72  tatic int unixTr
1ce60 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66  uncate(sqlite3_f
1ce70 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6e 42 79  ile *id, i64 nBy
1ce80 74 65 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  te){.  unixFile 
1ce90 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
1cea0 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72  le *)id;.  int r
1ceb0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  c;.  assert( pFi
1cec0 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  le );.  Simulate
1ced0 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
1cee0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
1cef0 4e 43 41 54 45 20 29 3b 0a 0a 20 20 2f 2a 20 49  NCATE );..  /* I
1cf00 66 20 74 68 65 20 75 73 65 72 20 68 61 73 20 63  f the user has c
1cf10 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68 75 6e  onfigured a chun
1cf20 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  k-size for this 
1cf30 66 69 6c 65 2c 20 74 72 75 6e 63 61 74 65 20 74  file, truncate t
1cf40 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20  he.  ** file so 
1cf50 74 68 61 74 20 69 74 20 63 6f 6e 73 69 73 74 73  that it consists
1cf60 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20 6e   of an integer n
1cf70 75 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b 73 20  umber of chunks 
1cf80 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61  (i.e. the.  ** a
1cf90 63 74 75 61 6c 20 66 69 6c 65 20 73 69 7a 65 20  ctual file size 
1cfa0 61 66 74 65 72 20 74 68 65 20 6f 70 65 72 61 74  after the operat
1cfb0 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72 67 65  ion may be large
1cfc0 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65  r than the reque
1cfd0 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e  sted.  ** size).
1cfe0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
1cff0 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a  e->szChunk>0 ){.
1d000 20 20 20 20 6e 42 79 74 65 20 3d 20 28 28 6e 42      nByte = ((nB
1d010 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43  yte + pFile->szC
1d020 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d  hunk - 1)/pFile-
1d030 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c  >szChunk) * pFil
1d040 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a  e->szChunk;.  }.
1d050 0a 20 20 72 63 20 3d 20 72 6f 62 75 73 74 5f 66  .  rc = robust_f
1d060 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e  truncate(pFile->
1d070 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  h, nByte);.  if(
1d080 20 72 63 20 29 7b 0a 20 20 20 20 73 74 6f 72 65   rc ){.    store
1d090 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
1d0a0 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74   errno);.    ret
1d0b0 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  urn unixLogError
1d0c0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52  (SQLITE_IOERR_TR
1d0d0 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61  UNCATE, "ftrunca
1d0e0 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  te", pFile->zPat
1d0f0 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66  h);.  }else{.#if
1d100 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1d110 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72  .    /* If we ar
1d120 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c  e doing a normal
1d130 20 77 72 69 74 65 20 74 6f 20 61 20 64 61 74 61   write to a data
1d140 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f 70  base file (as op
1d150 70 6f 73 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  posed to.    ** 
1d160 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72  doing a hot-jour
1d170 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20  nal rollback or 
1d180 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20  a write to some 
1d190 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20  file other than 
1d1a0 61 0a 20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20  a.    ** normal 
1d1b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 61  database file) a
1d1c0 6e 64 20 77 65 20 74 72 75 6e 63 61 74 65 20 74  nd we truncate t
1d1d0 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20  he file to zero 
1d1e0 6c 65 6e 67 74 68 2c 0a 20 20 20 20 2a 2a 20 74  length,.    ** t
1d1f0 68 61 74 20 65 66 66 65 63 74 69 76 65 6c 79 20  hat effectively 
1d200 75 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e  updates the chan
1d210 67 65 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 69  ge counter.  Thi
1d220 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e 0a 20  s might happen. 
1d230 20 20 20 2a 2a 20 77 68 65 6e 20 72 65 73 74 6f     ** when resto
1d240 72 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20  ring a database 
1d250 75 73 69 6e 67 20 74 68 65 20 62 61 63 6b 75 70  using the backup
1d260 20 41 50 49 20 66 72 6f 6d 20 61 20 7a 65 72 6f   API from a zero
1d270 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 73  -length.    ** s
1d280 6f 75 72 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ource..    */.  
1d290 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e    if( pFile->inN
1d2a0 6f 72 6d 61 6c 57 72 69 74 65 20 26 26 20 6e 42  ormalWrite && nB
1d2b0 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  yte==0 ){.      
1d2c0 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72  pFile->transCntr
1d2d0 43 68 6e 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Chng = 1;.    }.
1d2e0 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
1d2f0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
1d300 3e 30 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  >0.    /* If the
1d310 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20 74   file was just t
1d320 72 75 6e 63 61 74 65 64 20 74 6f 20 61 20 73 69  runcated to a si
1d330 7a 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  ze smaller than 
1d340 74 68 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20  the currently.  
1d350 20 20 2a 2a 20 6d 61 70 70 65 64 20 72 65 67 69    ** mapped regi
1d360 6f 6e 2c 20 72 65 64 75 63 65 20 74 68 65 20 65  on, reduce the e
1d370 66 66 65 63 74 69 76 65 20 6d 61 70 70 69 6e 67  ffective mapping
1d380 20 73 69 7a 65 20 61 73 20 77 65 6c 6c 2e 20 53   size as well. S
1d390 51 4c 69 74 65 20 77 69 6c 6c 0a 20 20 20 20 2a  QLite will.    *
1d3a0 2a 20 75 73 65 20 72 65 61 64 28 29 20 61 6e 64  * use read() and
1d3b0 20 77 72 69 74 65 28 29 20 74 6f 20 61 63 63 65   write() to acce
1d3c0 73 73 20 64 61 74 61 20 62 65 79 6f 6e 64 20 74  ss data beyond t
1d3d0 68 69 73 20 70 6f 69 6e 74 20 66 72 6f 6d 20 6e  his point from n
1d3e0 6f 77 20 6f 6e 2e 20 20 0a 20 20 20 20 2a 2f 0a  ow on.  .    */.
1d3f0 20 20 20 20 69 66 28 20 6e 42 79 74 65 3c 70 46      if( nByte<pF
1d400 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
1d410 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d  .      pFile->mm
1d420 61 70 53 69 7a 65 20 3d 20 6e 42 79 74 65 3b 0a  apSize = nByte;.
1d430 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
1d440 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d450 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
1d460 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63   Determine the c
1d470 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61  urrent size of a
1d480 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a   file in bytes.*
1d490 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1d4a0 78 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65  xFileSize(sqlite
1d4b0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20  3_file *id, i64 
1d4c0 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72  *pSize){.  int r
1d4d0 63 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  c;.  struct stat
1d4e0 20 62 75 66 3b 0a 20 20 61 73 73 65 72 74 28 20   buf;.  assert( 
1d4f0 69 64 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73 46  id );.  rc = osF
1d500 73 74 61 74 28 28 28 75 6e 69 78 46 69 6c 65 2a  stat(((unixFile*
1d510 29 69 64 29 2d 3e 68 2c 20 26 62 75 66 29 3b 0a  )id)->h, &buf);.
1d520 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1d530 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28  r( rc=1 );.  if(
1d540 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 74   rc!=0 ){.    st
1d550 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 28 75 6e  oreLastErrno((un
1d560 69 78 46 69 6c 65 2a 29 69 64 2c 20 65 72 72 6e  ixFile*)id, errn
1d570 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  o);.    return S
1d580 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
1d590 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20  T;.  }.  *pSize 
1d5a0 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a  = buf.st_size;..
1d5b0 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e    /* When openin
1d5c0 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20 64 61  g a zero-size da
1d5d0 74 61 62 61 73 65 2c 20 74 68 65 20 66 69 6e 64  tabase, the find
1d5e0 49 6e 6f 64 65 49 6e 66 6f 28 29 20 70 72 6f 63  InodeInfo() proc
1d5f0 65 64 75 72 65 0a 20 20 2a 2a 20 77 72 69 74 65  edure.  ** write
1d600 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  s a single byte 
1d610 69 6e 74 6f 20 74 68 61 74 20 66 69 6c 65 20 69  into that file i
1d620 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b 20  n order to work 
1d630 61 72 6f 75 6e 64 20 61 20 62 75 67 0a 20 20 2a  around a bug.  *
1d640 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58 20 6d 73  * in the OS-X ms
1d650 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2e 20  dos filesystem. 
1d660 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f   In order to avo
1d670 69 64 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68  id problems with
1d680 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61 79 65   upper.  ** laye
1d690 72 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72  rs, we need to r
1d6a0 65 70 6f 72 74 20 74 68 69 73 20 66 69 6c 65 20  eport this file 
1d6b0 73 69 7a 65 20 61 73 20 7a 65 72 6f 20 65 76 65  size as zero eve
1d6c0 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 0a 20  n though it is. 
1d6d0 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20 20 20   ** really 1.   
1d6e0 54 69 63 6b 65 74 20 23 33 32 36 30 2e 0a 20 20  Ticket #3260..  
1d6f0 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a 65 3d  */.  if( *pSize=
1d700 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d 20 30 3b  =1 ) *pSize = 0;
1d710 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ...  return SQLI
1d720 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51  TE_OK;.}..#if SQ
1d730 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1d740 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
1d750 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
1d760 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20 66 6f  /*.** Handler fo
1d770 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20  r proxy-locking 
1d780 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76 65 72  file-control ver
1d790 62 73 2e 20 20 44 65 66 69 6e 65 64 20 62 65 6c  bs.  Defined bel
1d7a0 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70 72 6f  ow in the.** pro
1d7b0 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 64 69  xying locking di
1d7c0 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  vision..*/.stati
1d7d0 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c 65 43  c int proxyFileC
1d7e0 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66  ontrol(sqlite3_f
1d7f0 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b  ile*,int,void*);
1d800 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20  .#endif../* .** 
1d810 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1d820 20 63 61 6c 6c 65 64 20 74 6f 20 68 61 6e 64 6c   called to handl
1d830 65 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e  e the SQLITE_FCN
1d840 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 0a 2a 2a  TL_SIZE_HINT .**
1d850 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6f 70   file-control op
1d860 65 72 61 74 69 6f 6e 2e 20 20 45 6e 6c 61 72 67  eration.  Enlarg
1d870 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
1d880 6f 20 6e 42 79 74 65 73 20 69 6e 20 73 69 7a 65  o nBytes in size
1d890 0a 2a 2a 20 28 72 6f 75 6e 64 65 64 20 75 70 20  .** (rounded up 
1d8a0 74 6f 20 74 68 65 20 6e 65 78 74 20 63 68 75 6e  to the next chun
1d8b0 6b 2d 73 69 7a 65 29 2e 20 20 49 66 20 74 68 65  k-size).  If the
1d8c0 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72   database is alr
1d8d0 65 61 64 79 0a 2a 2a 20 6e 42 79 74 65 73 20 6f  eady.** nBytes o
1d8e0 72 20 6c 61 72 67 65 72 2c 20 74 68 69 73 20 72  r larger, this r
1d8f0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
1d900 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
1d910 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 75   fcntlSizeHint(u
1d920 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
1d930 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 66  i64 nByte){.  if
1d940 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
1d950 3e 30 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 53  >0 ){.    i64 nS
1d960 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
1d970 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69          /* Requi
1d980 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f  red file size */
1d990 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
1d9a0 20 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20   buf;           
1d9b0 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 68 6f     /* Used to ho
1d9c0 6c 64 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73  ld return values
1d9d0 20 6f 66 20 66 73 74 61 74 28 29 20 2a 2f 0a 20   of fstat() */. 
1d9e0 20 20 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74    .    if( osFst
1d9f0 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75  at(pFile->h, &bu
1da00 66 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  f) ){.      retu
1da10 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1da20 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  FSTAT;.    }..  
1da30 20 20 6e 53 69 7a 65 20 3d 20 28 28 6e 42 79 74    nSize = ((nByt
1da40 65 2b 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  e+pFile->szChunk
1da50 2d 31 29 20 2f 20 70 46 69 6c 65 2d 3e 73 7a 43  -1) / pFile->szC
1da60 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73  hunk) * pFile->s
1da70 7a 43 68 75 6e 6b 3b 0a 20 20 20 20 69 66 28 20  zChunk;.    if( 
1da80 6e 53 69 7a 65 3e 28 69 36 34 29 62 75 66 2e 73  nSize>(i64)buf.s
1da90 74 5f 73 69 7a 65 20 29 7b 0a 0a 23 69 66 20 64  t_size ){..#if d
1daa0 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49  efined(HAVE_POSI
1dab0 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20  X_FALLOCATE) && 
1dac0 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f  HAVE_POSIX_FALLO
1dad0 43 41 54 45 0a 20 20 20 20 20 20 2f 2a 20 54 68  CATE.      /* Th
1dae0 65 20 63 6f 64 65 20 62 65 6c 6f 77 20 69 73 20  e code below is 
1daf0 68 61 6e 64 6c 69 6e 67 20 74 68 65 20 72 65 74  handling the ret
1db00 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 6f 73 46  urn value of osF
1db10 61 6c 6c 6f 63 61 74 65 28 29 20 0a 20 20 20 20  allocate() .    
1db20 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20    ** correctly. 
1db30 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28  posix_fallocate(
1db40 29 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20  ) is defined to 
1db50 22 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 6f 6e  "returns zero on
1db60 20 73 75 63 63 65 73 73 2c 20 0a 20 20 20 20 20   success, .     
1db70 20 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 20   ** or an error 
1db80 6e 75 6d 62 65 72 20 6f 6e 20 20 66 61 69 6c 75  number on  failu
1db90 72 65 22 2e 20 53 65 65 20 74 68 65 20 6d 61 6e  re". See the man
1dba0 70 61 67 65 20 66 6f 72 20 64 65 74 61 69 6c 73  page for details
1dbb0 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 65  . */.      int e
1dbc0 72 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20  rr;.      do{.  
1dbd0 20 20 20 20 20 20 65 72 72 20 3d 20 6f 73 46 61        err = osFa
1dbe0 6c 6c 6f 63 61 74 65 28 70 46 69 6c 65 2d 3e 68  llocate(pFile->h
1dbf0 2c 20 62 75 66 2e 73 74 5f 73 69 7a 65 2c 20 6e  , buf.st_size, n
1dc00 53 69 7a 65 2d 62 75 66 2e 73 74 5f 73 69 7a 65  Size-buf.st_size
1dc10 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  );.      }while(
1dc20 20 65 72 72 3d 3d 45 49 4e 54 52 20 29 3b 0a 20   err==EINTR );. 
1dc30 20 20 20 20 20 69 66 28 20 65 72 72 20 29 20 72       if( err ) r
1dc40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1dc50 52 52 5f 57 52 49 54 45 3b 0a 23 65 6c 73 65 0a  RR_WRITE;.#else.
1dc60 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
1dc70 4f 53 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  OS does not have
1dc80 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65   posix_fallocate
1dc90 28 29 2c 20 66 61 6b 65 20 69 74 2e 20 57 72 69  (), fake it. Wri
1dca0 74 65 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 73  te a .      ** s
1dcb0 69 6e 67 6c 65 20 62 79 74 65 20 74 6f 20 74 68  ingle byte to th
1dcc0 65 20 6c 61 73 74 20 62 79 74 65 20 69 6e 20 65  e last byte in e
1dcd0 61 63 68 20 62 6c 6f 63 6b 20 74 68 61 74 20 66  ach block that f
1dce0 61 6c 6c 73 20 65 6e 74 69 72 65 6c 79 0a 20 20  alls entirely.  
1dcf0 20 20 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68      ** within th
1dd00 65 20 65 78 74 65 6e 64 65 64 20 72 65 67 69 6f  e extended regio
1dd10 6e 2e 20 54 68 65 6e 2c 20 69 66 20 72 65 71 75  n. Then, if requ
1dd20 69 72 65 64 2c 20 61 20 73 69 6e 67 6c 65 20 62  ired, a single b
1dd30 79 74 65 0a 20 20 20 20 20 20 2a 2a 20 61 74 20  yte.      ** at 
1dd40 6f 66 66 73 65 74 20 28 6e 53 69 7a 65 2d 31 29  offset (nSize-1)
1dd50 2c 20 74 6f 20 73 65 74 20 74 68 65 20 73 69 7a  , to set the siz
1dd60 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f  e of the file co
1dd70 72 72 65 63 74 6c 79 2e 0a 20 20 20 20 20 20 2a  rrectly..      *
1dd80 2a 20 54 68 69 73 20 69 73 20 61 20 73 69 6d 69  * This is a simi
1dd90 6c 61 72 20 74 65 63 68 6e 69 71 75 65 20 74 6f  lar technique to
1dda0 20 74 68 61 74 20 75 73 65 64 20 62 79 20 67 6c   that used by gl
1ddb0 69 62 63 20 6f 6e 20 73 79 73 74 65 6d 73 0a 20  ibc on systems. 
1ddc0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 20       ** that do 
1ddd0 6e 6f 74 20 68 61 76 65 20 61 20 72 65 61 6c 20  not have a real 
1dde0 66 61 6c 6c 6f 63 61 74 65 28 29 20 63 61 6c 6c  fallocate() call
1ddf0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1de00 20 69 6e 74 20 6e 42 6c 6b 20 3d 20 62 75 66 2e   int nBlk = buf.
1de10 73 74 5f 62 6c 6b 73 69 7a 65 3b 20 20 2f 2a 20  st_blksize;  /* 
1de20 46 69 6c 65 2d 73 79 73 74 65 6d 20 62 6c 6f 63  File-system bloc
1de30 6b 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20  k size */.      
1de40 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 20  int nWrite = 0; 
1de50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1de60 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77  umber of bytes w
1de70 72 69 74 74 65 6e 20 62 79 20 73 65 65 6b 41 6e  ritten by seekAn
1de80 64 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20  dWrite */.      
1de90 69 36 34 20 69 57 72 69 74 65 3b 20 20 20 20 20  i64 iWrite;     
1dea0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1deb0 65 78 74 20 6f 66 66 73 65 74 20 74 6f 20 77 72  ext offset to wr
1dec0 69 74 65 20 74 6f 20 2a 2f 0a 0a 20 20 20 20 20  ite to */..     
1ded0 20 69 57 72 69 74 65 20 3d 20 28 28 62 75 66 2e   iWrite = ((buf.
1dee0 73 74 5f 73 69 7a 65 20 2b 20 32 2a 6e 42 6c 6b  st_size + 2*nBlk
1def0 20 2d 20 31 29 2f 6e 42 6c 6b 29 2a 6e 42 6c 6b   - 1)/nBlk)*nBlk
1df00 2d 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  -1;.      assert
1df10 28 20 69 57 72 69 74 65 3e 3d 62 75 66 2e 73 74  ( iWrite>=buf.st
1df20 5f 73 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61  _size );.      a
1df30 73 73 65 72 74 28 20 28 69 57 72 69 74 65 2f 6e  ssert( (iWrite/n
1df40 42 6c 6b 29 3d 3d 28 28 62 75 66 2e 73 74 5f 73  Blk)==((buf.st_s
1df50 69 7a 65 2b 6e 42 6c 6b 2d 31 29 2f 6e 42 6c 6b  ize+nBlk-1)/nBlk
1df60 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
1df70 74 28 20 28 28 69 57 72 69 74 65 2b 31 29 25 6e  t( ((iWrite+1)%n
1df80 42 6c 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Blk)==0 );.     
1df90 20 66 6f 72 28 2f 2a 6e 6f 2d 6f 70 2a 2f 3b 20   for(/*no-op*/; 
1dfa0 69 57 72 69 74 65 3c 6e 53 69 7a 65 3b 20 69 57  iWrite<nSize; iW
1dfb0 72 69 74 65 2b 3d 6e 42 6c 6b 20 29 7b 0a 20 20  rite+=nBlk ){.  
1dfc0 20 20 20 20 20 20 6e 57 72 69 74 65 20 3d 20 73        nWrite = s
1dfd0 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c  eekAndWrite(pFil
1dfe0 65 2c 20 69 57 72 69 74 65 2c 20 22 22 2c 20 31  e, iWrite, "", 1
1dff0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
1e000 57 72 69 74 65 21 3d 31 20 29 20 72 65 74 75 72  Write!=1 ) retur
1e010 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  n SQLITE_IOERR_W
1e020 52 49 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RITE;.      }.  
1e030 20 20 20 20 69 66 28 20 6e 57 72 69 74 65 3d 3d      if( nWrite==
1e040 30 20 7c 7c 20 28 6e 53 69 7a 65 25 6e 42 6c 6b  0 || (nSize%nBlk
1e050 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 57 72  ) ){.        nWr
1e060 69 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69  ite = seekAndWri
1e070 74 65 28 70 46 69 6c 65 2c 20 6e 53 69 7a 65 2d  te(pFile, nSize-
1e080 31 2c 20 22 22 2c 20 31 29 3b 0a 20 20 20 20 20  1, "", 1);.     
1e090 20 20 20 69 66 28 20 6e 57 72 69 74 65 21 3d 31     if( nWrite!=1
1e0a0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1e0b0 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20  _IOERR_WRITE;.  
1e0c0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1e0d0 20 7d 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49   }.  }..#if SQLI
1e0e0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
1e0f0 3e 30 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  >0.  if( pFile->
1e100 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20 26 26  mmapSizeMax>0 &&
1e110 20 6e 42 79 74 65 3e 70 46 69 6c 65 2d 3e 6d 6d   nByte>pFile->mm
1e120 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 6e  apSize ){.    in
1e130 74 20 72 63 3b 0a 20 20 20 20 69 66 28 20 70 46  t rc;.    if( pF
1e140 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3c 3d 30 20  ile->szChunk<=0 
1e150 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 6f 62  ){.      if( rob
1e160 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 46  ust_ftruncate(pF
1e170 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29 20 29  ile->h, nByte) )
1e180 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c  {.        storeL
1e190 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
1e1a0 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  errno);.        
1e1b0 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72  return unixLogEr
1e1c0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1e1d0 5f 54 52 55 4e 43 41 54 45 2c 20 22 66 74 72 75  _TRUNCATE, "ftru
1e1e0 6e 63 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  ncate", pFile->z
1e1f0 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Path);.      }. 
1e200 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 75     }..    rc = u
1e210 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 69 6c 65  nixMapfile(pFile
1e220 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 72 65  , nByte);.    re
1e230 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
1e240 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  dif..  return SQ
1e250 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1e260 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20 69 6e  * If *pArg is in
1e270 69 74 69 61 6c 6c 79 20 6e 65 67 61 74 69 76 65  itially negative
1e280 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 61 20   then this is a 
1e290 71 75 65 72 79 2e 20 20 53 65 74 20 2a 70 41 72  query.  Set *pAr
1e2a0 67 20 74 6f 0a 2a 2a 20 31 20 6f 72 20 30 20 64  g to.** 1 or 0 d
1e2b0 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
1e2c0 68 65 72 20 6f 72 20 6e 6f 74 20 62 69 74 20 6d  her or not bit m
1e2d0 61 73 6b 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74  ask of pFile->ct
1e2e0 72 6c 46 6c 61 67 73 20 69 73 20 73 65 74 2e 0a  rlFlags is set..
1e2f0 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69  **.** If *pArg i
1e300 73 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20 63  s 0 or 1, then c
1e310 6c 65 61 72 20 6f 72 20 73 65 74 20 74 68 65 20  lear or set the 
1e320 6d 61 73 6b 20 62 69 74 20 6f 66 20 70 46 69 6c  mask bit of pFil
1e330 65 2d 3e 63 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f  e->ctrlFlags..*/
1e340 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
1e350 78 4d 6f 64 65 42 69 74 28 75 6e 69 78 46 69 6c  xModeBit(unixFil
1e360 65 20 2a 70 46 69 6c 65 2c 20 75 6e 73 69 67 6e  e *pFile, unsign
1e370 65 64 20 63 68 61 72 20 6d 61 73 6b 2c 20 69 6e  ed char mask, in
1e380 74 20 2a 70 41 72 67 29 7b 0a 20 20 69 66 28 20  t *pArg){.  if( 
1e390 2a 70 41 72 67 3c 30 20 29 7b 0a 20 20 20 20 2a  *pArg<0 ){.    *
1e3a0 70 41 72 67 20 3d 20 28 70 46 69 6c 65 2d 3e 63  pArg = (pFile->c
1e3b0 74 72 6c 46 6c 61 67 73 20 26 20 6d 61 73 6b 29  trlFlags & mask)
1e3c0 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  !=0;.  }else if(
1e3d0 20 28 2a 70 41 72 67 29 3d 3d 30 20 29 7b 0a 20   (*pArg)==0 ){. 
1e3e0 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
1e3f0 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ags &= ~mask;.  
1e400 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65  }else{.    pFile
1e410 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 6d  ->ctrlFlags |= m
1e420 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 46  ask;.  }.}../* F
1e430 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
1e440 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  on */.static int
1e450 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65   unixGetTempname
1e460 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20  (int nBuf, char 
1e470 2a 7a 42 75 66 29 3b 0a 0a 2f 2a 0a 2a 2a 20 49  *zBuf);../*.** I
1e480 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20 63  nformation and c
1e490 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e 20 6f 70 65  ontrol of an ope
1e4a0 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a  n file handle..*
1e4b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1e4c0 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c  xFileControl(sql
1e4d0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
1e4e0 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72  nt op, void *pAr
1e4f0 67 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  g){.  unixFile *
1e500 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
1e510 65 2a 29 69 64 3b 0a 20 20 73 77 69 74 63 68 28  e*)id;.  switch(
1e520 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
1e530 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 41 4c  SQLITE_FCNTL_WAL
1e540 5f 42 4c 4f 43 4b 3a 20 7b 0a 20 20 20 20 20 20  _BLOCK: {.      
1e550 2f 2a 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  /* pFile->ctrlFl
1e560 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
1e570 42 4c 4f 43 4b 3b 20 2f 2f 20 44 65 66 65 72 72  BLOCK; // Deferr
1e580 65 64 20 66 65 61 74 75 72 65 20 2a 2f 0a 20 20  ed feature */.  
1e590 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1e5a0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1e5b0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1e5c0 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20  L_LOCKSTATE: {. 
1e5d0 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
1e5e0 20 3d 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c   = pFile->eFileL
1e5f0 6f 63 6b 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ock;.      retur
1e600 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1e610 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
1e620 54 45 5f 46 43 4e 54 4c 5f 4c 41 53 54 5f 45 52  TE_FCNTL_LAST_ER
1e630 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69  RNO: {.      *(i
1e640 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65  nt*)pArg = pFile
1e650 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  ->lastErrno;.   
1e660 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1e670 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
1e680 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1e690 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20  _CHUNK_SIZE: {. 
1e6a0 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68       pFile->szCh
1e6b0 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41  unk = *(int *)pA
1e6c0 72 67 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rg;.      return
1e6d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1e6e0 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1e6f0 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  E_FCNTL_SIZE_HIN
1e700 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  T: {.      int r
1e710 63 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  c;.      Simulat
1e720 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
1e730 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 63  );.      rc = fc
1e740 6e 74 6c 53 69 7a 65 48 69 6e 74 28 70 46 69 6c  ntlSizeHint(pFil
1e750 65 2c 20 2a 28 69 36 34 20 2a 29 70 41 72 67 29  e, *(i64 *)pArg)
1e760 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
1e770 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
1e780 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1e790 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  c;.    }.    cas
1e7a0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  e SQLITE_FCNTL_P
1e7b0 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20  ERSIST_WAL: {.  
1e7c0 20 20 20 20 75 6e 69 78 4d 6f 64 65 42 69 74 28      unixModeBit(
1e7d0 70 46 69 6c 65 2c 20 55 4e 49 58 46 49 4c 45 5f  pFile, UNIXFILE_
1e7e0 50 45 52 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e  PERSIST_WAL, (in
1e7f0 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20  t*)pArg);.      
1e800 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e810 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e820 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f   SQLITE_FCNTL_PO
1e830 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
1e840 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 4d  E: {.      unixM
1e850 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 55 4e  odeBit(pFile, UN
1e860 49 58 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e  IXFILE_PSOW, (in
1e870 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20  t*)pArg);.      
1e880 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e890 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e8a0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46   SQLITE_FCNTL_VF
1e8b0 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2a  SNAME: {.      *
1e8c0 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 73  (char**)pArg = s
1e8d0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1e8e0 25 73 22 2c 20 70 46 69 6c 65 2d 3e 70 56 66 73  %s", pFile->pVfs
1e8f0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
1e900 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e910 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e920 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45   SQLITE_FCNTL_TE
1e930 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20 20  MPFILENAME: {.  
1e940 20 20 20 20 63 68 61 72 20 2a 7a 54 46 69 6c 65      char *zTFile
1e950 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
1e960 63 36 34 28 20 70 46 69 6c 65 2d 3e 70 56 66 73  c64( pFile->pVfs
1e970 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a  ->mxPathname );.
1e980 20 20 20 20 20 20 69 66 28 20 7a 54 46 69 6c 65        if( zTFile
1e990 20 29 7b 0a 20 20 20 20 20 20 20 20 75 6e 69 78   ){.        unix
1e9a0 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 46 69 6c  GetTempname(pFil
1e9b0 65 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  e->pVfs->mxPathn
1e9c0 61 6d 65 2c 20 7a 54 46 69 6c 65 29 3b 0a 20 20  ame, zTFile);.  
1e9d0 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70        *(char**)p
1e9e0 41 72 67 20 3d 20 7a 54 46 69 6c 65 3b 0a 20 20  Arg = zTFile;.  
1e9f0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
1ea00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1ea10 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
1ea20 49 54 45 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f  ITE_FCNTL_HAS_MO
1ea30 56 45 44 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69  VED: {.      *(i
1ea40 6e 74 2a 29 70 41 72 67 20 3d 20 66 69 6c 65 48  nt*)pArg = fileH
1ea50 61 73 4d 6f 76 65 64 28 70 46 69 6c 65 29 3b 0a  asMoved(pFile);.
1ea60 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1ea70 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69  ITE_OK;.    }.#i
1ea80 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
1ea90 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 63 61 73  P_SIZE>0.    cas
1eaa0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d  e SQLITE_FCNTL_M
1eab0 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20  MAP_SIZE: {.    
1eac0 20 20 69 36 34 20 6e 65 77 4c 69 6d 69 74 20 3d    i64 newLimit =
1ead0 20 2a 28 69 36 34 2a 29 70 41 72 67 3b 0a 20 20   *(i64*)pArg;.  
1eae0 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c      int rc = SQL
1eaf0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66  ITE_OK;.      if
1eb00 28 20 6e 65 77 4c 69 6d 69 74 3e 73 71 6c 69 74  ( newLimit>sqlit
1eb10 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
1eb20 78 4d 6d 61 70 20 29 7b 0a 20 20 20 20 20 20 20  xMmap ){.       
1eb30 20 6e 65 77 4c 69 6d 69 74 20 3d 20 73 71 6c 69   newLimit = sqli
1eb40 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1eb50 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20 7d 0a  mxMmap;.      }.
1eb60 20 20 20 20 20 20 2a 28 69 36 34 2a 29 70 41 72        *(i64*)pAr
1eb70 67 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  g = pFile->mmapS
1eb80 69 7a 65 4d 61 78 3b 0a 20 20 20 20 20 20 69 66  izeMax;.      if
1eb90 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 26 26  ( newLimit>=0 &&
1eba0 20 6e 65 77 4c 69 6d 69 74 21 3d 70 46 69 6c 65   newLimit!=pFile
1ebb0 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 26 26  ->mmapSizeMax &&
1ebc0 20 70 46 69 6c 65 2d 3e 6e 46 65 74 63 68 4f 75   pFile->nFetchOu
1ebd0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
1ebe0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d  pFile->mmapSizeM
1ebf0 61 78 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20  ax = newLimit;. 
1ec00 20 20 20 20 20 20 20 69 66 28 20 70 46 69 6c 65         if( pFile
1ec10 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a  ->mmapSize>0 ){.
1ec20 20 20 20 20 20 20 20 20 20 20 75 6e 69 78 55 6e            unixUn
1ec30 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a  mapfile(pFile);.
1ec40 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75            rc = u
1ec50 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 69 6c 65  nixMapfile(pFile
1ec60 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  , -1);.        }
1ec70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
1ec80 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1ec90 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
1eca0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f  LITE_DEBUG.    /
1ecb0 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 6c 6c  * The pager call
1ecc0 73 20 74 68 69 73 20 6d 65 74 68 6f 64 20 74 6f  s this method to
1ecd0 20 73 69 67 6e 61 6c 20 74 68 61 74 20 69 74 20   signal that it 
1ece0 68 61 73 20 64 6f 6e 65 0a 20 20 20 20 2a 2a 20  has done.    ** 
1ecf0 61 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 74  a rollback and t
1ed00 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
1ed10 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 75 6e   is therefore un
1ed20 63 68 61 6e 67 65 64 20 61 6e 64 0a 20 20 20 20  changed and.    
1ed30 2a 2a 20 69 74 20 68 65 6e 63 65 20 69 74 20 69  ** it hence it i
1ed40 73 20 4f 4b 20 66 6f 72 20 74 68 65 20 74 72 61  s OK for the tra
1ed50 6e 73 61 63 74 69 6f 6e 20 63 68 61 6e 67 65 20  nsaction change 
1ed60 63 6f 75 6e 74 65 72 20 74 6f 20 62 65 0a 20 20  counter to be.  
1ed70 20 20 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 0a    ** unchanged..
1ed80 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1ed90 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f  SQLITE_FCNTL_DB_
1eda0 55 4e 43 48 41 4e 47 45 44 3a 20 7b 0a 20 20 20  UNCHANGED: {.   
1edb0 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
1edc0 64 29 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30  d)->dbUpdate = 0
1edd0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1ede0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1edf0 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
1ee00 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1ee10 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
1ee20 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20  d(__APPLE__).   
1ee30 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1ee40 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TL_SET_LOCKPROXY
1ee50 46 49 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 53  FILE:.    case S
1ee60 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 47 45 54 5f  QLITE_FCNTL_GET_
1ee70 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b  LOCKPROXYFILE: {
1ee80 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 72  .      return pr
1ee90 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 69  oxyFileControl(i
1eea0 64 2c 6f 70 2c 70 41 72 67 29 3b 0a 20 20 20 20  d,op,pArg);.    
1eeb0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1eec0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1eed0 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
1eee0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f  ed(__APPLE__) */
1eef0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1ef00 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d  LITE_NOTFOUND;.}
1ef10 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1ef20 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  he sector size i
1ef30 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 75  n bytes of the u
1ef40 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20  nderlying block 
1ef50 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68  device for.** th
1ef60 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
1ef70 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74  . This is almost
1ef80 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65   always 512 byte
1ef90 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a  s, but may be.**
1efa0 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65   larger for some
1efb0 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20   devices..**.** 
1efc0 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75  SQLite code assu
1efd0 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f  mes this functio
1efe0 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49  n cannot fail. I
1eff0 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74  t also assumes t
1f000 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69  hat.** if two fi
1f010 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64 20  les are created 
1f020 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  in the same file
1f030 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72  -system director
1f040 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74  y (i.e..** a dat
1f050 61 62 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f  abase and its jo
1f060 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74  urnal file) that
1f070 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
1f080 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20   will be the.** 
1f090 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a  same for both..*
1f0a0 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 51 4e 58 4e  /.#ifndef __QNXN
1f0b0 54 4f 5f 5f 20 0a 73 74 61 74 69 63 20 69 6e 74  TO__ .static int
1f0c0 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28   unixSectorSize(
1f0d0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f  sqlite3_file *No
1f0e0 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44  tUsed){.  UNUSED
1f0f0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
1f100 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ed);.  return SQ
1f110 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43  LITE_DEFAULT_SEC
1f120 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 23 65 6e 64  TOR_SIZE;.}.#end
1f130 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
1f140 6c 6c 6f 77 69 6e 67 20 76 65 72 73 69 6f 6e 20  llowing version 
1f150 6f 66 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a  of unixSectorSiz
1f160 65 28 29 20 69 73 20 6f 70 74 69 6d 69 7a 65 64  e() is optimized
1f170 20 66 6f 72 20 51 4e 58 2e 0a 2a 2f 0a 23 69 66   for QNX..*/.#if
1f180 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 23  def __QNXNTO__.#
1f190 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 64 63 6d  include <sys/dcm
1f1a0 64 5f 62 6c 6b 2e 68 3e 0a 23 69 6e 63 6c 75 64  d_blk.h>.#includ
1f1b0 65 20 3c 73 79 73 2f 73 74 61 74 76 66 73 2e 68  e <sys/statvfs.h
1f1c0 3e 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  >.static int uni
1f1d0 78 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69  xSectorSize(sqli
1f1e0 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
1f1f0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
1f200 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
1f210 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73  ;.  if( pFile->s
1f220 65 63 74 6f 72 53 69 7a 65 20 3d 3d 20 30 20 29  ectorSize == 0 )
1f230 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  {.    struct sta
1f240 74 76 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 20  tvfs fsInfo;.   
1f250 20 20 20 20 0a 20 20 20 20 2f 2a 20 53 65 74 20      .    /* Set 
1f260 64 65 66 61 75 6c 74 73 20 66 6f 72 20 6e 6f 6e  defaults for non
1f270 2d 73 75 70 70 6f 72 74 65 64 20 66 69 6c 65 73  -supported files
1f280 79 73 74 65 6d 73 20 2a 2f 0a 20 20 20 20 70 46  ystems */.    pF
1f290 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
1f2a0 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
1f2b0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20  _SECTOR_SIZE;.  
1f2c0 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43    pFile->deviceC
1f2d0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d  haracteristics =
1f2e0 20 30 3b 0a 20 20 20 20 69 66 28 20 66 73 74 61   0;.    if( fsta
1f2f0 74 76 66 73 28 70 46 69 6c 65 2d 3e 68 2c 20 26  tvfs(pFile->h, &
1f300 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 20  fsInfo) == -1 ) 
1f310 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
1f320 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
1f330 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
1f340 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e   !strcmp(fsInfo.
1f350 66 5f 62 61 73 65 74 79 70 65 2c 20 22 74 6d 70  f_basetype, "tmp
1f360 22 29 20 29 20 7b 0a 20 20 20 20 20 20 70 46 69  ") ) {.      pFi
1f370 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  le->sectorSize =
1f380 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b   fsInfo.f_bsize;
1f390 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65  .      pFile->de
1f3a0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1f3b0 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53 51  ics =.        SQ
1f3c0 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
1f3d0 43 34 4b 20 7c 20 20 20 20 20 20 20 2f 2a 20 41  C4K |       /* A
1f3e0 6c 6c 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65  ll ram filesyste
1f3f0 6d 20 77 72 69 74 65 73 20 61 72 65 20 61 74 6f  m writes are ato
1f400 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  mic */.        S
1f410 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
1f420 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20  _APPEND |    /* 
1f430 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65  growing the file
1f440 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20   does not occur 
1f450 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20  until.          
1f460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f470 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
1f480 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65 64  he write succeed
1f490 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c  s */.        SQL
1f4a0 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
1f4b0 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68  TIAL |     /* Th
1f4c0 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d  e ram filesystem
1f4d0 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65   has no write be
1f4e0 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20  hind.           
1f4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f500 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f             ** so
1f510 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a   it is ordered *
1f520 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20  /.        0;.   
1f530 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 73 74   }else if( strst
1f540 72 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74  r(fsInfo.f_baset
1f550 79 70 65 2c 20 22 65 74 66 73 22 29 20 29 7b 0a  ype, "etfs") ){.
1f560 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63        pFile->sec
1f570 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f  torSize = fsInfo
1f580 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20  .f_bsize;.      
1f590 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61  pFile->deviceCha
1f5a0 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20  racteristics =. 
1f5b0 20 20 20 20 20 20 20 2f 2a 20 65 74 66 73 20 63         /* etfs c
1f5c0 6c 75 73 74 65 72 20 73 69 7a 65 20 77 72 69 74  luster size writ
1f5d0 65 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f  es are atomic */
1f5e0 0a 20 20 20 20 20 20 20 20 28 70 46 69 6c 65 2d  .        (pFile-
1f5f0 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20 35 31  >sectorSize / 51
1f600 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  2 * SQLITE_IOCAP
1f610 5f 41 54 4f 4d 49 43 35 31 32 29 20 7c 0a 20 20  _ATOMIC512) |.  
1f620 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
1f630 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c  AP_SAFE_APPEND |
1f640 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74      /* growing t
1f650 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
1f660 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20   occur until.   
1f670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f690 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20     ** the write 
1f6a0 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20  succeeds */.    
1f6b0 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
1f6c0 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20  _SEQUENTIAL |   
1f6d0 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c    /* The ram fil
1f6e0 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77  esystem has no w
1f6f0 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20  rite behind.    
1f700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f720 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72    ** so it is or
1f730 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  dered */.       
1f740 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
1f750 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f  ( !strcmp(fsInfo
1f760 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 71 6e  .f_basetype, "qn
1f770 78 36 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46  x6") ){.      pF
1f780 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
1f790 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65  = fsInfo.f_bsize
1f7a0 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64  ;.      pFile->d
1f7b0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1f7c0 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53  tics =.        S
1f7d0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
1f7e0 49 43 20 7c 20 20 20 20 20 20 20 20 20 2f 2a 20  IC |         /* 
1f7f0 41 6c 6c 20 66 69 6c 65 73 79 73 74 65 6d 20 77  All filesystem w
1f800 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63  rites are atomic
1f810 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49   */.        SQLI
1f820 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
1f830 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f  PEND |    /* gro
1f840 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f  wing the file do
1f850 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74  es not occur unt
1f860 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  il.             
1f870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f880 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
1f890 77 72 69 74 65 20 73 75 63 63 65 65 64 73 20 2a  write succeeds *
1f8a0 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  /.        SQLITE
1f8b0 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
1f8c0 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72  L |     /* The r
1f8d0 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61  am filesystem ha
1f8e0 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e  s no write behin
1f8f0 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
1f900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f910 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74          ** so it
1f920 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20   is ordered */. 
1f930 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65         0;.    }e
1f940 6c 73 65 20 69 66 28 20 21 73 74 72 63 6d 70 28  lse if( !strcmp(
1f950 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70  fsInfo.f_basetyp
1f960 65 2c 20 22 71 6e 78 34 22 29 20 29 7b 0a 20 20  e, "qnx4") ){.  
1f970 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f      pFile->secto
1f980 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66  rSize = fsInfo.f
1f990 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46  _bsize;.      pF
1f9a0 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
1f9b0 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20  cteristics =.   
1f9c0 20 20 20 20 20 2f 2a 20 66 75 6c 6c 20 62 69 74       /* full bit
1f9d0 73 65 74 20 6f 66 20 61 74 6f 6d 69 63 73 20 66  set of atomics f
1f9e0 72 6f 6d 20 6d 61 78 20 73 65 63 74 6f 72 20 73  rom max sector s
1f9f0 69 7a 65 20 61 6e 64 20 73 6d 61 6c 6c 65 72 20  ize and smaller 
1fa00 2a 2f 0a 20 20 20 20 20 20 20 20 28 28 70 46 69  */.        ((pFi
1fa10 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f  le->sectorSize /
1fa20 20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f   512 * SQLITE_IO
1fa30 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 3c  CAP_ATOMIC512) <
1fa40 3c 20 31 29 20 2d 20 32 20 7c 0a 20 20 20 20 20  < 1) - 2 |.     
1fa50 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
1fa60 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20  SEQUENTIAL |    
1fa70 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65   /* The ram file
1fa80 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72  system has no wr
1fa90 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20  ite behind.     
1faa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fac0 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64   ** so it is ord
1fad0 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ered */.        
1fae0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
1faf0 20 73 74 72 73 74 72 28 66 73 49 6e 66 6f 2e 66   strstr(fsInfo.f
1fb00 5f 62 61 73 65 74 79 70 65 2c 20 22 64 6f 73 22  _basetype, "dos"
1fb10 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
1fb20 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66  ->sectorSize = f
1fb30 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20  sInfo.f_bsize;. 
1fb40 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69       pFile->devi
1fb50 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1fb60 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20 66  s =.        /* f
1fb70 75 6c 6c 20 62 69 74 73 65 74 20 6f 66 20 61 74  ull bitset of at
1fb80 6f 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78 20 73  omics from max s
1fb90 65 63 74 6f 72 20 73 69 7a 65 20 61 6e 64 20 73  ector size and s
1fba0 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 20 20  maller */.      
1fbb0 20 20 28 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f    ((pFile->secto
1fbc0 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20 53 51  rSize / 512 * SQ
1fbd0 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
1fbe0 43 35 31 32 29 20 3c 3c 20 31 29 20 2d 20 32 20  C512) << 1) - 2 
1fbf0 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  |.        SQLITE
1fc00 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
1fc10 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72  L |     /* The r
1fc20 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61  am filesystem ha
1fc30 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e  s no write behin
1fc40 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
1fc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc60 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74          ** so it
1fc70 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20   is ordered */. 
1fc80 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65         0;.    }e
1fc90 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  lse{.      pFile
1fca0 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
1fcb0 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20  ristics =.      
1fcc0 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41    SQLITE_IOCAP_A
1fcd0 54 4f 4d 49 43 35 31 32 20 7c 20 20 20 20 20 20  TOMIC512 |      
1fce0 2f 2a 20 62 6c 6f 63 6b 73 20 61 72 65 20 61 74  /* blocks are at
1fcf0 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20  omic */.        
1fd00 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
1fd10 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a  E_APPEND |    /*
1fd20 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c   growing the fil
1fd30 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72  e does not occur
1fd40 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20   until.         
1fd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd60 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1fd70 74 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65  the write succee
1fd80 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b  ds */.        0;
1fd90 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20  .    }.  }.  /* 
1fda0 4c 61 73 74 20 63 68 61 6e 63 65 20 76 65 72 69  Last chance veri
1fdb0 66 69 63 61 74 69 6f 6e 2e 20 20 49 66 20 74 68  fication.  If th
1fdc0 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  e sector size is
1fdd0 6e 27 74 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f  n't a multiple o
1fde0 66 20 35 31 32 0a 20 20 2a 2a 20 74 68 65 6e 20  f 512.  ** then 
1fdf0 69 74 20 69 73 6e 27 74 20 76 61 6c 69 64 2e 2a  it isn't valid.*
1fe00 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73  /.  if( pFile->s
1fe10 65 63 74 6f 72 53 69 7a 65 20 25 20 35 31 32 20  ectorSize % 512 
1fe20 21 3d 20 30 20 29 7b 0a 20 20 20 20 70 46 69 6c  != 0 ){.    pFil
1fe30 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  e->deviceCharact
1fe40 65 72 69 73 74 69 63 73 20 3d 20 30 3b 0a 20 20  eristics = 0;.  
1fe50 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53    pFile->sectorS
1fe60 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ize = SQLITE_DEF
1fe70 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AULT_SECTOR_SIZE
1fe80 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
1fe90 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
1fea0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 5f  ;.}.#endif /* __
1feb0 51 4e 58 4e 54 4f 5f 5f 20 2a 2f 0a 0a 2f 2a 0a  QNXNTO__ */../*.
1fec0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  ** Return the de
1fed0 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73  vice characteris
1fee0 74 69 63 73 20 66 6f 72 20 74 68 65 20 66 69 6c  tics for the fil
1fef0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 56 46  e..**.** This VF
1ff00 53 20 69 73 20 73 65 74 20 75 70 20 74 6f 20 72  S is set up to r
1ff10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43  eturn SQLITE_IOC
1ff20 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  AP_POWERSAFE_OVE
1ff30 52 57 52 49 54 45 20 62 79 20 64 65 66 61 75 6c  RWRITE by defaul
1ff40 74 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74  t..** However, t
1ff50 68 61 74 20 63 68 6f 69 63 65 20 69 73 20 63 6f  hat choice is co
1ff60 6e 74 72 6f 76 65 72 73 69 61 6c 20 73 69 6e 63  ntroversial sinc
1ff70 65 20 74 65 63 68 6e 69 63 61 6c 6c 79 20 74 68  e technically th
1ff80 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20  e underlying.** 
1ff90 66 69 6c 65 20 73 79 73 74 65 6d 20 64 6f 65 73  file system does
1ffa0 20 6e 6f 74 20 61 6c 77 61 79 73 20 70 72 6f 76   not always prov
1ffb0 69 64 65 20 70 6f 77 65 72 73 61 66 65 20 6f 76  ide powersafe ov
1ffc0 65 72 77 72 69 74 65 73 2e 20 20 28 49 6e 20 6f  erwrites.  (In o
1ffd0 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61  ther.** words, a
1ffe0 66 74 65 72 20 61 20 70 6f 77 65 72 2d 6c 6f 73  fter a power-los
1fff0 73 20 65 76 65 6e 74 2c 20 70 61 72 74 73 20 6f  s event, parts o
20000 66 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20  f the file that 
20010 77 65 72 65 20 6e 65 76 65 72 0a 2a 2a 20 77 72  were never.** wr
20020 69 74 74 65 6e 20 6d 69 67 68 74 20 65 6e 64 20  itten might end 
20030 75 70 20 62 65 69 6e 67 20 61 6c 74 65 72 65 64  up being altered
20040 2e 29 20 20 48 6f 77 65 76 65 72 2c 20 6e 6f 6e  .)  However, non
20050 2d 50 53 4f 57 20 62 65 68 61 76 69 6f 72 20 69  -PSOW behavior i
20060 73 20 76 65 72 79 2c 0a 2a 2a 20 76 65 72 79 20  s very,.** very 
20070 72 61 72 65 2e 20 20 41 6e 64 20 61 73 73 65 72  rare.  And asser
20080 74 69 6e 67 20 50 53 4f 57 20 6d 61 6b 65 73 20  ting PSOW makes 
20090 61 20 6c 61 72 67 65 20 72 65 64 75 63 74 69 6f  a large reductio
200a0 6e 20 69 6e 20 74 68 65 20 61 6d 6f 75 6e 74 0a  n in the amount.
200b0 2a 2a 20 6f 66 20 72 65 71 75 69 72 65 64 20 49  ** of required I
200c0 2f 4f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 69 6e  /O for journalin
200d0 67 2c 20 73 69 6e 63 65 20 61 20 6c 6f 74 20 6f  g, since a lot o
200e0 66 20 70 61 64 64 69 6e 67 20 69 73 20 65 6c 69  f padding is eli
200f0 6d 69 6e 61 74 65 64 2e 0a 2a 2a 20 20 48 65 6e  minated..**  Hen
20100 63 65 2c 20 77 68 69 6c 65 20 50 4f 57 45 52 53  ce, while POWERS
20110 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 69 73  AFE_OVERWRITE is
20120 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 2c 20   on by default, 
20130 74 68 65 72 65 20 69 73 20 61 20 66 69 6c 65 2d  there is a file-
20140 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 61 76 61 69 6c  control.** avail
20150 61 62 6c 65 20 74 6f 20 74 75 72 6e 20 69 74 20  able to turn it 
20160 6f 66 66 20 61 6e 64 20 55 52 49 20 71 75 65 72  off and URI quer
20170 79 20 70 61 72 61 6d 65 74 65 72 20 61 76 61 69  y parameter avai
20180 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e 20 69 74  lable to turn it
20190 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   off..*/.static 
201a0 69 6e 74 20 75 6e 69 78 44 65 76 69 63 65 43 68  int unixDeviceCh
201b0 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71  aracteristics(sq
201c0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
201d0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d  .  unixFile *p =
201e0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
201f0 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 23 69    int rc = 0;.#i
20200 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a  fdef __QNXNTO__.
20210 20 20 69 66 28 20 70 2d 3e 73 65 63 74 6f 72 53    if( p->sectorS
20220 69 7a 65 3d 3d 30 20 29 20 75 6e 69 78 53 65 63  ize==0 ) unixSec
20230 74 6f 72 53 69 7a 65 28 69 64 29 3b 0a 20 20 72  torSize(id);.  r
20240 63 20 3d 20 70 2d 3e 64 65 76 69 63 65 43 68 61  c = p->deviceCha
20250 72 61 63 74 65 72 69 73 74 69 63 73 3b 0a 23 65  racteristics;.#e
20260 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 63 74  ndif.  if( p->ct
20270 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49  rlFlags & UNIXFI
20280 4c 45 5f 50 53 4f 57 20 29 7b 0a 20 20 20 20 72  LE_PSOW ){.    r
20290 63 20 7c 3d 20 53 51 4c 49 54 45 5f 49 4f 43 41  c |= SQLITE_IOCA
202a0 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
202b0 57 52 49 54 45 3b 0a 20 20 7d 0a 20 20 72 65 74  WRITE;.  }.  ret
202c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 21  urn rc;.}..#if !
202d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
202e0 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49  MIT_WAL) || SQLI
202f0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
20300 3e 30 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  >0../*.** Return
20310 20 74 68 65 20 73 79 73 74 65 6d 20 70 61 67 65   the system page
20320 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   size..**.** Thi
20330 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
20340 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20  d not be called 
20350 64 69 72 65 63 74 6c 79 20 62 79 20 6f 74 68 65  directly by othe
20360 72 20 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66  r code in this f
20370 69 6c 65 2e 20 0a 2a 2a 20 49 6e 73 74 65 61 64  ile. .** Instead
20380 2c 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 63  , it should be c
20390 61 6c 6c 65 64 20 76 69 61 20 6d 61 63 72 6f 20  alled via macro 
203a0 6f 73 47 65 74 70 61 67 65 73 69 7a 65 28 29 2e  osGetpagesize().
203b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
203c0 6e 69 78 47 65 74 70 61 67 65 73 69 7a 65 28 76  nixGetpagesize(v
203d0 6f 69 64 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57  oid){.#if OS_VXW
203e0 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e 20 31 30  ORKS.  return 10
203f0 32 34 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  24;.#elif define
20400 64 28 5f 42 53 44 5f 53 4f 55 52 43 45 29 0a 20  d(_BSD_SOURCE). 
20410 20 72 65 74 75 72 6e 20 67 65 74 70 61 67 65 73   return getpages
20420 69 7a 65 28 29 3b 0a 23 65 6c 73 65 0a 20 20 72  ize();.#else.  r
20430 65 74 75 72 6e 20 28 69 6e 74 29 73 79 73 63 6f  eturn (int)sysco
20440 6e 66 28 5f 53 43 5f 50 41 47 45 53 49 5a 45 29  nf(_SC_PAGESIZE)
20450 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 65 6e 64  ;.#endif.}..#end
20460 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
20470 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20  QLITE_OMIT_WAL) 
20480 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  || SQLITE_MAX_MM
20490 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 23 69  AP_SIZE>0 */..#i
204a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
204b0 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a  T_WAL../*.** Obj
204c0 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 70 72  ect used to repr
204d0 65 73 65 6e 74 20 61 6e 20 73 68 61 72 65 64 20  esent an shared 
204e0 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 2e 20 20  memory buffer.  
204f0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75 6c 74  .**.** When mult
20500 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c  iple threads all
20510 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73   reference the s
20520 61 6d 65 20 77 61 6c 2d 69 6e 64 65 78 2c 20 65  ame wal-index, e
20530 61 63 68 20 74 68 72 65 61 64 0a 2a 2a 20 68 61  ach thread.** ha
20540 73 20 69 74 73 20 6f 77 6e 20 75 6e 69 78 53 68  s its own unixSh
20550 6d 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68  m object, but th
20560 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f 20  ey all point to 
20570 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63  a single instanc
20580 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 75 6e 69  e.** of this uni
20590 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 2e  xShmNode object.
205a0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
205b0 2c 20 65 61 63 68 20 77 61 6c 2d 69 6e 64 65 78  , each wal-index
205c0 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e   is opened.** on
205d0 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63  ly once per proc
205e0 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20  ess..**.** Each 
205f0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
20600 63 74 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20  ct is connected 
20610 74 6f 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 78  to a single unix
20620 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
20630 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20 63 6f  ..** We could co
20640 61 6c 65 73 63 65 20 74 68 69 73 20 6f 62 6a 65  alesce this obje
20650 63 74 20 69 6e 74 6f 20 75 6e 69 78 49 6e 6f 64  ct into unixInod
20660 65 49 6e 66 6f 2c 20 62 75 74 20 74 68 61 74 20  eInfo, but that 
20670 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20 65 76  would mean.** ev
20680 65 72 79 20 6f 70 65 6e 20 66 69 6c 65 20 74 68  ery open file th
20690 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  at does not use 
206a0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 28 69  shared memory (i
206b0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d  n other words, m
206c0 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20 66 69 6c 65  ost.** open file
206d0 73 29 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f  s) would have to
206e0 20 63 61 72 72 79 20 61 72 6f 75 6e 64 20 74 68   carry around th
206f0 69 73 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  is extra informa
20700 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74 68 65  tion.  So.** the
20710 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
20720 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61  bject contains a
20730 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
20740 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
20750 65 63 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 75  ect.** and the u
20760 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
20770 74 20 69 73 20 63 72 65 61 74 65 64 20 6f 6e 6c  t is created onl
20780 79 20 77 68 65 6e 20 6e 65 65 64 65 64 2e 0a 2a  y when needed..*
20790 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65  *.** unixMutexHe
207a0 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75  ld() must be tru
207b0 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  e when creating 
207c0 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a  or destroying.**
207d0 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20   this object or 
207e0 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72  while reading or
207f0 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c   writing the fol
20800 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a  lowing fields:.*
20810 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a  *.**      nRef.*
20820 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
20830 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65  ng fields are re
20840 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68  ad-only after th
20850 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  e object is crea
20860 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20  ted:.** .**     
20870 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69   fid.**      zFi
20880 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74  lename.**.** Eit
20890 68 65 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e  her unixShmNode.
208a0 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65  mutex must be he
208b0 6c 64 20 6f 72 20 75 6e 69 78 53 68 6d 4e 6f 64  ld or unixShmNod
208c0 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a  e.nRef==0 and.**
208d0 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
208e0 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65   is true when re
208f0 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
20900 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64   any other field
20910 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75  .** in this stru
20920 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74  cture..*/.struct
20930 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 7b 0a 20   unixShmNode {. 
20940 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
20950 70 49 6e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 75  pInode;     /* u
20960 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 74 68 61  nixInodeInfo tha
20970 74 20 6f 77 6e 73 20 74 68 69 73 20 53 48 4d 20  t owns this SHM 
20980 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  node */.  sqlite
20990 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20  3_mutex *mutex; 
209a0 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f       /* Mutex to
209b0 20 61 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a   access this obj
209c0 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ect */.  char *z
209d0 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
209e0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
209f0 68 65 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20  he mmapped file 
20a00 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20  */.  int h;     
20a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73  /* Open file des
20a30 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  criptor */.  int
20a40 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20   szRegion;      
20a50 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
20a60 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  of shared-memory
20a70 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 75 31   regions */.  u1
20a80 36 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20  6 nRegion;      
20a90 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
20aa0 20 6f 66 20 61 72 72 61 79 20 61 70 52 65 67 69   of array apRegi
20ab0 6f 6e 20 2a 2f 0a 20 20 75 38 20 69 73 52 65 61  on */.  u8 isRea
20ac0 64 6f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  donly;          
20ad0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65     /* True if re
20ae0 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 63 68 61  ad-only */.  cha
20af0 72 20 2a 2a 61 70 52 65 67 69 6f 6e 3b 20 20 20  r **apRegion;   
20b00 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
20b10 20 6f 66 20 6d 61 70 70 65 64 20 73 68 61 72 65   of mapped share
20b20 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73  d-memory regions
20b30 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
20b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b50 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
20b60 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f  ixShm objects po
20b70 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a  inting to this *
20b80 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 46 69  /.  unixShm *pFi
20b90 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rst;           /
20ba0 2a 20 41 6c 6c 20 75 6e 69 78 53 68 6d 20 6f 62  * All unixShm ob
20bb0 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74  jects pointing t
20bc0 6f 20 74 68 69 73 20 2a 2f 0a 23 69 66 64 65 66  o this */.#ifdef
20bd0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
20be0 75 38 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20  u8 exclMask;    
20bf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
20c00 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20  sk of exclusive 
20c10 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
20c20 75 38 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20  u8 sharedMask;  
20c30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
20c40 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63  sk of shared loc
20c50 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20  ks held */.  u8 
20c60 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20  nextShmId;      
20c70 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
20c80 61 76 61 69 6c 61 62 6c 65 20 75 6e 69 78 53 68  available unixSh
20c90 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65  m.id value */.#e
20ca0 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53  ndif.};../*.** S
20cb0 74 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e  tructure used in
20cc0 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73  ternally by this
20cd0 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74   VFS to record t
20ce0 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a  he state of an.*
20cf0 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65  * open shared me
20d00 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  mory connection.
20d10 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
20d20 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20  wing fields are 
20d30 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e  initialized when
20d40 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20   this object is 
20d50 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61  created and.** a
20d60 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65  re read-only the
20d70 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20  reafter:.**.**  
20d80 20 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 0a    unixShm.pFile.
20d90 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 69 64  **    unixShm.id
20da0 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72  .**.** All other
20db0 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64   fields are read
20dc0 2f 77 72 69 74 65 2e 20 20 54 68 65 20 75 6e 69  /write.  The uni
20dd0 78 53 68 6d 2e 70 46 69 6c 65 2d 3e 6d 75 74 65  xShm.pFile->mute
20de0 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a  x must be held.*
20df0 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e  * while accessin
20e00 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65  g any read/write
20e10 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75   fields..*/.stru
20e20 63 74 20 75 6e 69 78 53 68 6d 20 7b 0a 20 20 75  ct unixShm {.  u
20e30 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
20e40 4e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 54 68 65  Node;     /* The
20e50 20 75 6e 64 65 72 6c 79 69 6e 67 20 75 6e 69 78   underlying unix
20e60 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a  ShmNode object *
20e70 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 4e 65  /.  unixShm *pNe
20e80 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  xt;            /
20e90 2a 20 4e 65 78 74 20 75 6e 69 78 53 68 6d 20 77  * Next unixShm w
20ea0 69 74 68 20 74 68 65 20 73 61 6d 65 20 75 6e 69  ith the same uni
20eb0 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38  xShmNode */.  u8
20ec0 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20   hasMutex;      
20ed0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
20ee0 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   if holding the 
20ef0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6d 75 74 65  unixShmNode mute
20f00 78 20 2a 2f 0a 20 20 75 38 20 69 64 3b 20 20 20  x */.  u8 id;   
20f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20    /* Id of this 
20f30 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 69  connection withi
20f40 6e 20 69 74 73 20 75 6e 69 78 53 68 6d 4e 6f 64  n its unixShmNod
20f50 65 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65  e */.  u16 share
20f60 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  dMask;          
20f70 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61    /* Mask of sha
20f80 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  red locks held *
20f90 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b  /.  u16 exclMask
20fa0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
20fb0 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73  * Mask of exclus
20fc0 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  ive locks held *
20fd0 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73  /.};../*.** Cons
20fe0 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c  tants used for l
20ff0 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e  ocking.*/.#defin
21000 65 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 20  e UNIX_SHM_BASE 
21010 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48    ((22+SQLITE_SH
21020 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20  M_NLOCK)*4)     
21030 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63      /* first loc
21040 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e  k byte */.#defin
21050 65 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 20 20  e UNIX_SHM_DMS  
21060 20 20 28 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45    (UNIX_SHM_BASE
21070 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  +SQLITE_SHM_NLOC
21080 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73  K)  /* deadman s
21090 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  witch */../*.** 
210a0 41 70 70 6c 79 20 70 6f 73 69 78 20 61 64 76 69  Apply posix advi
210b0 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61  sory locks for a
210c0 6c 6c 20 62 79 74 65 73 20 66 72 6f 6d 20 6f 66  ll bytes from of
210d0 73 74 20 74 68 72 6f 75 67 68 20 6f 66 73 74 2b  st through ofst+
210e0 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73  n-1..**.** Locks
210f0 20 62 6c 6f 63 6b 20 69 66 20 74 68 65 20 6d 61   block if the ma
21100 73 6b 20 69 73 20 65 78 61 63 74 6c 79 20 55 4e  sk is exactly UN
21110 49 58 5f 53 48 4d 5f 43 20 61 6e 64 20 61 72 65  IX_SHM_C and are
21120 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a 2a 2a   non-blocking.**
21130 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
21140 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
21150 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 75  mSystemLock(.  u
21160 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
21170 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f        /* Open co
21180 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  nnection to the 
21190 57 41 4c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  WAL file */.  in
211a0 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20  t lockType,     
211b0 20 20 20 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c       /* F_UNLCK,
211c0 20 46 5f 52 44 4c 43 4b 2c 20 6f 72 20 46 5f 57   F_RDLCK, or F_W
211d0 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  RLCK */.  int of
211e0 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
211f0 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
21200 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61  f the locking ra
21210 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20  nge */.  int n  
21220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21230 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
21240 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 29 7b  es to lock */.){
21250 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
21260 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20 41 70 70  pShmNode; /* App
21270 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73  ly locks to this
21280 20 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d   open shared-mem
21290 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20  ory segment */. 
212a0 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 66 3b   struct flock f;
212b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
212c0 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f  osix advisory lo
212d0 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  cking structure 
212e0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
212f0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52  LITE_OK;    /* R
21300 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20  esult code form 
21310 66 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20 2f 2a  fcntl() */..  /*
21320 20 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 75   Access to the u
21330 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
21340 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20  t is serialized 
21350 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f  by the caller */
21360 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 46  .  pShmNode = pF
21370 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68  ile->pInode->pSh
21380 6d 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  mNode;.  assert(
21390 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
213a0 65 6c 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  eld(pShmNode->mu
213b0 74 65 78 29 20 7c 7c 20 70 53 68 6d 4e 6f 64 65  tex) || pShmNode
213c0 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20  ->nRef==0 );..  
213d0 2f 2a 20 53 68 61 72 65 64 20 6c 6f 63 6b 73 20  /* Shared locks 
213e0 6e 65 76 65 72 20 73 70 61 6e 20 6d 6f 72 65 20  never span more 
213f0 74 68 61 6e 20 6f 6e 65 20 62 79 74 65 20 2a 2f  than one byte */
21400 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20  .  assert( n==1 
21410 7c 7c 20 6c 6f 63 6b 54 79 70 65 21 3d 46 5f 52  || lockType!=F_R
21420 44 4c 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  DLCK );..  /* Lo
21430 63 6b 73 20 61 72 65 20 77 69 74 68 69 6e 20 72  cks are within r
21440 61 6e 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  ange */.  assert
21450 28 20 6e 3e 3d 31 20 26 26 20 6e 3c 53 51 4c 49  ( n>=1 && n<SQLI
21460 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a  TE_SHM_NLOCK );.
21470 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
21480 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  >h>=0 ){.    int
21490 20 6c 6b 54 79 70 65 3b 0a 20 20 20 20 2f 2a 20   lkType;.    /* 
214a0 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c  Initialize the l
214b0 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72  ocking parameter
214c0 73 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  s */.    memset(
214d0 26 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 29  &f, 0, sizeof(f)
214e0 29 3b 0a 20 20 20 20 66 2e 6c 5f 74 79 70 65 20  );.    f.l_type 
214f0 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a 20 20 20 20  = lockType;.    
21500 66 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  f.l_whence = SEE
21510 4b 5f 53 45 54 3b 0a 20 20 20 20 66 2e 6c 5f 73  K_SET;.    f.l_s
21520 74 61 72 74 20 3d 20 6f 66 73 74 3b 0a 20 20 20  tart = ofst;.   
21530 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b 0a 0a 20   f.l_len = n;.. 
21540 20 20 20 6c 6b 54 79 70 65 20 3d 20 28 70 46 69     lkType = (pFi
21550 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
21560 55 4e 49 58 46 49 4c 45 5f 42 4c 4f 43 4b 29 21  UNIXFILE_BLOCK)!
21570 3d 30 20 3f 20 46 5f 53 45 54 4c 4b 57 20 3a 20  =0 ? F_SETLKW : 
21580 46 5f 53 45 54 4c 4b 3b 0a 20 20 20 20 72 63 20  F_SETLK;.    rc 
21590 3d 20 6f 73 46 63 6e 74 6c 28 70 53 68 6d 4e 6f  = osFcntl(pShmNo
215a0 64 65 2d 3e 68 2c 20 6c 6b 54 79 70 65 2c 20 26  de->h, lkType, &
215b0 66 29 3b 0a 20 20 20 20 72 63 20 3d 20 28 72 63  f);.    rc = (rc
215c0 21 3d 28 2d 31 29 29 20 3f 20 53 51 4c 49 54 45  !=(-1)) ? SQLITE
215d0 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 42 55 53  _OK : SQLITE_BUS
215e0 59 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74  Y;.    pFile->ct
215f0 72 6c 46 6c 61 67 73 20 26 3d 20 7e 55 4e 49 58  rlFlags &= ~UNIX
21600 46 49 4c 45 5f 42 4c 4f 43 4b 3b 0a 20 20 7d 0a  FILE_BLOCK;.  }.
21610 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
21620 20 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73 74 61   global lock sta
21630 74 65 20 61 6e 64 20 64 6f 20 64 65 62 75 67 20  te and do debug 
21640 74 72 61 63 69 6e 67 20 2a 2f 0a 23 69 66 64 65  tracing */.#ifde
21650 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
21660 20 7b 20 75 31 36 20 6d 61 73 6b 3b 0a 20 20 4f   { u16 mask;.  O
21670 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43  STRACE(("SHM-LOC
21680 4b 20 22 29 29 3b 0a 20 20 6d 61 73 6b 20 3d 20  K "));.  mask = 
21690 6f 66 73 74 3e 33 31 20 3f 20 30 78 66 66 66 66  ofst>31 ? 0xffff
216a0 20 3a 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29   : (1<<(ofst+n))
216b0 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20   - (1<<ofst);.  
216c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
216d0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63  K ){.    if( loc
216e0 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29  kType==F_UNLCK )
216f0 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
21700 28 22 75 6e 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c  ("unlock %d ok",
21710 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70   ofst));.      p
21720 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73  ShmNode->exclMas
21730 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
21740 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72    pShmNode->shar
21750 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  edMask &= ~mask;
21760 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  .    }else if( l
21770 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  ockType==F_RDLCK
21780 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   ){.      OSTRAC
21790 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 25 64  E(("read-lock %d
217a0 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20   ok", ofst));.  
217b0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78      pShmNode->ex
217c0 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  clMask &= ~mask;
217d0 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
217e0 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d  >sharedMask |= m
217f0 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ask;.    }else{.
21800 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f        assert( lo
21810 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20  ckType==F_WRLCK 
21820 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
21830 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64  (("write-lock %d
21840 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20   ok", ofst));.  
21850 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78      pShmNode->ex
21860 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  clMask |= mask;.
21870 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
21880 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d  sharedMask &= ~m
21890 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ask;.    }.  }el
218a0 73 65 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b  se{.    if( lock
218b0 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  Type==F_UNLCK ){
218c0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
218d0 22 75 6e 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65  "unlock %d faile
218e0 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20  d", ofst));.    
218f0 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79  }else if( lockTy
21900 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20  pe==F_RDLCK ){. 
21910 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 72       OSTRACE(("r
21920 65 61 64 2d 6c 6f 63 6b 20 66 61 69 6c 65 64 22  ead-lock failed"
21930 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
21940 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63       assert( loc
21950 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  kType==F_WRLCK )
21960 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
21970 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20  ("write-lock %d 
21980 66 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b  failed", ofst));
21990 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54  .    }.  }.  OST
219a0 52 41 43 45 28 28 22 20 2d 20 61 66 74 65 72 77  RACE((" - afterw
219b0 61 72 64 73 20 25 30 33 78 2c 25 30 33 78 5c 6e  ards %03x,%03x\n
219c0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 53  ",.           pS
219d0 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61  hmNode->sharedMa
219e0 73 6b 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78  sk, pShmNode->ex
219f0 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 7d 0a 23 65  clMask));.  }.#e
21a00 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
21a10 63 3b 20 20 20 20 20 20 20 20 0a 7d 0a 0a 2f 2a  c;        .}../*
21a20 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d  .** Return the m
21a30 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  inimum number of
21a40 20 33 32 4b 42 20 73 68 6d 20 72 65 67 69 6f 6e   32KB shm region
21a50 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  s that should be
21a60 20 6d 61 70 70 65 64 20 61 74 0a 2a 2a 20 61 20   mapped at.** a 
21a70 74 69 6d 65 2c 20 61 73 73 75 6d 69 6e 67 20 74  time, assuming t
21a80 68 61 74 20 65 61 63 68 20 6d 61 70 70 69 6e 67  hat each mapping
21a90 20 6d 75 73 74 20 62 65 20 61 6e 20 69 6e 74 65   must be an inte
21aa0 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20  ger multiple of 
21ab0 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 73  the.** current s
21ac0 79 73 74 65 6d 20 70 61 67 65 2d 73 69 7a 65 2e  ystem page-size.
21ad0 0a 2a 2a 0a 2a 2a 20 55 73 75 61 6c 6c 79 2c 20  .**.** Usually, 
21ae0 74 68 69 73 20 69 73 20 31 2e 20 54 68 65 20 65  this is 1. The e
21af0 78 63 65 70 74 69 6f 6e 20 73 65 65 6d 73 20 74  xception seems t
21b00 6f 20 62 65 20 73 79 73 74 65 6d 73 20 74 68 61  o be systems tha
21b10 74 20 61 72 65 20 63 6f 6e 66 69 67 75 72 65 64  t are configured
21b20 0a 2a 2a 20 74 6f 20 75 73 65 20 36 34 4b 42 20  .** to use 64KB 
21b30 70 61 67 65 73 20 2d 20 69 6e 20 74 68 69 73 20  pages - in this 
21b40 63 61 73 65 20 65 61 63 68 20 6d 61 70 70 69 6e  case each mappin
21b50 67 20 6d 75 73 74 20 63 6f 76 65 72 20 61 74 20  g must cover at 
21b60 6c 65 61 73 74 20 74 77 6f 0a 2a 2a 20 73 68 6d  least two.** shm
21b70 20 72 65 67 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61   regions..*/.sta
21b80 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 52  tic int unixShmR
21b90 65 67 69 6f 6e 50 65 72 4d 61 70 28 76 6f 69 64  egionPerMap(void
21ba0 29 7b 0a 20 20 69 6e 74 20 73 68 6d 73 7a 20 3d  ){.  int shmsz =
21bb0 20 33 32 2a 31 30 32 34 3b 20 20 20 20 20 20 20   32*1024;       
21bc0 20 20 20 20 20 2f 2a 20 53 48 4d 20 72 65 67 69       /* SHM regi
21bd0 6f 6e 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74  on size */.  int
21be0 20 70 67 73 7a 20 3d 20 6f 73 47 65 74 70 61 67   pgsz = osGetpag
21bf0 65 73 69 7a 65 28 29 3b 20 20 20 2f 2a 20 53 79  esize();   /* Sy
21c00 73 74 65 6d 20 70 61 67 65 20 73 69 7a 65 20 2a  stem page size *
21c10 2f 0a 20 20 61 73 73 65 72 74 28 20 28 28 70 67  /.  assert( ((pg
21c20 73 7a 2d 31 29 26 70 67 73 7a 29 3d 3d 30 20 29  sz-1)&pgsz)==0 )
21c30 3b 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65  ;   /* Page size
21c40 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72   must be a power
21c50 20 6f 66 20 32 20 2a 2f 0a 20 20 69 66 28 20 70   of 2 */.  if( p
21c60 67 73 7a 3c 73 68 6d 73 7a 20 29 20 72 65 74 75  gsz<shmsz ) retu
21c70 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70  rn 1;.  return p
21c80 67 73 7a 2f 73 68 6d 73 7a 3b 0a 7d 0a 0a 2f 2a  gsz/shmsz;.}../*
21c90 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 75 6e  .** Purge the un
21ca0 69 78 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69  ixShmNodeList li
21cb0 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65  st of all entrie
21cc0 73 20 77 69 74 68 20 75 6e 69 78 53 68 6d 4e 6f  s with unixShmNo
21cd0 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a  de.nRef==0..**.*
21ce0 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20  * This is not a 
21cf0 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  VFS shared-memor
21d00 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20  y method; it is 
21d10 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  a utility functi
21d20 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20  on called.** by 
21d30 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  VFS shared-memor
21d40 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74  y methods..*/.st
21d50 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68  atic void unixSh
21d60 6d 50 75 72 67 65 28 75 6e 69 78 46 69 6c 65 20  mPurge(unixFile 
21d70 2a 70 46 64 29 7b 0a 20 20 75 6e 69 78 53 68 6d  *pFd){.  unixShm
21d80 4e 6f 64 65 20 2a 70 20 3d 20 70 46 64 2d 3e 70  Node *p = pFd->p
21d90 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b  Inode->pShmNode;
21da0 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d  .  assert( unixM
21db0 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20  utexHeld() );.  
21dc0 69 66 28 20 70 20 26 26 20 70 2d 3e 6e 52 65 66  if( p && p->nRef
21dd0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ==0 ){.    int n
21de0 53 68 6d 50 65 72 4d 61 70 20 3d 20 75 6e 69 78  ShmPerMap = unix
21df0 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d 61 70 28  ShmRegionPerMap(
21e00 29 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  );.    int i;.  
21e10 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 49 6e    assert( p->pIn
21e20 6f 64 65 3d 3d 70 46 64 2d 3e 70 49 6e 6f 64 65  ode==pFd->pInode
21e30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
21e40 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75  mutex_free(p->mu
21e50 74 65 78 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  tex);.    for(i=
21e60 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b  0; i<p->nRegion;
21e70 20 69 2b 3d 6e 53 68 6d 50 65 72 4d 61 70 29 7b   i+=nShmPerMap){
21e80 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 68 3e  .      if( p->h>
21e90 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 73  =0 ){.        os
21ea0 4d 75 6e 6d 61 70 28 70 2d 3e 61 70 52 65 67 69  Munmap(p->apRegi
21eb0 6f 6e 5b 69 5d 2c 20 70 2d 3e 73 7a 52 65 67 69  on[i], p->szRegi
21ec0 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  on);.      }else
21ed0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
21ee0 33 5f 66 72 65 65 28 70 2d 3e 61 70 52 65 67 69  3_free(p->apRegi
21ef0 6f 6e 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  on[i]);.      }.
21f00 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
21f10 33 5f 66 72 65 65 28 70 2d 3e 61 70 52 65 67 69  3_free(p->apRegi
21f20 6f 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  on);.    if( p->
21f30 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 6f  h>=0 ){.      ro
21f40 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 64 2c 20  bust_close(pFd, 
21f50 70 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  p->h, __LINE__);
21f60 0a 20 20 20 20 20 20 70 2d 3e 68 20 3d 20 2d 31  .      p->h = -1
21f70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70  ;.    }.    p->p
21f80 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20  Inode->pShmNode 
21f90 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
21fa0 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a  _free(p);.  }.}.
21fb0 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 73 68  ./*.** Open a sh
21fc0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61  ared-memory area
21fd0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
21fe0 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
21ff0 69 6c 65 20 70 44 62 46 64 2e 20 20 0a 2a 2a 20  ile pDbFd.  .** 
22000 54 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20  This particular 
22010 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75  implementation u
22020 73 65 73 20 6d 6d 61 70 70 65 64 20 66 69 6c 65  ses mmapped file
22030 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6c  s..**.** The fil
22040 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
22050 65 6e 74 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ent shared-memor
22060 79 20 69 73 20 69 6e 20 74 68 65 20 73 61 6d 65  y is in the same
22070 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 61 73   directory.** as
22080 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
22090 73 65 20 66 69 6c 65 20 61 6e 64 20 68 61 73 20  se file and has 
220a0 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73  the same name as
220b0 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
220c0 73 65 0a 2a 2a 20 66 69 6c 65 20 77 69 74 68 20  se.** file with 
220d0 74 68 65 20 22 2d 73 68 6d 22 20 73 75 66 66 69  the "-shm" suffi
220e0 78 20 61 64 64 65 64 2e 20 20 46 6f 72 20 65 78  x added.  For ex
220f0 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 64 61  ample, if the da
22100 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69  tabase file.** i
22110 73 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63  s "/home/user1/c
22120 6f 6e 66 69 67 2e 64 62 22 20 74 68 65 6e 20 74  onfig.db" then t
22130 68 65 20 66 69 6c 65 20 74 68 61 74 20 69 73 20  he file that is 
22140 63 72 65 61 74 65 64 20 61 6e 64 20 6d 6d 61 70  created and mmap
22150 70 65 64 0a 2a 2a 20 66 6f 72 20 73 68 61 72 65  ped.** for share
22160 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65  d memory will be
22170 20 63 61 6c 6c 65 64 20 22 2f 68 6f 6d 65 2f 75   called "/home/u
22180 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62 2d 73  ser1/config.db-s
22190 68 6d 22 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f  hm".  .**.** Ano
221a0 74 68 65 72 20 61 70 70 72 6f 61 63 68 20 74 6f  ther approach to
221b0 20 69 73 20 74 6f 20 75 73 65 20 66 69 6c 65 73   is to use files
221c0 20 69 6e 20 2f 64 65 76 2f 73 68 6d 20 6f 72 20   in /dev/shm or 
221d0 2f 64 65 76 2f 74 6d 70 20 6f 72 20 61 6e 0a 2a  /dev/tmp or an.*
221e0 2a 20 73 6f 6d 65 20 6f 74 68 65 72 20 74 6d 70  * some other tmp
221f0 66 73 20 6d 6f 75 6e 74 2e 20 42 75 74 20 69 66  fs mount. But if
22200 20 61 20 66 69 6c 65 20 69 6e 20 61 20 64 69 66   a file in a dif
22210 66 65 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79  ferent directory
22220 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 61 74  .** from the dat
22230 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75 73  abase file is us
22240 65 64 2c 20 74 68 65 6e 20 64 69 66 66 65 72 69  ed, then differi
22250 6e 67 20 61 63 63 65 73 73 20 70 65 72 6d 69 73  ng access permis
22260 73 69 6f 6e 73 0a 2a 2a 20 6f 72 20 61 20 63 68  sions.** or a ch
22270 72 6f 6f 74 28 29 20 6d 69 67 68 74 20 63 61 75  root() might cau
22280 73 65 20 74 77 6f 20 64 69 66 66 65 72 65 6e 74  se two different
22290 20 70 72 6f 63 65 73 73 65 73 20 6f 6e 20 74 68   processes on th
222a0 65 20 73 61 6d 65 0a 2a 2a 20 64 61 74 61 62 61  e same.** databa
222b0 73 65 20 74 6f 20 65 6e 64 20 75 70 20 75 73 69  se to end up usi
222c0 6e 67 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c  ng different fil
222d0 65 73 20 66 6f 72 20 73 68 61 72 65 64 20 6d 65  es for shared me
222e0 6d 6f 72 79 20 2d 20 0a 2a 2a 20 6d 65 61 6e 69  mory - .** meani
222f0 6e 67 20 74 68 61 74 20 74 68 65 69 72 20 6d 65  ng that their me
22300 6d 6f 72 79 20 77 6f 75 6c 64 20 6e 6f 74 20 72  mory would not r
22310 65 61 6c 6c 79 20 62 65 20 73 68 61 72 65 64 20  eally be shared 
22320 2d 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 69  - resulting.** i
22330 6e 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  n database corru
22340 70 74 69 6f 6e 2e 20 20 4e 65 76 65 72 74 68 65  ption.  Neverthe
22350 6c 65 73 73 2c 20 74 68 69 73 20 74 6d 70 66 73  less, this tmpfs
22360 20 66 69 6c 65 20 75 73 61 67 65 0a 2a 2a 20 63   file usage.** c
22370 61 6e 20 62 65 20 65 6e 61 62 6c 65 64 20 61 74  an be enabled at
22380 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 75 73   compile-time us
22390 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 53 48 4d  ing -DSQLITE_SHM
223a0 5f 44 49 52 45 43 54 4f 52 59 3d 22 2f 64 65 76  _DIRECTORY="/dev
223b0 2f 73 68 6d 22 0a 2a 2a 20 6f 72 20 74 68 65 20  /shm".** or the 
223c0 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 54 68 65  equivalent.  The
223d0 20 75 73 65 20 6f 66 20 74 68 65 20 53 51 4c 49   use of the SQLI
223e0 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
223f0 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 2a 2a   compile-time.**
22400 20 6f 70 74 69 6f 6e 20 72 65 73 75 6c 74 73 20   option results 
22410 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  in an incompatib
22420 6c 65 20 62 75 69 6c 64 20 6f 66 20 53 51 4c 69  le build of SQLi
22430 74 65 3b 20 20 62 75 69 6c 64 73 20 6f 66 20 53  te;  builds of S
22440 51 4c 69 74 65 0a 2a 2a 20 74 68 61 74 20 77 69  QLite.** that wi
22450 74 68 20 64 69 66 66 65 72 69 6e 67 20 53 51 4c  th differing SQL
22460 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
22470 59 20 73 65 74 74 69 6e 67 73 20 61 74 74 65 6d  Y settings attem
22480 70 74 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a  pt to use the.**
22490 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66   same database f
224a0 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20  ile at the same 
224b0 74 69 6d 65 2c 20 64 61 74 61 62 61 73 65 20 63  time, database c
224c0 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 6c  orruption will l
224d0 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 2e  ikely.** result.
224e0 20 54 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f   The SQLITE_SHM_
224f0 44 49 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c  DIRECTORY compil
22500 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
22510 20 63 6f 6e 73 69 64 65 72 65 64 0a 2a 2a 20 22   considered.** "
22520 75 6e 73 75 70 70 6f 72 74 65 64 22 20 61 6e 64  unsupported" and
22530 20 6d 61 79 20 67 6f 20 61 77 61 79 20 69 6e 20   may go away in 
22540 61 20 66 75 74 75 72 65 20 53 51 4c 69 74 65 20  a future SQLite 
22550 72 65 6c 65 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 57  release..**.** W
22560 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65  hen opening a ne
22570 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  w shared-memory 
22580 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65  file, if no othe
22590 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  r instances of t
225a0 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20  hat.** file are 
225b0 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20  currently open, 
225c0 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
225d0 6f 72 20 69 6e 20 6f 74 68 65 72 20 70 72 6f 63  or in other proc
225e0 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74  esses, then.** t
225f0 68 65 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  he file must be 
22600 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
22610 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68 61 76 65  o length or have
22620 20 69 74 73 20 68 65 61 64 65 72 20 63 6c 65 61   its header clea
22630 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  red..**.** If th
22640 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
22650 61 73 65 20 66 69 6c 65 20 28 70 44 62 46 64 29  ase file (pDbFd)
22660 20 69 73 20 75 73 69 6e 67 20 74 68 65 20 22 75   is using the "u
22670 6e 69 78 2d 65 78 63 6c 22 20 56 46 53 0a 2a 2a  nix-excl" VFS.**
22680 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74   that means that
22690 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
226a0 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
226b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
226c0 61 6e 64 0a 2a 2a 20 74 68 61 74 20 6e 6f 20 6f  and.** that no o
226d0 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 61  ther processes a
226e0 72 65 20 61 62 6c 65 20 74 6f 20 72 65 61 64 20  re able to read 
226f0 6f 72 20 77 72 69 74 65 20 74 68 65 20 64 61 74  or write the dat
22700 61 62 61 73 65 2e 20 20 49 6e 0a 2a 2a 20 74 68  abase.  In.** th
22710 61 74 20 63 61 73 65 2c 20 77 65 20 64 6f 20 6e  at case, we do n
22720 6f 74 20 72 65 61 6c 6c 79 20 6e 65 65 64 20 73  ot really need s
22730 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 4e  hared memory.  N
22740 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 0a  o shared memory.
22750 2a 2a 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  ** file is creat
22760 65 64 2e 20 20 54 68 65 20 73 68 61 72 65 64 20  ed.  The shared 
22770 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 73  memory will be s
22780 69 6d 75 6c 61 74 65 64 20 77 69 74 68 20 68 65  imulated with he
22790 61 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  ap memory..*/.st
227a0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65  atic int unixOpe
227b0 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 75 6e  nSharedMemory(un
227c0 69 78 46 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a  ixFile *pDbFd){.
227d0 20 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d    struct unixShm
227e0 20 2a 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20   *p = 0;        
227f0 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74    /* The connect
22800 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 64  ion to be opened
22810 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69   */.  struct uni
22820 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
22830 64 65 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64  de;   /* The und
22840 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64 20  erlying mmapped 
22850 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  file */.  int rc
22860 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
22880 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e  ult code */.  un
22890 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
228a0 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ode;          /*
228b0 20 54 68 65 20 69 6e 6f 64 65 20 6f 66 20 66 64   The inode of fd
228c0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 68 6d   */.  char *zShm
228d0 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
228e0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
228f0 20 74 68 65 20 66 69 6c 65 20 75 73 65 64 20 66   the file used f
22900 6f 72 20 53 48 4d 20 2a 2f 0a 20 20 69 6e 74 20  or SHM */.  int 
22910 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20  nShmFilename;   
22920 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
22930 69 7a 65 20 6f 66 20 74 68 65 20 53 48 4d 20 66  ize of the SHM f
22940 69 6c 65 6e 61 6d 65 20 69 6e 20 62 79 74 65 73  ilename in bytes
22950 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   */..  /* Alloca
22960 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  te space for the
22970 20 6e 65 77 20 75 6e 69 78 53 68 6d 20 6f 62 6a   new unixShm obj
22980 65 63 74 2e 20 2a 2f 0a 20 20 70 20 3d 20 73 71  ect. */.  p = sq
22990 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20  lite3_malloc64( 
229a0 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20  sizeof(*p) );.  
229b0 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
229c0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
229d0 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
229e0 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 61 73  izeof(*p));.  as
229f0 73 65 72 74 28 20 70 44 62 46 64 2d 3e 70 53 68  sert( pDbFd->pSh
22a00 6d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  m==0 );..  /* Ch
22a10 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 20  eck to see if a 
22a20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
22a30 63 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ct already exist
22a40 73 2e 20 52 65 75 73 65 20 61 6e 20 65 78 69 73  s. Reuse an exis
22a50 74 69 6e 67 0a 20 20 2a 2a 20 6f 6e 65 20 69 66  ting.  ** one if
22a60 20 70 72 65 73 65 6e 74 2e 20 43 72 65 61 74 65   present. Create
22a70 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65   a new one if ne
22a80 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
22a90 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
22aa0 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 44 62  ;.  pInode = pDb
22ab0 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 70 53  Fd->pInode;.  pS
22ac0 68 6d 4e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d  hmNode = pInode-
22ad0 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 66 28  >pShmNode;.  if(
22ae0 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a   pShmNode==0 ){.
22af0 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
22b00 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20  sStat;          
22b10 20 20 20 20 20 20 20 2f 2a 20 66 73 74 61 74 28         /* fstat(
22b20 29 20 69 6e 66 6f 20 66 6f 72 20 64 61 74 61 62  ) info for datab
22b30 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23 69 66 6e  ase file */.#ifn
22b40 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  def SQLITE_SHM_D
22b50 49 52 45 43 54 4f 52 59 0a 20 20 20 20 63 6f 6e  IRECTORY.    con
22b60 73 74 20 63 68 61 72 20 2a 7a 42 61 73 65 50 61  st char *zBasePa
22b70 74 68 20 3d 20 70 44 62 46 64 2d 3e 7a 50 61 74  th = pDbFd->zPat
22b80 68 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f  h;.#endif..    /
22b90 2a 20 43 61 6c 6c 20 66 73 74 61 74 28 29 20 74  * Call fstat() t
22ba0 6f 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 65  o figure out the
22bb0 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20   permissions on 
22bc0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
22bd0 65 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 6e  e. If.    ** a n
22be0 65 77 20 2a 2d 73 68 6d 20 66 69 6c 65 20 69 73  ew *-shm file is
22bf0 20 63 72 65 61 74 65 64 2c 20 61 6e 20 61 74 74   created, an att
22c00 65 6d 70 74 20 77 69 6c 6c 20 62 65 20 6d 61 64  empt will be mad
22c10 65 20 74 6f 20 63 72 65 61 74 65 20 69 74 0a 20  e to create it. 
22c20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 73     ** with the s
22c30 61 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e  ame permissions.
22c40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
22c50 6f 73 46 73 74 61 74 28 70 44 62 46 64 2d 3e 68  osFstat(pDbFd->h
22c60 2c 20 26 73 53 74 61 74 29 20 26 26 20 70 49 6e  , &sStat) && pIn
22c70 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
22c80 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  k==0 ){.      rc
22c90 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
22ca0 46 53 54 41 54 3b 0a 20 20 20 20 20 20 67 6f 74  FSTAT;.      got
22cb0 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
22cc0 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
22cd0 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
22ce0 52 59 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e  RY.    nShmFilen
22cf0 61 6d 65 20 3d 20 73 69 7a 65 6f 66 28 53 51 4c  ame = sizeof(SQL
22d00 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
22d10 59 29 20 2b 20 33 31 3b 0a 23 65 6c 73 65 0a 20  Y) + 31;.#else. 
22d20 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20     nShmFilename 
22d30 3d 20 36 20 2b 20 28 69 6e 74 29 73 74 72 6c 65  = 6 + (int)strle
22d40 6e 28 7a 42 61 73 65 50 61 74 68 29 3b 0a 23 65  n(zBasePath);.#e
22d50 6e 64 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64  ndif.    pShmNod
22d60 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e = sqlite3_mall
22d70 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 53  oc64( sizeof(*pS
22d80 68 6d 4e 6f 64 65 29 20 2b 20 6e 53 68 6d 46 69  hmNode) + nShmFi
22d90 6c 65 6e 61 6d 65 20 29 3b 0a 20 20 20 20 69 66  lename );.    if
22da0 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b  ( pShmNode==0 ){
22db0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
22dc0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
22dd0 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
22de0 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  r;.    }.    mem
22df0 73 65 74 28 70 53 68 6d 4e 6f 64 65 2c 20 30 2c  set(pShmNode, 0,
22e00 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64   sizeof(*pShmNod
22e10 65 29 2b 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 29  e)+nShmFilename)
22e20 3b 0a 20 20 20 20 7a 53 68 6d 46 69 6c 65 6e 61  ;.    zShmFilena
22e30 6d 65 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a  me = pShmNode->z
22e40 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72  Filename = (char
22e50 2a 29 26 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a  *)&pShmNode[1];.
22e60 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48  #ifdef SQLITE_SH
22e70 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20  M_DIRECTORY.    
22e80 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
22e90 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a  (nShmFilename, z
22ea0 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20  ShmFilename, .  
22eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ec0 20 20 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49     SQLITE_SHM_DI
22ed0 52 45 43 54 4f 52 59 20 22 2f 73 71 6c 69 74 65  RECTORY "/sqlite
22ee0 2d 73 68 6d 2d 25 78 2d 25 78 22 2c 0a 20 20 20  -shm-%x-%x",.   
22ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f00 20 20 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f    (u32)sStat.st_
22f10 69 6e 6f 2c 20 28 75 33 32 29 73 53 74 61 74 2e  ino, (u32)sStat.
22f20 73 74 5f 64 65 76 29 3b 0a 23 65 6c 73 65 0a 20  st_dev);.#else. 
22f30 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
22f40 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65  ntf(nShmFilename
22f50 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20  , zShmFilename, 
22f60 22 25 73 2d 73 68 6d 22 2c 20 7a 42 61 73 65 50  "%s-shm", zBaseP
22f70 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ath);.    sqlite
22f80 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 44 62  3FileSuffix3(pDb
22f90 46 64 2d 3e 7a 50 61 74 68 2c 20 7a 53 68 6d 46  Fd->zPath, zShmF
22fa0 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66  ilename);.#endif
22fb0 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  .    pShmNode->h
22fc0 20 3d 20 2d 31 3b 0a 20 20 20 20 70 44 62 46 64   = -1;.    pDbFd
22fd0 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  ->pInode->pShmNo
22fe0 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 20  de = pShmNode;. 
22ff0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e     pShmNode->pIn
23000 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e  ode = pDbFd->pIn
23010 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64  ode;.    pShmNod
23020 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74  e->mutex = sqlit
23030 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
23040 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54  QLITE_MUTEX_FAST
23050 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e  );.    if( pShmN
23060 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b  ode->mutex==0 ){
23070 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
23080 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
23090 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
230a0 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  r;.    }..    if
230b0 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ( pInode->bProce
230c0 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  ssLock==0 ){.   
230d0 20 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73     int openFlags
230e0 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52   = O_RDWR | O_CR
230f0 45 41 54 3b 0a 20 20 20 20 20 20 69 66 28 20 73  EAT;.      if( s
23100 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65  qlite3_uri_boole
23110 61 6e 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c  an(pDbFd->zPath,
23120 20 22 72 65 61 64 6f 6e 6c 79 5f 73 68 6d 22 2c   "readonly_shm",
23130 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6f   0) ){.        o
23140 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 4f  penFlags = O_RDO
23150 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 70 53 68  NLY;.        pSh
23160 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c  mNode->isReadonl
23170 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  y = 1;.      }. 
23180 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68       pShmNode->h
23190 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a   = robust_open(z
231a0 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 6f 70 65  ShmFilename, ope
231b0 6e 46 6c 61 67 73 2c 20 28 73 53 74 61 74 2e 73  nFlags, (sStat.s
231c0 74 5f 6d 6f 64 65 26 30 37 37 37 29 29 3b 0a 20  t_mode&0777));. 
231d0 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64       if( pShmNod
231e0 65 2d 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20 20  e->h<0 ){.      
231f0 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
23200 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
23210 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22  PEN_BKPT, "open"
23220 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b  , zShmFilename);
23230 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68  .        goto sh
23240 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
23250 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
23260 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73   this process is
23270 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74   running as root
23280 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  , make sure that
23290 20 74 68 65 20 53 48 4d 20 66 69 6c 65 0a 20 20   the SHM file.  
232a0 20 20 20 20 2a 2a 20 69 73 20 6f 77 6e 65 64 20      ** is owned 
232b0 62 79 20 74 68 65 20 73 61 6d 65 20 75 73 65 72  by the same user
232c0 20 74 68 61 74 20 6f 77 6e 73 20 74 68 65 20 6f   that owns the o
232d0 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
232e0 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20  .  Otherwise,.  
232f0 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69      ** the origi
23300 6e 61 6c 20 6f 77 6e 65 72 20 77 69 6c 6c 20 6e  nal owner will n
23310 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 63 6f  ot be able to co
23320 6e 6e 65 63 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  nnect..      */.
23330 20 20 20 20 20 20 72 6f 62 75 73 74 46 63 68 6f        robustFcho
23340 77 6e 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  wn(pShmNode->h, 
23350 73 53 74 61 74 2e 73 74 5f 75 69 64 2c 20 73 53  sStat.st_uid, sS
23360 74 61 74 2e 73 74 5f 67 69 64 29 3b 0a 20 20 0a  tat.st_gid);.  .
23370 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
23380 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72  o see if another
23390 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64   process is hold
233a0 69 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e  ing the dead-man
233b0 20 73 77 69 74 63 68 2e 0a 20 20 20 20 20 20 2a   switch..      *
233c0 2a 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61  * If not, trunca
233d0 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a  te the file to z
233e0 65 72 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20  ero length. .   
233f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
23400 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
23410 20 20 69 66 28 20 75 6e 69 78 53 68 6d 53 79 73    if( unixShmSys
23420 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46  temLock(pDbFd, F
23430 5f 57 52 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d  _WRLCK, UNIX_SHM
23440 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45  _DMS, 1)==SQLITE
23450 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
23460 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63  f( robust_ftrunc
23470 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  ate(pShmNode->h,
23480 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   0) ){.         
23490 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
234a0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
234b0 53 48 4d 4f 50 45 4e 2c 20 22 66 74 72 75 6e 63  SHMOPEN, "ftrunc
234c0 61 74 65 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61  ate", zShmFilena
234d0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  me);.        }. 
234e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
234f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23500 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75  {.        rc = u
23510 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
23520 28 70 44 62 46 64 2c 20 46 5f 52 44 4c 43 4b 2c  (pDbFd, F_RDLCK,
23530 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31   UNIX_SHM_DMS, 1
23540 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
23550 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73   if( rc ) goto s
23560 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
23570 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b   }.  }..  /* Mak
23580 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63  e the new connec
23590 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20  tion a child of 
235a0 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  the unixShmNode 
235b0 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  */.  p->pShmNode
235c0 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66   = pShmNode;.#if
235d0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
235e0 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e  .  p->id = pShmN
235f0 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b  ode->nextShmId++
23600 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e  ;.#endif.  pShmN
23610 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70  ode->nRef++;.  p
23620 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a  DbFd->pShm = p;.
23630 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
23640 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65  ();..  /* The re
23650 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e  ference count on
23660 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c   pShmNode has al
23670 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
23680 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20 2a  mented under.  *
23690 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20 74  * the cover of t
236a0 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  he unixEnterMute
236b0 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68  x() mutex and th
236c0 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74  e pointer from t
236d0 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72  he.  ** new (str
236e0 75 63 74 20 75 6e 69 78 53 68 6d 29 20 6f 62 6a  uct unixShm) obj
236f0 65 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d 4e  ect to the pShmN
23700 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73 65 74  ode has been set
23710 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20 20  . All that is.  
23720 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69 73  ** left to do is
23730 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77   to link the new
23740 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68 65   object into the
23750 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61   linked list sta
23760 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53  rting.  ** at pS
23770 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20  hmNode->pFirst. 
23780 54 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e  This must be don
23790 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20  e while holding 
237a0 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  the pShmNode->mu
237b0 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e  tex .  ** mutex.
237c0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  .  */.  sqlite3_
237d0 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
237e0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
237f0 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e  p->pNext = pShmN
23800 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70  ode->pFirst;.  p
23810 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20  ShmNode->pFirst 
23820 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = p;.  sqlite3_m
23830 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
23840 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  ode->mutex);.  r
23850 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
23860 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
23870 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f   on any error */
23880 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20  .shm_open_err:. 
23890 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44   unixShmPurge(pD
238a0 62 46 64 29 3b 20 20 20 20 20 20 20 2f 2a 20 54  bFd);       /* T
238b0 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70  his call frees p
238c0 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69  ShmNode if requi
238d0 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  red */.  sqlite3
238e0 5f 66 72 65 65 28 70 29 3b 0a 20 20 75 6e 69 78  _free(p);.  unix
238f0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
23900 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
23910 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
23920 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  n is called to o
23930 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20  btain a pointer 
23940 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 69 6f  to region iRegio
23950 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 68 61  n of the .** sha
23960 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63  red-memory assoc
23970 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 64  iated with the d
23980 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 64 2e  atabase file fd.
23990 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   Shared-memory r
239a0 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e  egions .** are n
239b0 75 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67  umbered starting
239c0 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68   from zero. Each
239d0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
239e0 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f  egion is szRegio
239f0 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73  n .** bytes in s
23a00 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ize..**.** If an
23a10 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
23a20 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
23a30 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
23a40 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
23a50 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
23a60 2c 20 69 66 20 74 68 65 20 62 45 78 74 65 6e 64  , if the bExtend
23a70 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 20   parameter is 0 
23a80 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65  and the requeste
23a90 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a  d shared-memory.
23aa0 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f  ** region has no
23ab0 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
23ac0 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c   (by any client,
23ad0 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72   including one r
23ae0 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73  unning in a.** s
23af0 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 29  eparate process)
23b00 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73 65  , then *pp is se
23b10 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51  t to NULL and SQ
23b20 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
23b30 2e 20 49 66 20 0a 2a 2a 20 62 45 78 74 65 6e 64  . If .** bExtend
23b40 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64   is non-zero and
23b50 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
23b60 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
23b70 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ion has not yet 
23b80 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  .** been allocat
23b90 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63 61  ed, it is alloca
23ba0 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
23bb0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tion..**.** If t
23bc0 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  he shared-memory
23bd0 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72 65   region has alre
23be0 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
23bf0 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74  ed or is allocat
23c00 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63 61  ed by.** this ca
23c10 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65 64 20  ll as described 
23c20 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20 69  above, then it i
23c30 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68  s mapped into th
23c40 69 73 20 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a  is processes .**
23c50 20 61 64 64 72 65 73 73 20 73 70 61 63 65 20 28   address space (
23c60 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
23c70 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73 65  eady), *pp is se
23c80 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
23c90 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d  e mapped .** mem
23ca0 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ory and SQLITE_O
23cb0 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  K returned..*/.s
23cc0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
23cd0 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f  mMap(.  sqlite3_
23ce0 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
23cf0 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
23d00 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62 61  e open on databa
23d10 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
23d20 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20   iRegion,       
23d30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23d40 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72 69 65  Region to retrie
23d50 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65  ve */.  int szRe
23d60 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  gion,           
23d70 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
23d80 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20  of regions */.  
23d90 69 6e 74 20 62 45 78 74 65 6e 64 2c 20 20 20 20  int bExtend,    
23da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23db0 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74 65 6e  /* True to exten
23dc0 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65 73 73  d file if necess
23dd0 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f  ary */.  void vo
23de0 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20 20 20  latile **pp     
23df0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
23e00 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a   Mapped memory *
23e10 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  /.){.  unixFile 
23e20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69  *pDbFd = (unixFi
23e30 6c 65 2a 29 66 64 3b 0a 20 20 75 6e 69 78 53 68  le*)fd;.  unixSh
23e40 6d 20 2a 70 3b 0a 20 20 75 6e 69 78 53 68 6d 4e  m *p;.  unixShmN
23e50 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode *pShmNode;. 
23e60 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
23e70 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 53 68 6d 50  _OK;.  int nShmP
23e80 65 72 4d 61 70 20 3d 20 75 6e 69 78 53 68 6d 52  erMap = unixShmR
23e90 65 67 69 6f 6e 50 65 72 4d 61 70 28 29 3b 0a 20  egionPerMap();. 
23ea0 20 69 6e 74 20 6e 52 65 71 52 65 67 69 6f 6e 3b   int nReqRegion;
23eb0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 68  ..  /* If the sh
23ec0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
23ed0 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
23ee0 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69  n opened, open i
23ef0 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69 66 28 20  t now. */.  if( 
23f00 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29  pDbFd->pShm==0 )
23f10 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4f  {.    rc = unixO
23f20 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28  penSharedMemory(
23f30 70 44 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20  pDbFd);.    if( 
23f40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
23f50 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
23f60 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68    p = pDbFd->pSh
23f70 6d 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  m;.  pShmNode = 
23f80 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 73  p->pShmNode;.  s
23f90 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
23fa0 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
23fb0 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ex);.  assert( s
23fc0 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64  zRegion==pShmNod
23fd0 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70  e->szRegion || p
23fe0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
23ff0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
24000 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
24010 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
24020 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
24030 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20  hmNode->h>=0 || 
24040 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pDbFd->pInode->b
24050 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29  ProcessLock==1 )
24060 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
24070 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62  Node->h<0 || pDb
24080 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  Fd->pInode->bPro
24090 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a  cessLock==0 );..
240a0 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6e 75 6d    /* Minimum num
240b0 62 65 72 20 6f 66 20 72 65 67 69 6f 6e 73 20 72  ber of regions r
240c0 65 71 75 69 72 65 64 20 74 6f 20 62 65 20 6d 61  equired to be ma
240d0 70 70 65 64 2e 20 2a 2f 0a 20 20 6e 52 65 71 52  pped. */.  nReqR
240e0 65 67 69 6f 6e 20 3d 20 28 28 69 52 65 67 69 6f  egion = ((iRegio
240f0 6e 2b 6e 53 68 6d 50 65 72 4d 61 70 29 20 2f 20  n+nShmPerMap) / 
24100 6e 53 68 6d 50 65 72 4d 61 70 29 20 2a 20 6e 53  nShmPerMap) * nS
24110 68 6d 50 65 72 4d 61 70 3b 0a 0a 20 20 69 66 28  hmPerMap;..  if(
24120 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
24130 6f 6e 3c 6e 52 65 71 52 65 67 69 6f 6e 20 29 7b  on<nReqRegion ){
24140 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 70 4e 65  .    char **apNe
24150 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
24160 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 61          /* New a
24170 70 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20  pRegion[] array 
24180 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  */.    int nByte
24190 20 3d 20 6e 52 65 71 52 65 67 69 6f 6e 2a 73 7a   = nReqRegion*sz
241a0 52 65 67 69 6f 6e 3b 20 20 20 2f 2a 20 4d 69 6e  Region;   /* Min
241b0 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66 69  imum required fi
241c0 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73  le size */.    s
241d0 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74  truct stat sStat
241e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
241f0 20 20 2f 2a 20 55 73 65 64 20 62 79 20 66 73 74    /* Used by fst
24200 61 74 28 29 20 2a 2f 0a 0a 20 20 20 20 70 53 68  at() */..    pSh
24210 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20  mNode->szRegion 
24220 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20  = szRegion;..   
24230 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68   if( pShmNode->h
24240 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  >=0 ){.      /* 
24250 54 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65  The requested re
24260 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70  gion is not mapp
24270 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f  ed into this pro
24280 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73  cesses address s
24290 70 61 63 65 2e 0a 20 20 20 20 20 20 2a 2a 20 43  pace..      ** C
242a0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
242b0 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  t has been alloc
242c0 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20 74 68  ated (i.e. if th
242d0 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65  e wal-index file
242e0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6c 61 72   is.      ** lar
242f0 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e  ge enough to con
24300 74 61 69 6e 20 74 68 65 20 72 65 71 75 65 73 74  tain the request
24310 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20  ed region)..    
24320 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6f    */.      if( o
24330 73 46 73 74 61 74 28 70 53 68 6d 4e 6f 64 65 2d  sFstat(pShmNode-
24340 3e 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20  >h, &sStat) ){. 
24350 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
24360 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
24370 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
24380 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
24390 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 69 66 28    }.  .      if(
243a0 20 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 3c 6e   sStat.st_size<n
243b0 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Byte ){.        
243c0 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
243d0 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64   memory region d
243e0 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 49  oes not exist. I
243f0 66 20 62 45 78 74 65 6e 64 20 69 73 20 73 65 74  f bExtend is set
24400 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 66   to.        ** f
24410 61 6c 73 65 2c 20 65 78 69 74 20 65 61 72 6c 79  alse, exit early
24420 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20 73 65  . *pp will be se
24430 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51  t to NULL and SQ
24440 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
24450 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
24460 20 20 20 20 20 69 66 28 20 21 62 45 78 74 65 6e       if( !bExten
24470 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  d ){.          g
24480 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
24490 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
244a0 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69      /* Alternati
244b0 76 65 6c 79 2c 20 69 66 20 62 45 78 74 65 6e 64  vely, if bExtend
244c0 20 69 73 20 74 72 75 65 2c 20 65 78 74 65 6e 64   is true, extend
244d0 20 74 68 65 20 66 69 6c 65 2e 20 44 6f 20 74 68   the file. Do th
244e0 69 73 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a  is by.        **
244f0 20 77 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c   writing a singl
24500 65 20 62 79 74 65 20 74 6f 20 74 68 65 20 65 6e  e byte to the en
24510 64 20 6f 66 20 65 61 63 68 20 28 4f 53 29 20 70  d of each (OS) p
24520 61 67 65 20 62 65 69 6e 67 0a 20 20 20 20 20 20  age being.      
24530 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 6f    ** allocated o
24540 72 20 65 78 74 65 6e 64 65 64 2e 20 54 65 63 68  r extended. Tech
24550 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6e 65 65 64  nically, we need
24560 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 6f 20 74   only write to t
24570 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 61  he.        ** la
24580 73 74 20 70 61 67 65 20 69 6e 20 6f 72 64 65 72  st page in order
24590 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20 66   to extend the f
245a0 69 6c 65 2e 20 42 75 74 20 77 72 69 74 69 6e 67  ile. But writing
245b0 20 74 6f 20 61 6c 6c 20 6e 65 77 0a 20 20 20 20   to all new.    
245c0 20 20 20 20 2a 2a 20 70 61 67 65 73 20 66 6f 72      ** pages for
245d0 63 65 73 20 74 68 65 20 4f 53 20 74 6f 20 61 6c  ces the OS to al
245e0 6c 6f 63 61 74 65 20 74 68 65 6d 20 69 6d 6d 65  locate them imme
245f0 64 69 61 74 65 6c 79 2c 20 77 68 69 63 68 20 72  diately, which r
24600 65 64 75 63 65 73 0a 20 20 20 20 20 20 20 20 2a  educes.        *
24610 2a 20 74 68 65 20 63 68 61 6e 63 65 73 20 6f 66  * the chances of
24620 20 53 49 47 42 55 53 20 77 68 69 6c 65 20 61 63   SIGBUS while ac
24630 63 65 73 73 69 6e 67 20 74 68 65 20 6d 61 70 70  cessing the mapp
24640 65 64 20 72 65 67 69 6f 6e 20 6c 61 74 65 72 20  ed region later 
24650 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  on..        */. 
24660 20 20 20 20 20 20 20 65 6c 73 65 7b 0a 20 20 20         else{.   
24670 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f         static co
24680 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 34  nst int pgsz = 4
24690 30 39 36 3b 0a 20 20 20 20 20 20 20 20 20 20 69  096;.          i
246a0 6e 74 20 69 50 67 3b 0a 0a 20 20 20 20 20 20 20  nt iPg;..       
246b0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74     /* Write to t
246c0 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66 20  he last byte of 
246d0 65 61 63 68 20 6e 65 77 6c 79 20 61 6c 6c 6f 63  each newly alloc
246e0 61 74 65 64 20 6f 72 20 65 78 74 65 6e 64 65 64  ated or extended
246f0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
24700 20 20 20 61 73 73 65 72 74 28 20 28 6e 42 79 74     assert( (nByt
24710 65 20 25 20 70 67 73 7a 29 3d 3d 30 20 29 3b 0a  e % pgsz)==0 );.
24720 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 50            for(iP
24730 67 3d 28 73 53 74 61 74 2e 73 74 5f 73 69 7a 65  g=(sStat.st_size
24740 2f 70 67 73 7a 29 3b 20 69 50 67 3c 28 6e 42 79  /pgsz); iPg<(nBy
24750 74 65 2f 70 67 73 7a 29 3b 20 69 50 67 2b 2b 29  te/pgsz); iPg++)
24760 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
24770 28 20 73 65 65 6b 41 6e 64 57 72 69 74 65 46 64  ( seekAndWriteFd
24780 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 69 50  (pShmNode->h, iP
24790 67 2a 70 67 73 7a 20 2b 20 70 67 73 7a 2d 31 2c  g*pgsz + pgsz-1,
247a0 20 22 22 2c 20 31 2c 20 30 29 21 3d 31 20 29 7b   "", 1, 0)!=1 ){
247b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
247c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
247d0 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69   = pShmNode->zFi
247e0 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  lename;.        
247f0 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c        rc = unixL
24800 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
24810 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 22 77  OERR_SHMSIZE, "w
24820 72 69 74 65 22 2c 20 7a 46 69 6c 65 29 3b 0a 20  rite", zFile);. 
24830 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74               got
24840 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
24850 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
24860 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
24870 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
24880 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65  ..    /* Map the
24890 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72   requested memor
248a0 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68  y region into th
248b0 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64  is processes add
248c0 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20  ress space. */. 
248d0 20 20 20 61 70 4e 65 77 20 3d 20 28 63 68 61 72     apNew = (char
248e0 20 2a 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c   **)sqlite3_real
248f0 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70 53 68  loc(.        pSh
24900 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 2c  mNode->apRegion,
24910 20 6e 52 65 71 52 65 67 69 6f 6e 2a 73 69 7a 65   nReqRegion*size
24920 6f 66 28 63 68 61 72 20 2a 29 0a 20 20 20 20 29  of(char *).    )
24930 3b 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65 77  ;.    if( !apNew
24940 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
24950 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
24960 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  M;.      goto sh
24970 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  mpage_out;.    }
24980 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61  .    pShmNode->a
24990 70 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b  pRegion = apNew;
249a0 0a 20 20 20 20 77 68 69 6c 65 28 20 70 53 68 6d  .    while( pShm
249b0 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 6e 52  Node->nRegion<nR
249c0 65 71 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  eqRegion ){.    
249d0 20 20 69 6e 74 20 6e 4d 61 70 20 3d 20 73 7a 52    int nMap = szR
249e0 65 67 69 6f 6e 2a 6e 53 68 6d 50 65 72 4d 61 70  egion*nShmPerMap
249f0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
24a00 20 20 20 20 20 76 6f 69 64 20 2a 70 4d 65 6d 3b       void *pMem;
24a10 0a 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e  .      if( pShmN
24a20 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20  ode->h>=0 ){.   
24a30 20 20 20 20 20 70 4d 65 6d 20 3d 20 6f 73 4d 6d       pMem = osMm
24a40 61 70 28 30 2c 20 6e 4d 61 70 2c 0a 20 20 20 20  ap(0, nMap,.    
24a50 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
24a60 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3f 20 50  ->isReadonly ? P
24a70 52 4f 54 5f 52 45 41 44 20 3a 20 50 52 4f 54 5f  ROT_READ : PROT_
24a80 52 45 41 44 7c 50 52 4f 54 5f 57 52 49 54 45 2c  READ|PROT_WRITE,
24a90 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 4d 41   .            MA
24aa0 50 5f 53 48 41 52 45 44 2c 20 70 53 68 6d 4e 6f  P_SHARED, pShmNo
24ab0 64 65 2d 3e 68 2c 20 73 7a 52 65 67 69 6f 6e 2a  de->h, szRegion*
24ac0 28 69 36 34 29 70 53 68 6d 4e 6f 64 65 2d 3e 6e  (i64)pShmNode->n
24ad0 52 65 67 69 6f 6e 0a 20 20 20 20 20 20 20 20 29  Region.        )
24ae0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d  ;.        if( pM
24af0 65 6d 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29  em==MAP_FAILED )
24b00 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
24b10 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
24b20 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41  LITE_IOERR_SHMMA
24b30 50 2c 20 22 6d 6d 61 70 22 2c 20 70 53 68 6d 4e  P, "mmap", pShmN
24b40 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b  ode->zFilename);
24b50 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
24b60 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
24b70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
24b80 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  se{.        pMem
24b90 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
24ba0 63 36 34 28 73 7a 52 65 67 69 6f 6e 29 3b 0a 20  c64(szRegion);. 
24bb0 20 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 3d         if( pMem=
24bc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
24bd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
24be0 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  M;.          got
24bf0 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
24c00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
24c10 20 6d 65 6d 73 65 74 28 70 4d 65 6d 2c 20 30 2c   memset(pMem, 0,
24c20 20 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20   szRegion);.    
24c30 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28 69    }..      for(i
24c40 3d 30 3b 20 69 3c 6e 53 68 6d 50 65 72 4d 61 70  =0; i<nShmPerMap
24c50 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
24c60 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69  pShmNode->apRegi
24c70 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  on[pShmNode->nRe
24c80 67 69 6f 6e 2b 69 5d 20 3d 20 26 28 28 63 68 61  gion+i] = &((cha
24c90 72 2a 29 70 4d 65 6d 29 5b 73 7a 52 65 67 69 6f  r*)pMem)[szRegio
24ca0 6e 2a 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n*i];.      }.  
24cb0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52      pShmNode->nR
24cc0 65 67 69 6f 6e 20 2b 3d 20 6e 53 68 6d 50 65 72  egion += nShmPer
24cd0 4d 61 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Map;.    }.  }..
24ce0 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69  shmpage_out:.  i
24cf0 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  f( pShmNode->nRe
24d00 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a  gion>iRegion ){.
24d10 20 20 20 20 2a 70 70 20 3d 20 70 53 68 6d 4e 6f      *pp = pShmNo
24d20 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 52 65  de->apRegion[iRe
24d30 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gion];.  }else{.
24d40 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d      *pp = 0;.  }
24d50 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
24d60 3e 69 73 52 65 61 64 6f 6e 6c 79 20 26 26 20 72  >isReadonly && r
24d70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c==SQLITE_OK ) r
24d80 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
24d90 4e 4c 59 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  NLY;.  sqlite3_m
24da0 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
24db0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  ode->mutex);.  r
24dc0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
24dd0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 6f  ** Change the lo
24de0 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61 20 73  ck state for a s
24df0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67  hared-memory seg
24e00 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ment..**.** Note
24e10 20 74 68 61 74 20 74 68 65 20 72 65 6c 61 74 69   that the relati
24e20 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20 53  onship between S
24e30 48 41 52 45 64 20 61 6e 64 20 45 58 43 4c 55 53  HAREd and EXCLUS
24e40 49 56 45 20 6c 6f 63 6b 73 20 69 73 20 61 20 6c  IVE locks is a l
24e50 69 74 74 6c 65 0a 2a 2a 20 64 69 66 66 65 72 65  ittle.** differe
24e60 6e 74 20 68 65 72 65 20 74 68 61 6e 20 69 6e 20  nt here than in 
24e70 70 6f 73 69 78 2e 20 20 49 6e 20 78 53 68 6d 4c  posix.  In xShmL
24e80 6f 63 6b 28 29 2c 20 6f 6e 65 20 63 61 6e 20 67  ock(), one can g
24e90 6f 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 0a  o from unlocked.
24ea0 2a 2a 20 74 6f 20 73 68 61 72 65 64 20 61 6e 64  ** to shared and
24eb0 20 62 61 63 6b 20 6f 72 20 66 72 6f 6d 20 75 6e   back or from un
24ec0 6c 6f 63 6b 65 64 20 74 6f 20 65 78 63 6c 75 73  locked to exclus
24ed0 69 76 65 20 61 6e 64 20 62 61 63 6b 2e 20 20 42  ive and back.  B
24ee0 75 74 20 6f 6e 65 20 6d 61 79 0a 2a 2a 20 6e 6f  ut one may.** no
24ef0 74 20 67 6f 20 66 72 6f 6d 20 73 68 61 72 65 64  t go from shared
24f00 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 6f 72   to exclusive or
24f10 20 66 72 6f 6d 20 65 78 63 6c 75 73 69 76 65 20   from exclusive 
24f20 74 6f 20 73 68 61 72 65 64 2e 0a 2a 2f 0a 73 74  to shared..*/.st
24f30 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d  atic int unixShm
24f40 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f  Lock(.  sqlite3_
24f50 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
24f60 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66     /* Database f
24f70 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ile holding the 
24f80 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
24f90 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20  .  int ofst,    
24fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24fb0 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61   First lock to a
24fc0 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73  cquire or releas
24fd0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20  e */.  int n,   
24fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ff0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
25000 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65 20  ocks to acquire 
25010 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  or release */.  
25020 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
25030 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68             /* Wh
25040 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68  at to do with th
25050 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75  e lock */.){.  u
25060 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d  nixFile *pDbFd =
25070 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 20   (unixFile*)fd; 
25080 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
25090 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65  on holding share
250a0 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 75 6e  d memory */.  un
250b0 69 78 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64  ixShm *p = pDbFd
250c0 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20  ->pShm;         
250d0 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65      /* The share
250e0 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c  d memory being l
250f0 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53  ocked */.  unixS
25100 68 6d 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20  hm *pX;         
25110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25120 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
25130 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67  over all sibling
25140 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f  s */.  unixShmNo
25150 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70  de *pShmNode = p
25160 2d 3e 70 53 68 6d 4e 6f 64 65 3b 20 20 2f 2a 20  ->pShmNode;  /* 
25170 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 66  The underlying f
25180 69 6c 65 20 69 4e 6f 64 65 20 2a 2f 0a 20 20 69  ile iNode */.  i
25190 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
251a0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
251b0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
251c0 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73  ode */.  u16 mas
251d0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
251e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
251f0 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20  * Mask of locks 
25200 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c 65 61  to take or relea
25210 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  se */..  assert(
25220 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64   pShmNode==pDbFd
25230 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  ->pInode->pShmNo
25240 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  de );.  assert( 
25250 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65  pShmNode->pInode
25260 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20  ==pDbFd->pInode 
25270 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73  );.  assert( ofs
25280 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d  t>=0 && ofst+n<=
25290 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
252a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e   );.  assert( n>
252b0 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
252c0 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
252d0 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  HM_LOCK | SQLITE
252e0 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20  _SHM_SHARED).   
252f0 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
25300 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c  QLITE_SHM_LOCK |
25310 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c   SQLITE_SHM_EXCL
25320 55 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c  USIVE).       ||
25330 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
25340 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c  SHM_UNLOCK | SQL
25350 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a  ITE_SHM_SHARED).
25360 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d         || flags=
25370 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  =(SQLITE_SHM_UNL
25380 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
25390 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20  _EXCLUSIVE) );. 
253a0 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c   assert( n==1 ||
253b0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
253c0 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21  _SHM_EXCLUSIVE)!
253d0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
253e0 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c  pShmNode->h>=0 |
253f0 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d  | pDbFd->pInode-
25400 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31  >bProcessLock==1
25410 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
25420 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70  hmNode->h<0 || p
25430 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50  DbFd->pInode->bP
25440 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b  rocessLock==0 );
25450 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 28  ..  mask = (1<<(
25460 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f  ofst+n)) - (1<<o
25470 66 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20  fst);.  assert( 
25480 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c  n>1 || mask==(1<
25490 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71 6c 69  <ofst) );.  sqli
254a0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
254b0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
254c0 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ;.  if( flags & 
254d0 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
254e0 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c  K ){.    u16 all
254f0 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73  Mask = 0; /* Mas
25500 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20  k of locks held 
25510 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a  by siblings */..
25520 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20 61 6e      /* See if an
25530 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20  y siblings hold 
25540 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a  this same lock *
25550 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
25560 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
25570 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
25580 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d  {.      if( pX==
25590 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  p ) continue;.  
255a0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 58 2d      assert( (pX-
255b0 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e  >exclMask & (p->
255c0 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72  exclMask|p->shar
255d0 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20  edMask))==0 );. 
255e0 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20       allMask |= 
255f0 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a  pX->sharedMask;.
25600 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e      }..    /* Un
25610 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d  lock the system-
25620 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20  level locks */. 
25630 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20 61     if( (mask & a
25640 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  llMask)==0 ){.  
25650 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d      rc = unixShm
25660 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64  SystemLock(pDbFd
25670 2c 20 46 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b  , F_UNLCK, ofst+
25680 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  UNIX_SHM_BASE, n
25690 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
256a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
256b0 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OK;.    }..    /
256c0 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c  * Undo the local
256d0 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66   locks */.    if
256e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
256f0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 63 6c  ){.      p->excl
25700 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
25710 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61       p->sharedMa
25720 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
25730 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   } .  }else if( 
25740 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
25750 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20  HM_SHARED ){.   
25760 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64 20 3d   u16 allShared =
25770 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66   0;  /* Union of
25780 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63   locks held by c
25790 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72  onnections other
257a0 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20   than "p" */..  
257b0 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68    /* Find out wh
257c0 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  ich shared locks
257d0 20 61 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c   are already hel
257e0 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e  d by sibling con
257f0 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a  nections..    **
25800 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20   If any sibling 
25810 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e  already holds an
25820 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c   exclusive lock,
25830 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65   go ahead and re
25840 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49  turn.    ** SQLI
25850 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a  TE_BUSY..    */.
25860 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e      for(pX=pShmN
25870 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b  ode->pFirst; pX;
25880 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
25890 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65        if( (pX->e
258a0 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21  xclMask & mask)!
258b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
258c0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
258d0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
258e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c       }.      all
258f0 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68  Shared |= pX->sh
25900 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a  aredMask;.    }.
25910 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68 61 72  .    /* Get shar
25920 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20  ed locks at the 
25930 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66  system level, if
25940 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20   necessary */.  
25950 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
25960 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
25970 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20 6d 61   (allShared & ma
25980 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
25990 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79    rc = unixShmSy
259a0 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20  stemLock(pDbFd, 
259b0 46 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e  F_RDLCK, ofst+UN
259c0 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b  IX_SHM_BASE, n);
259d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
259e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
259f0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
25a00 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
25a10 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72 65 64  the local shared
25a20 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66   locks */.    if
25a30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25a40 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  ){.      p->shar
25a50 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  edMask |= mask;.
25a60 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
25a70 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
25a80 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65  no sibling conne
25a90 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b  ctions hold lock
25aa0 73 20 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63  s that will bloc
25ab0 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f  k this.    ** lo
25ac0 63 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c 20  ck.  If any do, 
25ad0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
25ae0 53 59 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20  SY right away.. 
25af0 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58     */.    for(pX
25b00 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  =pShmNode->pFirs
25b10 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e  t; pX; pX=pX->pN
25b20 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
25b30 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20  (pX->exclMask & 
25b40 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d  mask)!=0 || (pX-
25b50 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61  >sharedMask & ma
25b60 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)!=0 ){.      
25b70 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
25b80 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  SY;.        brea
25b90 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
25ba0 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 74  .  .    /* Get t
25bb0 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  he exclusive loc
25bc0 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d  ks at the system
25bd0 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20 69 66   level.  Then if
25be0 20 73 75 63 63 65 73 73 66 75 6c 0a 20 20 20 20   successful.    
25bf0 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65  ** also mark the
25c00 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f   local connectio
25c10 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65  n as being locke
25c20 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
25c30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25c40 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e  ){.      rc = un
25c50 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
25c60 70 44 62 46 64 2c 20 46 5f 57 52 4c 43 4b 2c 20  pDbFd, F_WRLCK, 
25c70 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41  ofst+UNIX_SHM_BA
25c80 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66  SE, n);.      if
25c90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25ca0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
25cb0 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d 61 73  t( (p->sharedMas
25cc0 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a  k & mask)==0 );.
25cd0 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d          p->exclM
25ce0 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
25cf0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
25d00 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
25d10 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
25d20 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45  utex);.  OSTRACE
25d30 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69  (("SHM-LOCK shmi
25d40 64 2d 25 64 2c 20 70 69 64 2d 25 64 20 67 6f 74  d-%d, pid-%d got
25d50 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20   %03x,%03x\n",. 
25d60 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 64 2c            p->id,
25d70 20 6f 73 47 65 74 70 69 64 28 30 29 2c 20 70 2d   osGetpid(0), p-
25d80 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e  >sharedMask, p->
25d90 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 72 65  exclMask));.  re
25da0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
25db0 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65  * Implement a me
25dc0 6d 6f 72 79 20 62 61 72 72 69 65 72 20 6f 72 20  mory barrier or 
25dd0 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20  memory fence on 
25de0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20  shared memory.  
25df0 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73  .**.** All loads
25e00 20 61 6e 64 20 73 74 6f 72 65 73 20 62 65 67 75   and stores begu
25e10 6e 20 62 65 66 6f 72 65 20 74 68 65 20 62 61 72  n before the bar
25e20 72 69 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65  rier must comple
25e30 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79  te before.** any
25e40 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65 20 62   load or store b
25e50 65 67 75 6e 20 61 66 74 65 72 20 74 68 65 20 62  egun after the b
25e60 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  arrier..*/.stati
25e70 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 42 61  c void unixShmBa
25e80 72 72 69 65 72 28 0a 20 20 73 71 6c 69 74 65 33  rrier(.  sqlite3
25e90 5f 66 69 6c 65 20 2a 66 64 20 20 20 20 20 20 20  _file *fd       
25ea0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
25eb0 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e  base file holdin
25ec0 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  g the shared mem
25ed0 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53  ory */.){.  UNUS
25ee0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29  ED_PARAMETER(fd)
25ef0 3b 0a 20 20 73 71 6c 69 74 65 33 4d 65 6d 6f 72  ;.  sqlite3Memor
25f00 79 42 61 72 72 69 65 72 28 29 3b 20 20 20 20 20  yBarrier();     
25f10 20 20 20 20 2f 2a 20 63 6f 6d 70 69 6c 65 72 2d      /* compiler-
25f20 64 65 66 69 6e 65 64 20 6d 65 6d 6f 72 79 20 62  defined memory b
25f30 61 72 72 69 65 72 20 2a 2f 0a 20 20 75 6e 69 78  arrier */.  unix
25f40 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 20 20  EnterMutex();   
25f50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
25f60 6c 73 6f 20 6d 75 74 65 78 2c 20 66 6f 72 20 72  lso mutex, for r
25f70 65 64 75 6e 64 61 6e 63 79 20 2a 2f 0a 20 20 75  edundancy */.  u
25f80 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
25f90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
25fa0 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  a connection to 
25fb0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20  shared-memory.  
25fc0 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72  Delete the under
25fd0 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67  lying .** storag
25fe0 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20  e if deleteFlag 
25ff0 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49  is true..**.** I
26000 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 68  f there is no sh
26010 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f  ared memory asso
26020 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
26030 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 65 6e 20  connection then 
26040 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
26050 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f  is a harmless no
26060 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
26070 6e 74 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 28  nt unixShmUnmap(
26080 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
26090 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  *fd,            
260a0 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
260b0 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
260c0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65  le */.  int dele
260d0 74 65 46 6c 61 67 20 20 20 20 20 20 20 20 20 20  teFlag          
260e0 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
260f0 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
26100 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
26110 75 6e 69 78 53 68 6d 20 2a 70 3b 20 20 20 20 20  unixShm *p;     
26120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26130 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  /* The connectio
26140 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a  n to be closed *
26150 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  /.  unixShmNode 
26160 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20  *pShmNode;      
26170 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72      /* The under
26180 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d  lying shared-mem
26190 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  ory file */.  un
261a0 69 78 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20  ixShm **pp;     
261b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
261c0 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
261d0 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  r sibling connec
261e0 74 69 6f 6e 73 20 2a 2f 0a 20 20 75 6e 69 78 46  tions */.  unixF
261f0 69 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20  ile *pDbFd;     
26200 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
26210 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
26220 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
26230 20 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69   pDbFd = (unixFi
26240 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70 44  le*)fd;.  p = pD
26250 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28  bFd->pShm;.  if(
26260 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   p==0 ) return S
26270 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d  QLITE_OK;.  pShm
26280 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f  Node = p->pShmNo
26290 64 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  de;..  assert( p
262a0 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e  ShmNode==pDbFd->
262b0 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
262c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
262d0 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d  hmNode->pInode==
262e0 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b  pDbFd->pInode );
262f0 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f  ..  /* Remove co
26300 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20  nnection p from 
26310 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65  the set of conne
26320 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65  ctions associate
26330 64 0a 20 20 2a 2a 20 77 69 74 68 20 70 53 68 6d  d.  ** with pShm
26340 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  Node */.  sqlite
26350 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
26360 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
26370 20 20 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f    for(pp=&pShmNo
26380 64 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70 70  de->pFirst; (*pp
26390 29 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70 70  )!=p; pp = &(*pp
263a0 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70  )->pNext){}.  *p
263b0 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20  p = p->pNext;.. 
263c0 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e   /* Free the con
263d0 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73  nection p */.  s
263e0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
263f0 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20    pDbFd->pShm = 
26400 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  0;.  sqlite3_mut
26410 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
26420 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a  e->mutex);..  /*
26430 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52   If pShmNode->nR
26440 65 66 20 68 61 73 20 72 65 61 63 68 65 64 20 30  ef has reached 0
26450 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65  , then close the
26460 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a   underlying.  **
26470 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
26480 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 75 6e  ile, too */.  un
26490 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
264a0 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
264b0 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  de->nRef>0 );.  
264c0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d  pShmNode->nRef--
264d0 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  ;.  if( pShmNode
264e0 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
264f0 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61 67 20   if( deleteFlag 
26500 26 26 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d  && pShmNode->h>=
26510 30 20 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c  0 ){.      osUnl
26520 69 6e 6b 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46  ink(pShmNode->zF
26530 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ilename);.    }.
26540 20 20 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65      unixShmPurge
26550 28 70 44 62 46 64 29 3b 0a 20 20 7d 0a 20 20 75  (pDbFd);.  }.  u
26560 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
26570 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
26580 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73 65 0a  E_OK;.}...#else.
26590 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d  # define unixShm
265a0 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65 66 69  Map     0.# defi
265b0 6e 65 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 20 20  ne unixShmLock  
265c0 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69    0.# define uni
265d0 78 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20  xShmBarrier 0.# 
265e0 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 55 6e  define unixShmUn
265f0 6d 61 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f  map   0.#endif /
26600 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  * #ifndef SQLITE
26610 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 23 69  _OMIT_WAL */..#i
26620 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
26630 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 49  P_SIZE>0./*.** I
26640 66 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  f it is currentl
26650 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2c  y memory mapped,
26660 20 75 6e 6d 61 70 20 66 69 6c 65 20 70 46 64 2e   unmap file pFd.
26670 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
26680 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e  unixUnmapfile(un
26690 69 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20  ixFile *pFd){.  
266a0 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65  assert( pFd->nFe
266b0 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 69  tchOut==0 );.  i
266c0 66 28 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69  f( pFd->pMapRegi
266d0 6f 6e 20 29 7b 0a 20 20 20 20 6f 73 4d 75 6e 6d  on ){.    osMunm
266e0 61 70 28 70 46 64 2d 3e 70 4d 61 70 52 65 67 69  ap(pFd->pMapRegi
266f0 6f 6e 2c 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  on, pFd->mmapSiz
26700 65 41 63 74 75 61 6c 29 3b 0a 20 20 20 20 70 46  eActual);.    pF
26710 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20  d->pMapRegion = 
26720 30 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70  0;.    pFd->mmap
26730 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 46  Size = 0;.    pF
26740 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  d->mmapSizeActua
26750 6c 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  l = 0;.  }.}../*
26760 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
26770 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  et the size of t
26780 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e  he memory mappin
26790 67 20 6d 61 69 6e 74 61 69 6e 65 64 20 62 79 20  g maintained by 
267a0 66 69 6c 65 20 0a 2a 2a 20 64 65 73 63 72 69 70  file .** descrip
267b0 74 6f 72 20 70 46 64 20 74 6f 20 6e 4e 65 77 20  tor pFd to nNew 
267c0 62 79 74 65 73 2e 20 41 6e 79 20 65 78 69 73 74  bytes. Any exist
267d0 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73 20 64  ing mapping is d
267e0 69 73 63 61 72 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  iscarded..**.** 
267f0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74  If successful, t
26800 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74  his function set
26810 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
26820 76 61 72 69 61 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a  variables:.**.**
26830 20 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 2e         unixFile.
26840 70 4d 61 70 52 65 67 69 6f 6e 0a 2a 2a 20 20 20  pMapRegion.**   
26850 20 20 20 20 75 6e 69 78 46 69 6c 65 2e 6d 6d 61      unixFile.mma
26860 70 53 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20 75  pSize.**       u
26870 6e 69 78 46 69 6c 65 2e 6d 6d 61 70 53 69 7a 65  nixFile.mmapSize
26880 41 63 74 75 61 6c 0a 2a 2a 0a 2a 2a 20 49 66 20  Actual.**.** If 
26890 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e  unsuccessful, an
268a0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
268b0 73 20 6c 6f 67 67 65 64 20 76 69 61 20 73 71 6c  s logged via sql
268c0 69 74 65 33 5f 6c 6f 67 28 29 20 61 6e 64 0a 2a  ite3_log() and.*
268d0 2a 20 74 68 65 20 74 68 72 65 65 20 76 61 72 69  * the three vari
268e0 61 62 6c 65 73 20 61 62 6f 76 65 20 61 72 65 20  ables above are 
268f0 7a 65 72 6f 65 64 2e 20 49 6e 20 74 68 69 73 20  zeroed. In this 
26900 63 61 73 65 20 53 51 4c 69 74 65 20 73 68 6f 75  case SQLite shou
26910 6c 64 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61  ld.** continue a
26920 63 63 65 73 73 69 6e 67 20 74 68 65 20 64 61 74  ccessing the dat
26930 61 62 61 73 65 20 75 73 69 6e 67 20 74 68 65 20  abase using the 
26940 78 52 65 61 64 28 29 20 61 6e 64 20 78 57 72 69  xRead() and xWri
26950 74 65 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 73 2e  te().** methods.
26960 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
26970 75 6e 69 78 52 65 6d 61 70 66 69 6c 65 28 0a 20  unixRemapfile(. 
26980 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c 20   unixFile *pFd, 
26990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269a0 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
269b0 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  tor object */.  
269c0 69 36 34 20 6e 4e 65 77 20 20 20 20 20 20 20 20  i64 nNew        
269d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269e0 2f 2a 20 52 65 71 75 69 72 65 64 20 6d 61 70 70  /* Required mapp
269f0 69 6e 67 20 73 69 7a 65 20 2a 2f 0a 29 7b 0a 20  ing size */.){. 
26a00 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72   const char *zEr
26a10 72 20 3d 20 22 6d 6d 61 70 22 3b 0a 20 20 69 6e  r = "mmap";.  in
26a20 74 20 68 20 3d 20 70 46 64 2d 3e 68 3b 20 20 20  t h = pFd->h;   
26a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a40 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
26a50 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 64 62  iptor open on db
26a60 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 70   file */.  u8 *p
26a70 4f 72 69 67 20 3d 20 28 75 38 20 2a 29 70 46 64  Orig = (u8 *)pFd
26a80 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20 20  ->pMapRegion;   
26a90 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75  /* Pointer to cu
26aa0 72 72 65 6e 74 20 66 69 6c 65 20 6d 61 70 70 69  rrent file mappi
26ab0 6e 67 20 2a 2f 0a 20 20 69 36 34 20 6e 4f 72 69  ng */.  i64 nOri
26ac0 67 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  g = pFd->mmapSiz
26ad0 65 41 63 74 75 61 6c 3b 20 20 20 20 20 2f 2a 20  eActual;     /* 
26ae0 53 69 7a 65 20 6f 66 20 70 4f 72 69 67 20 72 65  Size of pOrig re
26af0 67 69 6f 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f  gion in bytes */
26b00 0a 20 20 75 38 20 2a 70 4e 65 77 20 3d 20 30 3b  .  u8 *pNew = 0;
26b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 74          /* Locat
26b30 69 6f 6e 20 6f 66 20 6e 65 77 20 6d 61 70 70 69  ion of new mappi
26b40 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ng */.  int flag
26b50 73 20 3d 20 50 52 4f 54 5f 52 45 41 44 3b 20 20  s = PROT_READ;  
26b60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26b70 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f  Flags to pass to
26b80 20 6d 6d 61 70 28 29 20 2a 2f 0a 0a 20 20 61 73   mmap() */..  as
26b90 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63  sert( pFd->nFetc
26ba0 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73  hOut==0 );.  ass
26bb0 65 72 74 28 20 6e 4e 65 77 3e 70 46 64 2d 3e 6d  ert( nNew>pFd->m
26bc0 6d 61 70 53 69 7a 65 20 29 3b 0a 20 20 61 73 73  mapSize );.  ass
26bd0 65 72 74 28 20 6e 4e 65 77 3c 3d 70 46 64 2d 3e  ert( nNew<=pFd->
26be0 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29 3b 0a 20  mmapSizeMax );. 
26bf0 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 30 20   assert( nNew>0 
26c00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 64  );.  assert( pFd
26c10 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  ->mmapSizeActual
26c20 3e 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20  >=pFd->mmapSize 
26c30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 41 50  );.  assert( MAP
26c40 5f 46 41 49 4c 45 44 21 3d 30 20 29 3b 0a 0a 23  _FAILED!=0 );..#
26c50 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 4d 41  ifdef SQLITE_MMA
26c60 50 5f 52 45 41 44 57 52 49 54 45 0a 20 20 69 66  P_READWRITE.  if
26c70 28 20 28 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67  ( (pFd->ctrlFlag
26c80 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f  s & UNIXFILE_RDO
26c90 4e 4c 59 29 3d 3d 30 20 29 20 66 6c 61 67 73 20  NLY)==0 ) flags 
26ca0 7c 3d 20 50 52 4f 54 5f 57 52 49 54 45 3b 0a 23  |= PROT_WRITE;.#
26cb0 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 4f 72  endif..  if( pOr
26cc0 69 67 20 29 7b 0a 23 69 66 20 48 41 56 45 5f 4d  ig ){.#if HAVE_M
26cd0 52 45 4d 41 50 0a 20 20 20 20 69 36 34 20 6e 52  REMAP.    i64 nR
26ce0 65 75 73 65 20 3d 20 70 46 64 2d 3e 6d 6d 61 70  euse = pFd->mmap
26cf0 53 69 7a 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20  Size;.#else.    
26d00 63 6f 6e 73 74 20 69 6e 74 20 73 7a 53 79 73 70  const int szSysp
26d10 61 67 65 20 3d 20 6f 73 47 65 74 70 61 67 65 73  age = osGetpages
26d20 69 7a 65 28 29 3b 0a 20 20 20 20 69 36 34 20 6e  ize();.    i64 n
26d30 52 65 75 73 65 20 3d 20 28 70 46 64 2d 3e 6d 6d  Reuse = (pFd->mm
26d40 61 70 53 69 7a 65 20 26 20 7e 28 73 7a 53 79 73  apSize & ~(szSys
26d50 70 61 67 65 2d 31 29 29 3b 0a 23 65 6e 64 69 66  page-1));.#endif
26d60 0a 20 20 20 20 75 38 20 2a 70 52 65 71 20 3d 20  .    u8 *pReq = 
26d70 26 70 4f 72 69 67 5b 6e 52 65 75 73 65 5d 3b 0a  &pOrig[nReuse];.
26d80 0a 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20 61 6e  .    /* Unmap an
26d90 79 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 65  y pages of the e
26da0 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20  xisting mapping 
26db0 74 68 61 74 20 63 61 6e 6e 6f 74 20 62 65 20 72  that cannot be r
26dc0 65 75 73 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66  eused. */.    if
26dd0 28 20 6e 52 65 75 73 65 21 3d 6e 4f 72 69 67 20  ( nReuse!=nOrig 
26de0 29 7b 0a 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61  ){.      osMunma
26df0 70 28 70 52 65 71 2c 20 6e 4f 72 69 67 2d 6e 52  p(pReq, nOrig-nR
26e00 65 75 73 65 29 3b 0a 20 20 20 20 7d 0a 0a 23 69  euse);.    }..#i
26e10 66 20 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20 20  f HAVE_MREMAP.  
26e20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 72 65 6d 61    pNew = osMrema
26e30 70 28 70 4f 72 69 67 2c 20 6e 52 65 75 73 65 2c  p(pOrig, nReuse,
26e40 20 6e 4e 65 77 2c 20 4d 52 45 4d 41 50 5f 4d 41   nNew, MREMAP_MA
26e50 59 4d 4f 56 45 29 3b 0a 20 20 20 20 7a 45 72 72  YMOVE);.    zErr
26e60 20 3d 20 22 6d 72 65 6d 61 70 22 3b 0a 23 65 6c   = "mremap";.#el
26e70 73 65 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73  se.    pNew = os
26e80 4d 6d 61 70 28 70 52 65 71 2c 20 6e 4e 65 77 2d  Mmap(pReq, nNew-
26e90 6e 52 65 75 73 65 2c 20 66 6c 61 67 73 2c 20 4d  nReuse, flags, M
26ea0 41 50 5f 53 48 41 52 45 44 2c 20 68 2c 20 6e 52  AP_SHARED, h, nR
26eb0 65 75 73 65 29 3b 0a 20 20 20 20 69 66 28 20 70  euse);.    if( p
26ec0 4e 65 77 21 3d 4d 41 50 5f 46 41 49 4c 45 44 20  New!=MAP_FAILED 
26ed0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  ){.      if( pNe
26ee0 77 21 3d 70 52 65 71 20 29 7b 0a 20 20 20 20 20  w!=pReq ){.     
26ef0 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 4e 65 77     osMunmap(pNew
26f00 2c 20 6e 4e 65 77 20 2d 20 6e 52 65 75 73 65 29  , nNew - nReuse)
26f10 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  ;.        pNew =
26f20 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
26f30 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
26f40 70 4f 72 69 67 3b 0a 20 20 20 20 20 20 7d 0a 20  pOrig;.      }. 
26f50 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
26f60 20 2f 2a 20 54 68 65 20 61 74 74 65 6d 70 74 20   /* The attempt 
26f70 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20 65 78  to extend the ex
26f80 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 66  isting mapping f
26f90 61 69 6c 65 64 2e 20 46 72 65 65 20 69 74 2e 20  ailed. Free it. 
26fa0 2a 2f 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  */.    if( pNew=
26fb0 3d 4d 41 50 5f 46 41 49 4c 45 44 20 7c 7c 20 70  =MAP_FAILED || p
26fc0 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
26fd0 6f 73 4d 75 6e 6d 61 70 28 70 4f 72 69 67 2c 20  osMunmap(pOrig, 
26fe0 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 7d 0a 20  nReuse);.    }. 
26ff0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 4e 65 77   }..  /* If pNew
27000 20 69 73 20 73 74 69 6c 6c 20 4e 55 4c 4c 2c 20   is still NULL, 
27010 74 72 79 20 74 6f 20 63 72 65 61 74 65 20 61 6e  try to create an
27020 20 65 6e 74 69 72 65 6c 79 20 6e 65 77 20 6d 61   entirely new ma
27030 70 70 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20  pping. */.  if( 
27040 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 70  pNew==0 ){.    p
27050 4e 65 77 20 3d 20 6f 73 4d 6d 61 70 28 30 2c 20  New = osMmap(0, 
27060 6e 4e 65 77 2c 20 66 6c 61 67 73 2c 20 4d 41 50  nNew, flags, MAP
27070 5f 53 48 41 52 45 44 2c 20 68 2c 20 30 29 3b 0a  _SHARED, h, 0);.
27080 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 65 77 3d    }..  if( pNew=
27090 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20  =MAP_FAILED ){. 
270a0 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20     pNew = 0;.   
270b0 20 6e 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 75   nNew = 0;.    u
270c0 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
270d0 54 45 5f 4f 4b 2c 20 7a 45 72 72 2c 20 70 46 64  TE_OK, zErr, pFd
270e0 2d 3e 7a 50 61 74 68 29 3b 0a 0a 20 20 20 20 2f  ->zPath);..    /
270f0 2a 20 49 66 20 74 68 65 20 6d 6d 61 70 28 29 20  * If the mmap() 
27100 61 62 6f 76 65 20 66 61 69 6c 65 64 2c 20 61 73  above failed, as
27110 73 75 6d 65 20 74 68 61 74 20 61 6c 6c 20 73 75  sume that all su
27120 62 73 65 71 75 65 6e 74 20 6d 6d 61 70 28 29 20  bsequent mmap() 
27130 63 61 6c 6c 73 0a 20 20 20 20 2a 2a 20 77 69 6c  calls.    ** wil
27140 6c 20 70 72 6f 62 61 62 6c 79 20 66 61 69 6c 20  l probably fail 
27150 74 6f 6f 2e 20 46 61 6c 6c 20 62 61 63 6b 20 74  too. Fall back t
27160 6f 20 75 73 69 6e 67 20 78 52 65 61 64 2f 78 57  o using xRead/xW
27170 72 69 74 65 20 65 78 63 6c 75 73 69 76 65 6c 79  rite exclusively
27180 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 69 73 20  .    ** in this 
27190 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 70 46  case.  */.    pF
271a0 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d  d->mmapSizeMax =
271b0 20 30 3b 0a 20 20 7d 0a 20 20 70 46 64 2d 3e 70   0;.  }.  pFd->p
271c0 4d 61 70 52 65 67 69 6f 6e 20 3d 20 28 76 6f 69  MapRegion = (voi
271d0 64 20 2a 29 70 4e 65 77 3b 0a 20 20 70 46 64 2d  d *)pNew;.  pFd-
271e0 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 70 46 64 2d  >mmapSize = pFd-
271f0 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20  >mmapSizeActual 
27200 3d 20 6e 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  = nNew;.}../*.**
27210 20 4d 65 6d 6f 72 79 20 6d 61 70 20 6f 72 20 72   Memory map or r
27220 65 6d 61 70 20 74 68 65 20 66 69 6c 65 20 6f 70  emap the file op
27230 65 6e 65 64 20 62 79 20 66 69 6c 65 2d 64 65 73  ened by file-des
27240 63 72 69 70 74 6f 72 20 70 46 64 20 28 69 66 20  criptor pFd (if 
27250 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61  the file.** is a
27260 6c 72 65 61 64 79 20 6d 61 70 70 65 64 2c 20 74  lready mapped, t
27270 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70  he existing mapp
27280 69 6e 67 20 69 73 20 72 65 70 6c 61 63 65 64 20  ing is replaced 
27290 62 79 20 74 68 65 20 6e 65 77 29 2e 20 4f 72 2c  by the new). Or,
272a0 20 69 66 20 0a 2a 2a 20 74 68 65 72 65 20 61 6c   if .** there al
272b0 72 65 61 64 79 20 65 78 69 73 74 73 20 61 20 6d  ready exists a m
272c0 61 70 70 69 6e 67 20 66 6f 72 20 74 68 69 73 20  apping for this 
272d0 66 69 6c 65 2c 20 61 6e 64 20 74 68 65 72 65 20  file, and there 
272e0 61 72 65 20 73 74 69 6c 6c 20 0a 2a 2a 20 6f 75  are still .** ou
272f0 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74 63 68  tstanding xFetch
27300 28 29 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  () references to
27310 20 69 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69   it, this functi
27320 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
27330 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
27340 72 20 6e 42 79 74 65 20 69 73 20 6e 6f 6e 2d 6e  r nByte is non-n
27350 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 69 74  egative, then it
27360 20 69 73 20 74 68 65 20 72 65 71 75 65 73 74 65   is the requeste
27370 64 20 73 69 7a 65 20 6f 66 20 0a 2a 2a 20 74 68  d size of .** th
27380 65 20 6d 61 70 70 69 6e 67 20 74 6f 20 63 72 65  e mapping to cre
27390 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ate. Otherwise, 
273a0 69 66 20 6e 42 79 74 65 20 69 73 20 6c 65 73 73  if nByte is less
273b0 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
273c0 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74   the .** request
273d0 65 64 20 73 69 7a 65 20 69 73 20 74 68 65 20 73  ed size is the s
273e0 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
273f0 6f 6e 20 64 69 73 6b 2e 20 54 68 65 20 61 63 74  on disk. The act
27400 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  ual size of the.
27410 2a 2a 20 63 72 65 61 74 65 64 20 6d 61 70 70 69  ** created mappi
27420 6e 67 20 69 73 20 65 69 74 68 65 72 20 74 68 65  ng is either the
27430 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20   requested size 
27440 6f 72 20 74 68 65 20 76 61 6c 75 65 20 63 6f 6e  or the value con
27450 66 69 67 75 72 65 64 20 0a 2a 2a 20 75 73 69 6e  figured .** usin
27460 67 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d  g SQLITE_FCNTL_M
27470 4d 41 50 5f 4c 49 4d 49 54 2c 20 77 68 69 63 68  MAP_LIMIT, which
27480 65 76 65 72 20 69 73 20 73 6d 61 6c 6c 65 72 2e  ever is smaller.
27490 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
274a0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
274b0 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  no error occurs 
274c0 28 65 76 65 6e 20 69 66 20 74 68 65 20 6d 61 70  (even if the map
274d0 70 69 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a 20 72  ping is not.** r
274e0 65 63 72 65 61 74 65 64 20 61 73 20 61 20 72 65  ecreated as a re
274f0 73 75 6c 74 20 6f 66 20 6f 75 74 73 74 61 6e 64  sult of outstand
27500 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 29 20  ing references) 
27510 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  or an SQLite err
27520 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72  or.** code other
27530 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
27540 69 6e 74 20 75 6e 69 78 4d 61 70 66 69 6c 65 28  int unixMapfile(
27550 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c 20 69  unixFile *pFd, i
27560 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 36 34  64 nByte){.  i64
27570 20 6e 4d 61 70 20 3d 20 6e 42 79 74 65 3b 0a 20   nMap = nByte;. 
27580 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
27590 72 74 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20 70  rt( nMap>=0 || p
275a0 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30  Fd->nFetchOut==0
275b0 20 29 3b 0a 20 20 69 66 28 20 70 46 64 2d 3e 6e   );.  if( pFd->n
275c0 46 65 74 63 68 4f 75 74 3e 30 20 29 20 72 65 74  FetchOut>0 ) ret
275d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
275e0 20 20 69 66 28 20 6e 4d 61 70 3c 30 20 29 7b 0a    if( nMap<0 ){.
275f0 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
27600 73 74 61 74 62 75 66 3b 20 20 20 20 20 20 20 20  statbuf;        
27610 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66    /* Low-level f
27620 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ile information 
27630 2a 2f 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 73  */.    rc = osFs
27640 74 61 74 28 70 46 64 2d 3e 68 2c 20 26 73 74 61  tat(pFd->h, &sta
27650 74 62 75 66 29 3b 0a 20 20 20 20 69 66 28 20 72  tbuf);.    if( r
27660 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
27670 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
27680 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b  ITE_IOERR_FSTAT;
27690 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 70 20  .    }.    nMap 
276a0 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a  = statbuf.st_siz
276b0 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d 61  e;.  }.  if( nMa
276c0 70 3e 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d  p>pFd->mmapSizeM
276d0 61 78 20 29 7b 0a 20 20 20 20 6e 4d 61 70 20 3d  ax ){.    nMap =
276e0 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61   pFd->mmapSizeMa
276f0 78 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 4d  x;.  }..  if( nM
27700 61 70 21 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  ap!=pFd->mmapSiz
27710 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 4d 61  e ){.    if( nMa
27720 70 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 69  p>0 ){.      uni
27730 78 52 65 6d 61 70 66 69 6c 65 28 70 46 64 2c 20  xRemapfile(pFd, 
27740 6e 4d 61 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65  nMap);.    }else
27750 7b 0a 20 20 20 20 20 20 75 6e 69 78 55 6e 6d 61  {.      unixUnma
27760 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20 20 20  pfile(pFd);.    
27770 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
27780 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
27790 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41  dif /* SQLITE_MA
277a0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f  X_MMAP_SIZE>0 */
277b0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73 73 69  ../*.** If possi
277c0 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 20 70 6f  ble, return a po
277d0 69 6e 74 65 72 20 74 6f 20 61 20 6d 61 70 70 69  inter to a mappi
277e0 6e 67 20 6f 66 20 66 69 6c 65 20 66 64 20 73 74  ng of file fd st
277f0 61 72 74 69 6e 67 20 61 74 20 6f 66 66 73 65 74  arting at offset
27800 0a 2a 2a 20 69 4f 66 66 2e 20 54 68 65 20 6d 61  .** iOff. The ma
27810 70 70 69 6e 67 20 6d 75 73 74 20 62 65 20 76 61  pping must be va
27820 6c 69 64 20 66 6f 72 20 61 74 20 6c 65 61 73 74  lid for at least
27830 20 6e 41 6d 74 20 62 79 74 65 73 2e 0a 2a 2a 0a   nAmt bytes..**.
27840 2a 2a 20 49 66 20 73 75 63 68 20 61 20 70 6f 69  ** If such a poi
27850 6e 74 65 72 20 63 61 6e 20 62 65 20 6f 62 74 61  nter can be obta
27860 69 6e 65 64 2c 20 73 74 6f 72 65 20 69 74 20 69  ined, store it i
27870 6e 20 2a 70 70 20 61 6e 64 20 72 65 74 75 72 6e  n *pp and return
27880 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f   SQLITE_OK..** O
27890 72 2c 20 69 66 20 6f 6e 65 20 63 61 6e 6e 6f 74  r, if one cannot
278a0 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63   but no error oc
278b0 63 75 72 73 2c 20 73 65 74 20 2a 70 70 20 74 6f  curs, set *pp to
278c0 20 30 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51   0 and return SQ
278d0 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e 61  LITE_OK..** Fina
278e0 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72  lly, if an error
278f0 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 72 65 74   does occur, ret
27900 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urn an SQLite er
27910 72 6f 72 20 63 6f 64 65 2e 20 54 68 65 20 66 69  ror code. The fi
27920 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  nal.** value of 
27930 2a 70 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64  *pp is undefined
27940 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
27950 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e  *.** If this fun
27960 63 74 69 6f 6e 20 64 6f 65 73 20 72 65 74 75 72  ction does retur
27970 6e 20 61 20 70 6f 69 6e 74 65 72 2c 20 74 68 65  n a pointer, the
27980 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 76 65   caller must eve
27990 6e 74 75 61 6c 6c 79 20 0a 2a 2a 20 72 65 6c 65  ntually .** rele
279a0 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e 63  ase the referenc
279b0 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 75 6e 69  e by calling uni
279c0 78 55 6e 66 65 74 63 68 28 29 2e 0a 2a 2f 0a 73  xUnfetch()..*/.s
279d0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 65  tatic int unixFe
279e0 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  tch(sqlite3_file
279f0 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20   *fd, i64 iOff, 
27a00 69 6e 74 20 6e 41 6d 74 2c 20 76 6f 69 64 20 2a  int nAmt, void *
27a10 2a 70 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  *pp){.#if SQLITE
27a20 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
27a30 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  .  unixFile *pFd
27a40 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 66   = (unixFile *)f
27a50 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65  d;   /* The unde
27a60 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
27a70 66 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  file */.#endif. 
27a80 20 2a 70 70 20 3d 20 30 3b 0a 0a 23 69 66 20 53   *pp = 0;..#if S
27a90 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
27aa0 49 5a 45 3e 30 0a 20 20 69 66 28 20 70 46 64 2d  IZE>0.  if( pFd-
27ab0 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20 29  >mmapSizeMax>0 )
27ac0 7b 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 70  {.    if( pFd->p
27ad0 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 20 29 7b 0a  MapRegion==0 ){.
27ae0 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 75        int rc = u
27af0 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 64 2c 20  nixMapfile(pFd, 
27b00 2d 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  -1);.      if( r
27b10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
27b20 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
27b30 20 20 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61      if( pFd->mma
27b40 70 53 69 7a 65 20 3e 3d 20 69 4f 66 66 2b 6e 41  pSize >= iOff+nA
27b50 6d 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 20  mt ){.      *pp 
27b60 3d 20 26 28 28 75 38 20 2a 29 70 46 64 2d 3e 70  = &((u8 *)pFd->p
27b70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d  MapRegion)[iOff]
27b80 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6e 46 65  ;.      pFd->nFe
27b90 74 63 68 4f 75 74 2b 2b 3b 0a 20 20 20 20 7d 0a  tchOut++;.    }.
27ba0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
27bb0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
27bc0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74  ../*.** If the t
27bd0 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73  hird argument is
27be0 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20   non-NULL, then 
27bf0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
27c00 6c 65 61 73 65 73 20 61 20 0a 2a 2a 20 72 65 66  leases a .** ref
27c10 65 72 65 6e 63 65 20 6f 62 74 61 69 6e 65 64 20  erence obtained 
27c20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61  by an earlier ca
27c30 6c 6c 20 74 6f 20 75 6e 69 78 46 65 74 63 68 28  ll to unixFetch(
27c40 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 0a 2a 2a  ). The second.**
27c50 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
27c60 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
27c70 6e 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61  n must be the sa
27c80 6d 65 20 61 73 20 74 68 65 20 63 6f 72 72 65 73  me as the corres
27c90 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72 67 75 6d  ponding.** argum
27ca0 65 6e 74 20 74 68 61 74 20 77 61 73 20 70 61 73  ent that was pas
27cb0 73 65 64 20 74 6f 20 74 68 65 20 75 6e 69 78 46  sed to the unixF
27cc0 65 74 63 68 28 29 20 69 6e 76 6f 63 61 74 69 6f  etch() invocatio
27cd0 6e 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66  n. .**.** Or, if
27ce0 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
27cf0 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ent is NULL, the
27d00 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
27d10 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20  is being called 
27d20 0a 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d 20 74 68  .** to inform th
27d30 65 20 56 46 53 20 6c 61 79 65 72 20 74 68 61 74  e VFS layer that
27d40 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 50  , according to P
27d50 4f 53 49 58 2c 20 61 6e 79 20 65 78 69 73 74 69  OSIX, any existi
27d60 6e 67 20 6d 61 70 70 69 6e 67 20 0a 2a 2a 20 6d  ng mapping .** m
27d70 61 79 20 6e 6f 77 20 62 65 20 69 6e 76 61 6c 69  ay now be invali
27d80 64 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20  d and should be 
27d90 75 6e 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73 74 61  unmapped..*/.sta
27da0 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 66 65  tic int unixUnfe
27db0 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  tch(sqlite3_file
27dc0 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20   *fd, i64 iOff, 
27dd0 76 6f 69 64 20 2a 70 29 7b 0a 23 69 66 20 53 51  void *p){.#if SQ
27de0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
27df0 5a 45 3e 30 0a 20 20 75 6e 69 78 46 69 6c 65 20  ZE>0.  unixFile 
27e00 2a 70 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65  *pFd = (unixFile
27e10 20 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68 65 20   *)fd;   /* The 
27e20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62  underlying datab
27e30 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 55 4e  ase file */.  UN
27e40 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69  USED_PARAMETER(i
27e50 4f 66 66 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  Off);..  /* If p
27e60 3d 3d 30 20 28 75 6e 6d 61 70 20 74 68 65 20 65  ==0 (unmap the e
27e70 6e 74 69 72 65 20 66 69 6c 65 29 20 74 68 65 6e  ntire file) then
27e80 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e   there must be n
27e90 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 0a 20  o outstanding . 
27ea0 20 2a 2a 20 78 46 65 74 63 68 20 72 65 66 65 72   ** xFetch refer
27eb0 65 6e 63 65 73 2e 20 4f 72 2c 20 69 66 20 70 21  ences. Or, if p!
27ec0 3d 30 20 28 6d 65 61 6e 69 6e 67 20 69 74 20 69  =0 (meaning it i
27ed0 73 20 61 6e 20 78 46 65 74 63 68 20 72 65 66 65  s an xFetch refe
27ee0 72 65 6e 63 65 29 2c 0a 20 20 2a 2a 20 74 68 65  rence),.  ** the
27ef0 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
27f00 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74  at least one out
27f10 73 74 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a 20 20  standing.  */.  
27f20 61 73 73 65 72 74 28 20 28 70 3d 3d 30 29 3d 3d  assert( (p==0)==
27f30 28 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d  (pFd->nFetchOut=
27f40 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  =0) );..  /* If 
27f50 70 21 3d 30 2c 20 69 74 20 6d 75 73 74 20 6d 61  p!=0, it must ma
27f60 74 63 68 20 74 68 65 20 69 4f 66 66 20 76 61 6c  tch the iOff val
27f70 75 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ue. */.  assert(
27f80 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28 28 75   p==0 || p==&((u
27f90 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67  8 *)pFd->pMapReg
27fa0 69 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a 0a 20  ion)[iOff] );.. 
27fb0 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70 46   if( p ){.    pF
27fc0 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2d 2d 3b 0a  d->nFetchOut--;.
27fd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69    }else{.    uni
27fe0 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b  xUnmapfile(pFd);
27ff0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
28000 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 3d  pFd->nFetchOut>=
28010 30 20 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55  0 );.#else.  UNU
28020 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64  SED_PARAMETER(fd
28030 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
28040 4d 45 54 45 52 28 70 29 3b 0a 20 20 55 4e 55 53  METER(p);.  UNUS
28050 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 4f 66  ED_PARAMETER(iOf
28060 66 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  f);.#endif.  ret
28070 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
28080 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64  ../*.** Here end
28090 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
280a0 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69  tion of all sqli
280b0 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73  te3_file methods
280c0 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
280d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
280e0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65 74  sqlite3_file Met
280f0 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
28100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28110 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
28120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28160 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ***/../*.** This
28170 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69   division contai
28180 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f  ns definitions o
28190 66 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  f sqlite3_io_met
281a0 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 74 68 61  hods objects tha
281b0 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 76  t.** implement v
281c0 61 72 69 6f 75 73 20 66 69 6c 65 20 6c 6f 63 6b  arious file lock
281d0 69 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e 20  ing strategies. 
281e0 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e   It also contain
281f0 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a  s definitions.**
28200 20 6f 66 20 22 66 69 6e 64 65 72 22 20 66 75 6e   of "finder" fun
28210 63 74 69 6f 6e 73 2e 20 20 41 20 66 69 6e 64 65  ctions.  A finde
28220 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  r-function is us
28230 65 64 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65  ed to locate the
28240 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20   appropriate.** 
28250 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
28260 64 73 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 20  ds object for a 
28270 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
28280 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 70  ase file.  The p
28290 41 70 70 44 61 74 61 0a 2a 2a 20 66 69 65 6c 64  AppData.** field
282a0 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   of the sqlite3_
282b0 76 66 73 20 56 46 53 20 6f 62 6a 65 63 74 73 20  vfs VFS objects 
282c0 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  are initialized 
282d0 74 6f 20 62 65 20 70 6f 69 6e 74 65 72 73 20 74  to be pointers t
282e0 6f 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74  o.** the correct
282f0 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
28300 20 66 6f 72 20 74 68 61 74 20 56 46 53 2e 0a 2a   for that VFS..*
28310 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69 6e 64 65 72  *.** Most finder
28320 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72   functions retur
28330 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
28340 20 66 69 78 65 64 20 73 71 6c 69 74 65 33 5f 69   fixed sqlite3_i
28350 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a  o_methods.** obj
28360 65 63 74 2e 20 20 54 68 65 20 6f 6e 6c 79 20 69  ect.  The only i
28370 6e 74 65 72 65 73 74 69 6e 67 20 66 69 6e 64 65  nteresting finde
28380 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 75  r-function is au
28390 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20  tolockIoFinder, 
283a0 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f 6b 73 20 61  which.** looks a
283b0 74 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  t the filesystem
283c0 20 74 79 70 65 20 61 6e 64 20 74 72 69 65 73 20   type and tries 
283d0 74 6f 20 67 75 65 73 73 20 74 68 65 20 62 65 73  to guess the bes
283e0 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72  t locking.** str
283f0 61 74 65 67 79 20 66 72 6f 6d 20 74 68 61 74 2e  ategy from that.
28400 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66 69 6e 64 65  .**.** For finde
28410 72 2d 66 75 6e 63 74 69 6f 6e 20 46 2c 20 74 77  r-function F, tw
28420 6f 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72  o objects are cr
28430 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  eated:.**.**    
28440 28 31 29 20 54 68 65 20 72 65 61 6c 20 66 69 6e  (1) The real fin
28450 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der-function nam
28460 65 64 20 22 46 49 6d 70 74 28 29 22 2e 0a 2a 2a  ed "FImpt()"..**
28470 0a 2a 2a 20 20 20 20 28 32 29 20 41 20 63 6f 6e  .**    (2) A con
28480 73 74 61 6e 74 20 70 6f 69 6e 74 65 72 20 74 6f  stant pointer to
28490 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e   this function n
284a0 61 6d 65 64 20 6a 75 73 74 20 22 46 22 2e 0a 2a  amed just "F"..*
284b0 2a 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65  *.**.** A pointe
284c0 72 20 74 6f 20 74 68 65 20 46 20 70 6f 69 6e 74  r to the F point
284d0 65 72 20 69 73 20 75 73 65 64 20 61 73 20 74 68  er is used as th
284e0 65 20 70 41 70 70 44 61 74 61 20 76 61 6c 75 65  e pAppData value
284f0 20 66 6f 72 20 56 46 53 0a 2a 2a 20 6f 62 6a 65   for VFS.** obje
28500 63 74 73 2e 20 20 57 65 20 68 61 76 65 20 74 6f  cts.  We have to
28510 20 64 6f 20 74 68 69 73 20 69 6e 73 74 65 61 64   do this instead
28520 20 6f 66 20 6c 65 74 74 69 6e 67 20 70 41 70 70   of letting pApp
28530 44 61 74 61 20 70 6f 69 6e 74 0a 2a 2a 20 64 69  Data point.** di
28540 72 65 63 74 6c 79 20 61 74 20 74 68 65 20 66 69  rectly at the fi
28550 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 73 69  nder-function si
28560 6e 63 65 20 43 39 30 20 72 75 6c 65 73 20 70 72  nce C90 rules pr
28570 65 76 65 6e 74 20 61 20 76 6f 69 64 2a 0a 2a 2a  event a void*.**
28580 20 66 72 6f 6d 20 62 65 20 63 61 73 74 20 69 6e   from be cast in
28590 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f  to a function po
285a0 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  inter..**.**.** 
285b0 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66  Each instance of
285c0 20 74 68 69 73 20 6d 61 63 72 6f 20 67 65 6e 65   this macro gene
285d0 72 61 74 65 73 20 74 77 6f 20 6f 62 6a 65 63 74  rates two object
285e0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 20  s:.**.**   *  A 
285f0 63 6f 6e 73 74 61 6e 74 20 73 71 6c 69 74 65 33  constant sqlite3
28600 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
28610 63 74 20 63 61 6c 6c 20 4d 45 54 48 4f 44 20 74  ct call METHOD t
28620 68 61 74 20 68 61 73 20 6c 6f 63 6b 69 6e 67 0a  hat has locking.
28630 2a 2a 20 20 20 20 20 20 6d 65 74 68 6f 64 73 20  **      methods 
28640 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c  CLOSE, LOCK, UNL
28650 4f 43 4b 2c 20 43 4b 52 45 53 4c 4f 43 4b 2e 0a  OCK, CKRESLOCK..
28660 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 49 2f  **.**   *  An I/
28670 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20  O method finder 
28680 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20  function called 
28690 46 49 4e 44 45 52 20 74 68 61 74 20 72 65 74 75  FINDER that retu
286a0 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  rns a pointer.**
286b0 20 20 20 20 20 20 74 6f 20 74 68 65 20 4d 45 54        to the MET
286c0 48 4f 44 20 6f 62 6a 65 63 74 20 69 6e 20 74 68  HOD object in th
286d0 65 20 70 72 65 76 69 6f 75 73 20 62 75 6c 6c 65  e previous bulle
286e0 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49 4f  t..*/.#define IO
286f0 4d 45 54 48 4f 44 53 28 46 49 4e 44 45 52 2c 4d  METHODS(FINDER,M
28700 45 54 48 4f 44 2c 56 45 52 53 49 4f 4e 2c 43 4c  ETHOD,VERSION,CL
28710 4f 53 45 2c 4c 4f 43 4b 2c 55 4e 4c 4f 43 4b 2c  OSE,LOCK,UNLOCK,
28720 43 4b 4c 4f 43 4b 2c 53 48 4d 4d 41 50 29 20 20  CKLOCK,SHMMAP)  
28730 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73     \.static cons
28740 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
28750 68 6f 64 73 20 4d 45 54 48 4f 44 20 3d 20 7b 20  hods METHOD = { 
28760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28780 20 20 5c 0a 20 20 20 56 45 52 53 49 4f 4e 2c 20    \.   VERSION, 
28790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287a0 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
287b0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
287c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287d0 20 5c 0a 20 20 20 43 4c 4f 53 45 2c 20 20 20 20   \.   CLOSE,    
287e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287f0 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 20 20    /* xClose */  
28800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28820 5c 0a 20 20 20 75 6e 69 78 52 65 61 64 2c 20 20  \.   unixRead,  
28830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28840 20 2f 2a 20 78 52 65 61 64 20 2a 2f 20 20 20 20   /* xRead */    
28850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
28870 0a 20 20 20 75 6e 69 78 57 72 69 74 65 2c 20 20  .   unixWrite,  
28880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28890 2f 2a 20 78 57 72 69 74 65 20 2a 2f 20 20 20 20  /* xWrite */    
288a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
288c0 20 20 20 75 6e 69 78 54 72 75 6e 63 61 74 65 2c     unixTruncate,
288d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
288e0 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 20 20  * xTruncate */  
288f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28900 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
28910 20 20 75 6e 69 78 53 79 6e 63 2c 20 20 20 20 20    unixSync,     
28920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28930 20 78 53 79 6e 63 20 2a 2f 20 20 20 20 20 20 20   xSync */       
28940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28950 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
28960 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 20 20   unixFileSize,  
28970 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28980 78 46 69 6c 65 53 69 7a 65 20 2a 2f 20 20 20 20  xFileSize */    
28990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289a0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
289b0 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20  LOCK,           
289c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
289d0 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20  Lock */         
289e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289f0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 55            \.   U
28a00 4e 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20  NLOCK,          
28a10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
28a20 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20  nlock */        
28a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a40 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4b           \.   CK
28a50 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20  LOCK,           
28a60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68            /* xCh
28a70 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
28a80 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
28a90 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
28aa0 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20  xFileControl,   
28ab0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
28ac0 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20 20 20 20  eControl */     
28ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ae0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
28af0 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20  SectorSize,     
28b00 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74          /* xSect
28b10 6f 72 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20  orSize */       
28b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b30 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 44        \.   unixD
28b40 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
28b50 74 69 63 73 2c 20 20 2f 2a 20 78 44 65 76 69 63  tics,  /* xDevic
28b60 65 43 61 70 61 62 69 6c 69 74 69 65 73 20 2a 2f  eCapabilities */
28b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b80 20 20 20 20 20 5c 0a 20 20 20 53 48 4d 4d 41 50       \.   SHMMAP
28b90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28ba0 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70        /* xShmMap
28bb0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
28bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bd0 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d      \.   unixShm
28be0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
28bf0 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b       /* xShmLock
28c00 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
28c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 42     \.   unixShmB
28c30 61 72 72 69 65 72 2c 20 20 20 20 20 20 20 20 20  arrier,         
28c40 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69      /* xShmBarri
28c50 65 72 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  er */           
28c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c70 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 55 6e    \.   unixShmUn
28c80 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  map,            
28c90 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20     /* xShmUnmap 
28ca0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
28cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28cc0 20 5c 0a 20 20 20 75 6e 69 78 46 65 74 63 68 2c   \.   unixFetch,
28cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ce0 20 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f 20 20    /* xFetch */  
28cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d10 5c 0a 20 20 20 75 6e 69 78 55 6e 66 65 74 63 68  \.   unixUnfetch
28d20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28d30 20 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a 2f 20   /* xUnfetch */ 
28d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
28d60 0a 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  .};             
28d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
28db0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
28dc0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
28dd0 2a 46 49 4e 44 45 52 23 23 49 6d 70 6c 28 63 6f  *FINDER##Impl(co
28de0 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 75 6e 69  nst char *z, uni
28df0 78 46 69 6c 65 20 2a 70 29 7b 20 20 20 5c 0a 20  xFile *p){   \. 
28e00 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
28e10 52 28 7a 29 3b 20 55 4e 55 53 45 44 5f 50 41 52  R(z); UNUSED_PAR
28e20 41 4d 45 54 45 52 28 70 29 3b 20 20 20 20 20 20  AMETER(p);      
28e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e40 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
28e50 72 65 74 75 72 6e 20 26 4d 45 54 48 4f 44 3b 20  return &METHOD; 
28e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e90 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 20 20             \.}  
28ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ee0 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74            \.stat
28ef0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
28f00 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 63  _io_methods *(*c
28f10 6f 6e 73 74 20 46 49 4e 44 45 52 29 28 63 6f 6e  onst FINDER)(con
28f20 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c  st char*,unixFil
28f30 65 20 2a 70 29 20 20 20 20 5c 0a 20 20 20 20 3d  e *p)    \.    =
28f40 20 46 49 4e 44 45 52 23 23 49 6d 70 6c 3b 0a 0a   FINDER##Impl;..
28f50 2f 2a 0a 2a 2a 20 48 65 72 65 20 61 72 65 20 61  /*.** Here are a
28f60 6c 6c 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ll of the sqlite
28f70 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
28f80 65 63 74 73 20 66 6f 72 20 65 61 63 68 20 6f 66  ects for each of
28f90 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20   the.** locking 
28fa0 73 74 72 61 74 65 67 69 65 73 2e 20 20 46 75 6e  strategies.  Fun
28fb0 63 74 69 6f 6e 73 20 74 68 61 74 20 72 65 74 75  ctions that retu
28fc0 72 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74  rn pointers to t
28fd0 68 65 73 65 20 6d 65 74 68 6f 64 73 0a 2a 2a 20  hese methods.** 
28fe0 61 72 65 20 61 6c 73 6f 20 63 72 65 61 74 65 64  are also created
28ff0 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  ..*/.IOMETHODS(.
29000 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 2c    posixIoFinder,
29010 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
29020 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
29030 61 6d 65 20 2a 2f 0a 20 20 70 6f 73 69 78 49 6f  ame */.  posixIo
29040 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
29050 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
29060 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
29070 6e 61 6d 65 20 2a 2f 0a 20 20 33 2c 20 20 20 20  name */.  3,    
29080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29090 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
290a0 6d 6f 72 79 20 61 6e 64 20 6d 6d 61 70 20 61 72  mory and mmap ar
290b0 65 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 75  e enabled */.  u
290c0 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  nixClose,       
290d0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
290e0 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75  se method */.  u
290f0 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  nixLock,        
29100 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
29110 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e  k method */.  un
29120 69 78 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  ixUnlock,       
29130 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
29140 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75  ck method */.  u
29150 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  nixCheckReserved
29160 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20 78 43 68 65  Lock,    /* xChe
29170 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
29180 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 53  ethod */.  unixS
29190 68 6d 4d 61 70 20 20 20 20 20 20 20 20 20 20 20  hmMap           
291a0 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
291b0 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45  method */.).IOME
291c0 54 48 4f 44 53 28 0a 20 20 6e 6f 6c 6f 63 6b 49  THODS(.  nolockI
291d0 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
291e0 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
291f0 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
29200 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c  nolockIoMethods,
29210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
29220 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
29230 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
29240 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   3,             
29250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
29260 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
29270 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 6e 6f 6c  isabled */.  nol
29280 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  ockClose,       
29290 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
292a0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c   method */.  nol
292b0 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ockLock,        
292c0 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
292d0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f  method */.  nolo
292e0 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  ckUnlock,       
292f0 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
29300 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c   method */.  nol
29310 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
29320 4c 6f 63 6b 2c 20 20 2f 2a 20 78 43 68 65 63 6b  Lock,  /* xCheck
29330 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
29340 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20  hod */.  0      
29350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29360 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65     /* xShmMap me
29370 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48  thod */.).IOMETH
29380 4f 44 53 28 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f  ODS(.  dotlockIo
29390 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
293a0 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
293b0 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f  ion name */.  do
293c0 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20  tlockIoMethods, 
293d0 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
293e0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
293f0 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
29400 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29410 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
29420 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
29430 61 62 6c 65 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f  abled */.  dotlo
29440 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  ckClose,        
29450 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
29460 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f  ethod */.  dotlo
29470 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ckLock,         
29480 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
29490 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63  thod */.  dotloc
294a0 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  kUnlock,        
294b0 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
294c0 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f  ethod */.  dotlo
294d0 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
294e0 6f 63 6b 2c 20 2f 2a 20 78 43 68 65 63 6b 52 65  ock, /* xCheckRe
294f0 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
29500 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20  d */.  0        
29510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29520 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68   /* xShmMap meth
29530 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66 20 53 51 4c  od */.)..#if SQL
29540 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
29550 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f  NG_STYLE.IOMETHO
29560 44 53 28 0a 20 20 66 6c 6f 63 6b 49 6f 46 69 6e  DS(.  flockIoFin
29570 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
29580 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
29590 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f  on name */.  flo
295a0 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  ckIoMethods,    
295b0 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
295c0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
295d0 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
295e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
295f0 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
29600 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
29610 62 6c 65 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43  bled */.  flockC
29620 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
29630 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
29640 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c  thod */.  flockL
29650 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
29660 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
29670 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e  hod */.  flockUn
29680 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
29690 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
296a0 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43  thod */.  flockC
296b0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
296c0 2c 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73  ,   /* xCheckRes
296d0 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
296e0 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20   */.  0         
296f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29700 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f  /* xShmMap metho
29710 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23  d */.).#endif..#
29720 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f  if OS_VXWORKS.IO
29730 4d 45 54 48 4f 44 53 28 0a 20 20 73 65 6d 49 6f  METHODS(.  semIo
29740 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
29750 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
29760 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
29770 20 20 73 65 6d 49 6f 4d 65 74 68 6f 64 73 2c 20    semIoMethods, 
29780 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
29790 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
297a0 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
297b0 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
297c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
297d0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
297e0 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 73   disabled */.  s
297f0 65 6d 58 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  emXClose,       
29800 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
29810 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73  se method */.  s
29820 65 6d 58 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  emXLock,        
29830 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
29840 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65  k method */.  se
29850 6d 58 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  mXUnlock,       
29860 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
29870 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73  ck method */.  s
29880 65 6d 58 43 68 65 63 6b 52 65 73 65 72 76 65 64  emXCheckReserved
29890 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20 78 43 68 65  Lock,    /* xChe
298a0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
298b0 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20  ethod */.  0    
298c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298d0 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
298e0 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64  method */.).#end
298f0 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  if..#if defined(
29900 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
29910 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
29920 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48  ING_STYLE.IOMETH
29930 4f 44 53 28 0a 20 20 61 66 70 49 6f 46 69 6e 64  ODS(.  afpIoFind
29940 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
29950 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
29960 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 66  ion name */.  af
29970 70 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  pIoMethods,     
29980 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
29990 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
299a0 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
299b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
299c0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
299d0 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
299e0 61 62 6c 65 64 20 2a 2f 0a 20 20 61 66 70 43 6c  abled */.  afpCl
299f0 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
29a00 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
29a10 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 4c 6f  ethod */.  afpLo
29a20 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
29a30 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
29a40 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 55 6e 6c  thod */.  afpUnl
29a50 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
29a60 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
29a70 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 43 68  ethod */.  afpCh
29a80 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
29a90 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65       /* xCheckRe
29aa0 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
29ab0 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20  d */.  0        
29ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ad0 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68   /* xShmMap meth
29ae0 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
29af0 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20  /*.** The proxy 
29b00 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 69  locking method i
29b10 73 20 61 20 22 73 75 70 65 72 2d 6d 65 74 68 6f  s a "super-metho
29b20 64 22 20 69 6e 20 74 68 65 20 73 65 6e 73 65 20  d" in the sense 
29b30 74 68 61 74 20 69 74 0a 2a 2a 20 6f 70 65 6e 73  that it.** opens
29b40 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 20   secondary file 
29b50 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20  descriptors for 
29b60 74 68 65 20 63 6f 6e 63 68 20 61 6e 64 20 6c 6f  the conch and lo
29b70 63 6b 20 66 69 6c 65 73 20 61 6e 64 0a 2a 2a 20  ck files and.** 
29b80 69 74 20 75 73 65 73 20 70 72 6f 78 79 2c 20 64  it uses proxy, d
29b90 6f 74 2d 66 69 6c 65 2c 20 41 46 50 2c 20 61 6e  ot-file, AFP, an
29ba0 64 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e  d flock() lockin
29bb0 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 6f  g methods on tho
29bc0 73 65 0a 2a 2a 20 73 65 63 6f 6e 64 61 72 79 20  se.** secondary 
29bd0 66 69 6c 65 73 2e 20 20 46 6f 72 20 74 68 69 73  files.  For this
29be0 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76   reason, the div
29bf0 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65  ision that imple
29c00 6d 65 6e 74 73 0a 2a 2a 20 70 72 6f 78 79 20 6c  ments.** proxy l
29c10 6f 63 6b 69 6e 67 20 69 73 20 6c 6f 63 61 74 65  ocking is locate
29c20 64 20 6d 75 63 68 20 66 75 72 74 68 65 72 20 64  d much further d
29c30 6f 77 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 2e  own in the file.
29c40 20 20 42 75 74 20 77 65 20 6e 65 65 64 0a 2a 2a    But we need.**
29c50 20 74 6f 20 67 6f 20 61 68 65 61 64 20 61 6e 64   to go ahead and
29c60 20 64 65 66 69 6e 65 20 74 68 65 20 73 71 6c 69   define the sqli
29c70 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 61  te3_io_methods a
29c80 6e 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69  nd finder functi
29c90 6f 6e 0a 2a 2a 20 66 6f 72 20 70 72 6f 78 79 20  on.** for proxy 
29ca0 6c 6f 63 6b 69 6e 67 20 68 65 72 65 2e 20 20 53  locking here.  S
29cb0 6f 20 77 65 20 66 6f 72 77 61 72 64 20 64 65 63  o we forward dec
29cc0 6c 61 72 65 20 74 68 65 20 49 2f 4f 20 6d 65 74  lare the I/O met
29cd0 68 6f 64 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  hods..*/.#if def
29ce0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
29cf0 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
29d00 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 73  _LOCKING_STYLE.s
29d10 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
29d20 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
29d30 65 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  e*);.static int 
29d40 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65  proxyLock(sqlite
29d50 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73  3_file*, int);.s
29d60 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 55  tatic int proxyU
29d70 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
29d80 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69  le*, int);.stati
29d90 63 20 69 6e 74 20 70 72 6f 78 79 43 68 65 63 6b  c int proxyCheck
29da0 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
29db0 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 2a  ite3_file*, int*
29dc0 29 3b 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  );.IOMETHODS(.  
29dd0 70 72 6f 78 79 49 6f 46 69 6e 64 65 72 2c 20 20  proxyIoFinder,  
29de0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
29df0 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
29e00 65 20 2a 2f 0a 20 20 70 72 6f 78 79 49 6f 4d 65  e */.  proxyIoMe
29e10 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
29e20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
29e30 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
29e40 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
29e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e60 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
29e70 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
29e80 2f 0a 20 20 70 72 6f 78 79 43 6c 6f 73 65 2c 20  /.  proxyClose, 
29e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29ea0 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
29eb0 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 2c 20 20  /.  proxyLock,  
29ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29ed0 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
29ee0 0a 20 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 2c 20  .  proxyUnlock, 
29ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29f00 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
29f10 2f 0a 20 20 70 72 6f 78 79 43 68 65 63 6b 52 65  /.  proxyCheckRe
29f20 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 2f 2a  servedLock,   /*
29f30 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
29f40 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
29f50 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
29f60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
29f70 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  mMap method */.)
29f80 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 6e 66 73 20  .#endif../* nfs 
29f90 6c 6f 63 6b 64 20 6f 6e 20 4f 53 58 20 31 30 2e  lockd on OSX 10.
29fa0 33 2b 20 64 6f 65 73 6e 27 74 20 63 6c 65 61 72  3+ doesn't clear
29fb0 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 77 68 65   write locks whe
29fc0 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73  n a read lock is
29fd0 20 73 65 74 20 2a 2f 0a 23 69 66 20 64 65 66 69   set */.#if defi
29fe0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
29ff0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
2a000 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f  LOCKING_STYLE.IO
2a010 4d 45 54 48 4f 44 53 28 0a 20 20 6e 66 73 49 6f  METHODS(.  nfsIo
2a020 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
2a030 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
2a040 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
2a050 0a 20 20 6e 66 73 49 6f 4d 65 74 68 6f 64 73 2c  .  nfsIoMethods,
2a060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a070 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2a080 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
2a090 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
2a0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a0b0 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
2a0c0 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
2a0d0 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20    unixClose,    
2a0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a0f0 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
2a100 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20  .  unixLock,    
2a110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a120 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
2a130 0a 20 20 6e 66 73 55 6e 6c 6f 63 6b 2c 20 20 20  .  nfsUnlock,   
2a140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a150 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
2a160 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65  */.  unixCheckRe
2a170 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20  servedLock,     
2a180 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
2a190 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
2a1a0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
2a1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a1c0 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a  xShmMap method *
2a1d0 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  /.).#endif..#if 
2a1e0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
2a1f0 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
2a200 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2a210 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66  E./* .** This "f
2a220 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 20  inder" function 
2a230 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65 74 65  attempts to dete
2a240 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20 6c  rmine the best l
2a250 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20  ocking strategy 
2a260 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 61 74 61  .** for the data
2a270 62 61 73 65 20 66 69 6c 65 20 22 66 69 6c 65 50  base file "fileP
2a280 61 74 68 22 2e 20 20 49 74 20 74 68 65 6e 20 72  ath".  It then r
2a290 65 74 75 72 6e 73 20 74 68 65 20 73 71 6c 69 74  eturns the sqlit
2a2a0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a  e3_io_methods.**
2a2b0 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70   object that imp
2a2c0 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 73 74 72  lements that str
2a2d0 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ategy..**.** Thi
2a2e0 73 20 69 73 20 66 6f 72 20 4d 61 63 4f 53 58 20  s is for MacOSX 
2a2f0 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  only..*/.static 
2a300 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
2a310 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f  _methods *autolo
2a320 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a  ckIoFinderImpl(.
2a330 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69    const char *fi
2a340 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61  lePath,    /* na
2a350 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
2a360 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69  se file */.  uni
2a370 78 46 69 6c 65 20 2a 70 4e 65 77 20 20 20 20 20  xFile *pNew     
2a380 20 20 20 20 20 20 2f 2a 20 6f 70 65 6e 20 66 69        /* open fi
2a390 6c 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68  le object for th
2a3a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2a3b0 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 63  */.){.  static c
2a3c0 6f 6e 73 74 20 73 74 72 75 63 74 20 4d 61 70 70  onst struct Mapp
2a3d0 69 6e 67 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  ing {.    const 
2a3e0 63 68 61 72 20 2a 7a 46 69 6c 65 73 79 73 74 65  char *zFilesyste
2a3f0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
2a400 2f 2a 20 46 69 6c 65 73 79 73 74 65 6d 20 74 79  /* Filesystem ty
2a410 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 63  pe name */.    c
2a420 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
2a430 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64  methods *pMethod
2a440 73 3b 20 20 20 2f 2a 20 41 70 70 72 6f 70 72 69  s;   /* Appropri
2a450 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  ate locking meth
2a460 6f 64 20 2a 2f 0a 20 20 7d 20 61 4d 61 70 5b 5d  od */.  } aMap[]
2a470 20 3d 20 7b 0a 20 20 20 20 7b 20 22 68 66 73 22   = {.    { "hfs"
2a480 2c 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74  ,    &posixIoMet
2a490 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 75  hods },.    { "u
2a4a0 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78 49 6f  fs",    &posixIo
2a4b0 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b  Methods },.    {
2a4c0 20 22 61 66 70 66 73 22 2c 20 20 26 61 66 70 49   "afpfs",  &afpI
2a4d0 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20  oMethods },.    
2a4e0 7b 20 22 73 6d 62 66 73 22 2c 20 20 26 61 66 70  { "smbfs",  &afp
2a4f0 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20  IoMethods },.   
2a500 20 7b 20 22 77 65 62 64 61 76 22 2c 20 26 6e 6f   { "webdav", &no
2a510 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  lockIoMethods },
2a520 0a 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20  .    { 0, 0 }.  
2a530 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  };.  int i;.  st
2a540 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49 6e  ruct statfs fsIn
2a550 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  fo;.  struct flo
2a560 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20  ck lockInfo;..  
2a570 69 66 28 20 21 66 69 6c 65 50 61 74 68 20 29 7b  if( !filePath ){
2a580 0a 20 20 20 20 2f 2a 20 49 66 20 66 69 6c 65 50  .    /* If fileP
2a590 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d  ath==NULL that m
2a5a0 65 61 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c  eans we are deal
2a5b0 69 6e 67 20 77 69 74 68 20 61 20 74 72 61 6e 73  ing with a trans
2a5c0 69 65 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a  ient file.    **
2a5d0 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e   that does not n
2a5e0 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  eed to be locked
2a5f0 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  . */.    return 
2a600 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  &nolockIoMethods
2a610 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 61 74  ;.  }.  if( stat
2a620 66 73 28 66 69 6c 65 50 61 74 68 2c 20 26 66 73  fs(filePath, &fs
2a630 49 6e 66 6f 29 20 21 3d 20 2d 31 20 29 7b 0a 20  Info) != -1 ){. 
2a640 20 20 20 69 66 28 20 66 73 49 6e 66 6f 2e 66 5f     if( fsInfo.f_
2a650 66 6c 61 67 73 20 26 20 4d 4e 54 5f 52 44 4f 4e  flags & MNT_RDON
2a660 4c 59 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  LY ){.      retu
2a670 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68  rn &nolockIoMeth
2a680 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ods;.    }.    f
2a690 6f 72 28 69 3d 30 3b 20 61 4d 61 70 5b 69 5d 2e  or(i=0; aMap[i].
2a6a0 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 69 2b 2b  zFilesystem; i++
2a6b0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
2a6c0 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74  cmp(fsInfo.f_fst
2a6d0 79 70 65 6e 61 6d 65 2c 20 61 4d 61 70 5b 69 5d  ypename, aMap[i]
2a6e0 2e 7a 46 69 6c 65 73 79 73 74 65 6d 29 3d 3d 30  .zFilesystem)==0
2a6f0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
2a700 72 6e 20 61 4d 61 70 5b 69 5d 2e 70 4d 65 74 68  rn aMap[i].pMeth
2a710 6f 64 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ods;.      }.   
2a720 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 66   }.  }..  /* Def
2a730 61 75 6c 74 20 63 61 73 65 2e 20 48 61 6e 64 6c  ault case. Handl
2a740 65 73 2c 20 61 6d 6f 6e 67 73 74 20 6f 74 68 65  es, amongst othe
2a750 72 73 2c 20 22 6e 66 73 22 2e 0a 20 20 2a 2a 20  rs, "nfs"..  ** 
2a760 54 65 73 74 20 62 79 74 65 2d 72 61 6e 67 65 20  Test byte-range 
2a770 6c 6f 63 6b 20 75 73 69 6e 67 20 66 63 6e 74 6c  lock using fcntl
2a780 28 29 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 20  (). If the call 
2a790 73 75 63 63 65 65 64 73 2c 20 0a 20 20 2a 2a 20  succeeds, .  ** 
2a7a0 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
2a7b0 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70  file-system supp
2a7c0 6f 72 74 73 20 50 4f 53 49 58 20 73 74 79 6c 65  orts POSIX style
2a7d0 20 6c 6f 63 6b 73 2e 20 0a 20 20 2a 2f 0a 20 20   locks. .  */.  
2a7e0 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d  lockInfo.l_len =
2a7f0 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   1;.  lockInfo.l
2a800 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f  _start = 0;.  lo
2a810 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20  ckInfo.l_whence 
2a820 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f  = SEEK_SET;.  lo
2a830 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20  ckInfo.l_type = 
2a840 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f  F_RDLCK;.  if( o
2a850 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20  sFcntl(pNew->h, 
2a860 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e  F_GETLK, &lockIn
2a870 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20  fo)!=-1 ) {.    
2a880 69 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66  if( strcmp(fsInf
2a890 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20  o.f_fstypename, 
2a8a0 22 6e 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  "nfs")==0 ){.   
2a8b0 20 20 20 72 65 74 75 72 6e 20 26 6e 66 73 49 6f     return &nfsIo
2a8c0 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 20 65  Methods;.    } e
2a8d0 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 65 74 75  lse {.      retu
2a8e0 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f  rn &posixIoMetho
2a8f0 64 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ds;.    }.  }els
2a900 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 64  e{.    return &d
2a910 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b  otlockIoMethods;
2a920 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f  .  }.}.static co
2a930 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
2a940 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e  ethods .  *(*con
2a950 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  st autolockIoFin
2a960 64 65 72 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  der)(const char*
2a970 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20 61 75  ,unixFile*) = au
2a980 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d  tolockIoFinderIm
2a990 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64  pl;..#endif /* d
2a9a0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
2a9b0 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
2a9c0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2a9d0 20 2a 2f 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f   */..#if OS_VXWO
2a9e0 52 4b 53 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 22  RKS./*.** This "
2a9f0 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e  finder" function
2aa00 20 66 6f 72 20 56 78 57 6f 72 6b 73 20 63 68 65   for VxWorks che
2aa10 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 70 6f  cks to see if po
2aa20 73 69 78 20 61 64 76 69 73 6f 72 79 0a 2a 2a 20  six advisory.** 
2aa30 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 2e 20 20  locking works.  
2aa40 49 66 20 69 74 20 64 6f 65 73 2c 20 74 68 65 6e  If it does, then
2aa50 20 74 68 61 74 20 69 73 20 77 68 61 74 20 69 73   that is what is
2aa60 20 75 73 65 64 2e 20 20 49 66 20 69 74 20 64 6f   used.  If it do
2aa70 65 73 20 6e 6f 74 0a 2a 2a 20 77 6f 72 6b 2c 20  es not.** work, 
2aa80 74 68 65 6e 20 66 61 6c 6c 62 61 63 6b 20 74 6f  then fallback to
2aa90 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   named semaphore
2aaa0 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61   locking..*/.sta
2aab0 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
2aac0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 76 78  3_io_methods *vx
2aad0 77 6f 72 6b 73 49 6f 46 69 6e 64 65 72 49 6d 70  worksIoFinderImp
2aae0 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  l(.  const char 
2aaf0 2a 66 69 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a  *filePath,    /*
2ab00 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
2ab10 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
2ab20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 20  unixFile *pNew  
2ab30 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
2ab40 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74  open file object
2ab50 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
2ab60 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a  flock lockInfo;.
2ab70 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61 74 68  .  if( !filePath
2ab80 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66 69   ){.    /* If fi
2ab90 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61  lePath==NULL tha
2aba0 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64  t means we are d
2abb0 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 74 72  ealing with a tr
2abc0 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20 20 20  ansient file.   
2abd0 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f   ** that does no
2abe0 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63  t need to be loc
2abf0 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  ked. */.    retu
2ac00 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68  rn &nolockIoMeth
2ac10 6f 64 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  ods;.  }..  /* T
2ac20 65 73 74 20 69 66 20 66 63 6e 74 6c 28 29 20 69  est if fcntl() i
2ac30 73 20 73 75 70 70 6f 72 74 65 64 20 61 6e 64 20  s supported and 
2ac40 75 73 65 20 50 4f 53 49 58 20 73 74 79 6c 65 20  use POSIX style 
2ac50 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 20 4f 74 68 65  locks..  ** Othe
2ac60 72 77 69 73 65 20 66 61 6c 6c 20 62 61 63 6b 20  rwise fall back 
2ac70 74 6f 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d  to the named sem
2ac80 61 70 68 6f 72 65 20 6d 65 74 68 6f 64 2e 0a 20  aphore method.. 
2ac90 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   */.  lockInfo.l
2aca0 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b  _len = 1;.  lock
2acb0 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30  Info.l_start = 0
2acc0 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77  ;.  lockInfo.l_w
2acd0 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
2ace0 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74  ;.  lockInfo.l_t
2acf0 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20  ype = F_RDLCK;. 
2ad00 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65   if( osFcntl(pNe
2ad10 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26  w->h, F_GETLK, &
2ad20 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20  lockInfo)!=-1 ) 
2ad30 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70 6f  {.    return &po
2ad40 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  sixIoMethods;.  
2ad50 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
2ad60 6e 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73 3b  n &semIoMethods;
2ad70 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f  .  }.}.static co
2ad80 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
2ad90 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e  ethods .  *(*con
2ada0 73 74 20 76 78 77 6f 72 6b 73 49 6f 46 69 6e 64  st vxworksIoFind
2adb0 65 72 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  er)(const char*,
2adc0 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20 76 78 77  unixFile*) = vxw
2add0 6f 72 6b 73 49 6f 46 69 6e 64 65 72 49 6d 70 6c  orksIoFinderImpl
2ade0 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f  ;..#endif /* OS_
2adf0 56 58 57 4f 52 4b 53 20 2a 2f 0a 0a 2f 2a 0a 2a  VXWORKS */../*.*
2ae00 2a 20 41 6e 20 61 62 73 74 72 61 63 74 20 74 79  * An abstract ty
2ae10 70 65 20 66 6f 72 20 61 20 70 6f 69 6e 74 65 72  pe for a pointer
2ae20 20 74 6f 20 61 6e 20 49 4f 20 6d 65 74 68 6f 64   to an IO method
2ae30 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   finder function
2ae40 3a 0a 2a 2f 0a 74 79 70 65 64 65 66 20 63 6f 6e  :.*/.typedef con
2ae50 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
2ae60 74 68 6f 64 73 20 2a 28 2a 66 69 6e 64 65 72 5f  thods *(*finder_
2ae70 74 79 70 65 29 28 63 6f 6e 73 74 20 63 68 61 72  type)(const char
2ae80 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 3b 0a 0a 0a  *,unixFile*);...
2ae90 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
2aea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aeb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
2aee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74  ********** sqlit
2af00 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a  e3_vfs methods *
2af10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2af20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
2af30 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20  * This division 
2af40 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70  contains the imp
2af50 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d  lementation of m
2af60 65 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a  ethods on the.**
2af70 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a   sqlite3_vfs obj
2af80 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  ect..*/../*.** I
2af90 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f  nitialize the co
2afa0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 75 6e  ntents of the un
2afb0 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65  ixFile structure
2afc0 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70   pointed to by p
2afd0 49 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  Id..*/.static in
2afe0 74 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  t fillInUnixFile
2aff0 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
2b000 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 50  *pVfs,      /* P
2b010 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62  ointer to vfs ob
2b020 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 68 2c  ject */.  int h,
2b030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b040 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64    /* Open file d
2b050 65 73 63 72 69 70 74 6f 72 20 6f 66 20 66 69 6c  escriptor of fil
2b060 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a  e being opened *
2b070 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
2b080 20 2a 70 49 64 2c 20 20 20 20 20 20 2f 2a 20 57   *pId,      /* W
2b090 72 69 74 65 20 74 6f 20 74 68 65 20 75 6e 69 78  rite to the unix
2b0a0 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 68  File structure h
2b0b0 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ere */.  const c
2b0c0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
2b0d0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
2b0e0 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  file being opene
2b0f0 64 20 2a 2f 0a 20 20 69 6e 74 20 63 74 72 6c 46  d */.  int ctrlF
2b100 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f  lags           /
2b110 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 55  * Zero or more U
2b120 4e 49 58 46 49 4c 45 5f 2a 20 76 61 6c 75 65 73  NIXFILE_* values
2b130 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 73   */.){.  const s
2b140 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2b150 73 20 2a 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  s *pLockingStyle
2b160 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  ;.  unixFile *pN
2b170 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  ew = (unixFile *
2b180 29 70 49 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  )pId;.  int rc =
2b190 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
2b1a0 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 49 6e  ssert( pNew->pIn
2b1b0 6f 64 65 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a 20 20  ode==NULL );..  
2b1c0 2f 2a 20 55 73 75 61 6c 6c 79 20 74 68 65 20 70  /* Usually the p
2b1d0 61 74 68 20 7a 46 69 6c 65 6e 61 6d 65 20 73 68  ath zFilename sh
2b1e0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 20 72 65  ould not be a re
2b1f0 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2e  lative pathname.
2b200 20 54 68 65 0a 20 20 2a 2a 20 65 78 63 65 70 74   The.  ** except
2b210 69 6f 6e 20 69 73 20 77 68 65 6e 20 6f 70 65 6e  ion is when open
2b220 69 6e 67 20 74 68 65 20 70 72 6f 78 79 20 22 63  ing the proxy "c
2b230 6f 6e 63 68 22 20 66 69 6c 65 20 69 6e 20 62 75  onch" file in bu
2b240 69 6c 64 73 20 74 68 61 74 0a 20 20 2a 2a 20 69  ilds that.  ** i
2b250 6e 63 6c 75 64 65 20 74 68 65 20 73 70 65 63 69  nclude the speci
2b260 61 6c 20 41 70 70 6c 65 20 6c 6f 63 6b 69 6e 67  al Apple locking
2b270 20 73 74 79 6c 65 73 2e 0a 20 20 2a 2f 0a 23 69   styles..  */.#i
2b280 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
2b290 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
2b2a0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2b2b0 59 4c 45 0a 20 20 61 73 73 65 72 74 28 20 7a 46  YLE.  assert( zF
2b2c0 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46  ilename==0 || zF
2b2d0 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20  ilename[0]=='/' 
2b2e0 0a 20 20 20 20 7c 7c 20 70 56 66 73 2d 3e 70 41  .    || pVfs->pA
2b2f0 70 70 44 61 74 61 3d 3d 28 76 6f 69 64 2a 29 26  ppData==(void*)&
2b300 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
2b310 20 29 3b 0a 23 65 6c 73 65 0a 20 20 61 73 73 65   );.#else.  asse
2b320 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  rt( zFilename==0
2b330 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   || zFilename[0]
2b340 3d 3d 27 2f 27 20 29 3b 0a 23 65 6e 64 69 66 0a  =='/' );.#endif.
2b350 0a 20 20 2f 2a 20 4e 6f 20 6c 6f 63 6b 69 6e 67  .  /* No locking
2b360 20 6f 63 63 75 72 73 20 69 6e 20 74 65 6d 70 6f   occurs in tempo
2b370 72 61 72 79 20 66 69 6c 65 73 20 2a 2f 0a 20 20  rary files */.  
2b380 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d  assert( zFilenam
2b390 65 21 3d 30 20 7c 7c 20 28 63 74 72 6c 46 6c 61  e!=0 || (ctrlFla
2b3a0 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 4e 4f  gs & UNIXFILE_NO
2b3b0 4c 4f 43 4b 29 21 3d 30 20 29 3b 0a 0a 20 20 4f  LOCK)!=0 );..  O
2b3c0 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 20 20  STRACE(("OPEN   
2b3d0 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68 2c 20   %-3d %s\n", h, 
2b3e0 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 70  zFilename));.  p
2b3f0 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 4e  New->h = h;.  pN
2b400 65 77 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b  ew->pVfs = pVfs;
2b410 0a 20 20 70 4e 65 77 2d 3e 7a 50 61 74 68 20 3d  .  pNew->zPath =
2b420 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 70 4e   zFilename;.  pN
2b430 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 3d 20  ew->ctrlFlags = 
2b440 28 75 38 29 63 74 72 6c 46 6c 61 67 73 3b 0a 23  (u8)ctrlFlags;.#
2b450 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
2b460 41 50 5f 53 49 5a 45 3e 30 0a 20 20 70 4e 65 77  AP_SIZE>0.  pNew
2b470 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20  ->mmapSizeMax = 
2b480 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2b490 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 23 65 6e 64  fig.szMmap;.#end
2b4a0 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  if.  if( sqlite3
2b4b0 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 28 28 63  _uri_boolean(((c
2b4c0 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
2b4d0 49 4c 45 5f 55 52 49 29 20 3f 20 7a 46 69 6c 65  ILE_URI) ? zFile
2b4e0 6e 61 6d 65 20 3a 20 30 29 2c 0a 20 20 20 20 20  name : 0),.     
2b4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b500 20 20 20 20 20 20 22 70 73 6f 77 22 2c 20 53 51        "psow", SQ
2b510 4c 49 54 45 5f 50 4f 57 45 52 53 41 46 45 5f 4f  LITE_POWERSAFE_O
2b520 56 45 52 57 52 49 54 45 29 20 29 7b 0a 20 20 20  VERWRITE) ){.   
2b530 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73   pNew->ctrlFlags
2b540 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f   |= UNIXFILE_PSO
2b550 57 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 72  W;.  }.  if( str
2b560 63 6d 70 28 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c  cmp(pVfs->zName,
2b570 22 75 6e 69 78 2d 65 78 63 6c 22 29 3d 3d 30 20  "unix-excl")==0 
2b580 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72  ){.    pNew->ctr
2b590 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
2b5a0 4c 45 5f 45 58 43 4c 3b 0a 20 20 7d 0a 0a 23 69  LE_EXCL;.  }..#i
2b5b0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 70  f OS_VXWORKS.  p
2b5c0 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78 77 6f 72  New->pId = vxwor
2b5d0 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 7a 46 69  ksFindFileId(zFi
2b5e0 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70  lename);.  if( p
2b5f0 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29 7b 0a 20  New->pId==0 ){. 
2b600 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20     ctrlFlags |= 
2b610 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b  UNIXFILE_NOLOCK;
2b620 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2b630 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64  _NOMEM;.  }.#end
2b640 69 66 0a 0a 20 20 69 66 28 20 63 74 72 6c 46 6c  if..  if( ctrlFl
2b650 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 4e  ags & UNIXFILE_N
2b660 4f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 4c 6f  OLOCK ){.    pLo
2b670 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 26 6e 6f  ckingStyle = &no
2b680 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
2b690 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63   }else{.    pLoc
2b6a0 6b 69 6e 67 53 74 79 6c 65 20 3d 20 28 2a 2a 28  kingStyle = (**(
2b6b0 66 69 6e 64 65 72 5f 74 79 70 65 2a 29 70 56 66  finder_type*)pVf
2b6c0 73 2d 3e 70 41 70 70 44 61 74 61 29 28 7a 46 69  s->pAppData)(zFi
2b6d0 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 29 3b 0a 23  lename, pNew);.#
2b6e0 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
2b6f0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
2b700 20 20 20 2f 2a 20 43 61 63 68 65 20 7a 46 69 6c     /* Cache zFil
2b710 65 6e 61 6d 65 20 69 6e 20 74 68 65 20 6c 6f 63  ename in the loc
2b720 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 28 41 46  king context (AF
2b730 50 20 61 6e 64 20 64 6f 74 6c 6f 63 6b 20 6f 76  P and dotlock ov
2b740 65 72 72 69 64 65 29 20 66 6f 72 0a 20 20 20 20  erride) for.    
2b750 2a 2a 20 70 72 6f 78 79 4c 6f 63 6b 20 61 63 74  ** proxyLock act
2b760 69 76 61 74 69 6f 6e 20 69 73 20 70 6f 73 73 69  ivation is possi
2b770 62 6c 65 20 28 72 65 6d 6f 74 65 20 70 72 6f 78  ble (remote prox
2b780 79 20 69 73 20 62 61 73 65 64 20 6f 6e 20 64 62  y is based on db
2b790 20 6e 61 6d 65 29 0a 20 20 20 20 2a 2a 20 7a 46   name).    ** zF
2b7a0 69 6c 65 6e 61 6d 65 20 72 65 6d 61 69 6e 73 20  ilename remains 
2b7b0 76 61 6c 69 64 20 75 6e 74 69 6c 20 66 69 6c 65  valid until file
2b7c0 20 69 73 20 63 6c 6f 73 65 64 2c 20 74 6f 20 73   is closed, to s
2b7d0 75 70 70 6f 72 74 20 2a 2f 0a 20 20 20 20 70 4e  upport */.    pN
2b7e0 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  ew->lockingConte
2b7f0 78 74 20 3d 20 28 76 6f 69 64 2a 29 7a 46 69 6c  xt = (void*)zFil
2b800 65 6e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20  ename;.#endif.  
2b810 7d 0a 0a 20 20 69 66 28 20 70 4c 6f 63 6b 69 6e  }..  if( pLockin
2b820 67 53 74 79 6c 65 20 3d 3d 20 26 70 6f 73 69 78  gStyle == &posix
2b830 49 6f 4d 65 74 68 6f 64 73 0a 23 69 66 20 64 65  IoMethods.#if de
2b840 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
2b850 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
2b860 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2b870 20 20 20 20 7c 7c 20 70 4c 6f 63 6b 69 6e 67 53      || pLockingS
2b880 74 79 6c 65 20 3d 3d 20 26 6e 66 73 49 6f 4d 65  tyle == &nfsIoMe
2b890 74 68 6f 64 73 0a 23 65 6e 64 69 66 0a 20 20 29  thods.#endif.  )
2b8a0 7b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d  {.    unixEnterM
2b8b0 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d  utex();.    rc =
2b8c0 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70   findInodeInfo(p
2b8d0 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f  New, &pNew->pIno
2b8e0 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  de);.    if( rc!
2b8f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b900 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72      /* If an err
2b910 6f 72 20 6f 63 63 75 72 72 65 64 20 69 6e 20 66  or occurred in f
2b920 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2c 20  indInodeInfo(), 
2b930 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64  close the file d
2b940 65 73 63 72 69 70 74 6f 72 0a 20 20 20 20 20 20  escriptor.      
2b950 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20  ** immediately, 
2b960 62 65 66 6f 72 65 20 72 65 6c 65 61 73 69 6e 67  before releasing
2b970 20 74 68 65 20 6d 75 74 65 78 2e 20 66 69 6e 64   the mutex. find
2b980 49 6e 6f 64 65 49 6e 66 6f 28 29 20 6d 61 79 20  InodeInfo() may 
2b990 66 61 69 6c 0a 20 20 20 20 20 20 2a 2a 20 69 6e  fail.      ** in
2b9a0 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a   two scenarios:.
2b9b0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
2b9c0 2a 20 20 20 28 61 29 20 41 20 63 61 6c 6c 20 74  *   (a) A call t
2b9d0 6f 20 66 73 74 61 74 28 29 20 66 61 69 6c 65 64  o fstat() failed
2b9e0 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 62 29  ..      **   (b)
2b9f0 20 41 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64   A malloc failed
2ba00 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
2ba10 20 2a 2a 20 53 63 65 6e 61 72 69 6f 20 28 62 29   ** Scenario (b)
2ba20 20 6d 61 79 20 6f 6e 6c 79 20 6f 63 63 75 72 20   may only occur 
2ba30 69 66 20 74 68 65 20 70 72 6f 63 65 73 73 20 69  if the process i
2ba40 73 20 68 6f 6c 64 69 6e 67 20 6e 6f 20 6f 74 68  s holding no oth
2ba50 65 72 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  er.      ** file
2ba60 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65   descriptors ope
2ba70 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69  n on the same fi
2ba80 6c 65 2e 20 49 66 20 74 68 65 72 65 20 77 65 72  le. If there wer
2ba90 65 20 6f 74 68 65 72 20 66 69 6c 65 0a 20 20 20  e other file.   
2baa0 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72     ** descriptor
2bab0 73 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2c 20  s on this file, 
2bac0 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f 63 20 77  then no malloc w
2bad0 6f 75 6c 64 20 62 65 20 72 65 71 75 69 72 65 64  ould be required
2bae0 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 66 69 6e   by.      ** fin
2baf0 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 20 49 66  dInodeInfo(). If
2bb00 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
2bb10 65 2c 20 69 74 20 69 73 20 71 75 69 74 65 20 73  e, it is quite s
2bb20 61 66 65 20 74 6f 20 63 6c 6f 73 65 0a 20 20 20  afe to close.   
2bb30 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20 68 20 2d     ** handle h -
2bb40 20 61 73 20 69 74 20 69 73 20 67 75 61 72 61 6e   as it is guaran
2bb50 74 65 65 64 20 74 68 61 74 20 6e 6f 20 70 6f 73  teed that no pos
2bb60 69 78 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 62 65  ix locks will be
2bb70 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 20 20   released.      
2bb80 2a 2a 20 62 79 20 64 6f 69 6e 67 20 73 6f 2e 0a  ** by doing so..
2bb90 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
2bba0 2a 20 49 66 20 73 63 65 6e 61 72 69 6f 20 28 61  * If scenario (a
2bbb0 29 20 63 61 75 73 65 64 20 74 68 65 20 65 72 72  ) caused the err
2bbc0 6f 72 20 74 68 65 6e 20 74 68 69 6e 67 73 20 61  or then things a
2bbd0 72 65 20 6e 6f 74 20 73 6f 20 73 61 66 65 2e 20  re not so safe. 
2bbe0 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70  The.      ** imp
2bbf0 6c 69 63 69 74 20 61 73 73 75 6d 70 74 69 6f 6e  licit assumption
2bc00 20 68 65 72 65 20 69 73 20 74 68 61 74 20 69 66   here is that if
2bc10 20 66 73 74 61 74 28 29 20 66 61 69 6c 73 2c 20   fstat() fails, 
2bc20 74 68 69 6e 67 73 20 61 72 65 20 69 6e 0a 20 20  things are in.  
2bc30 20 20 20 20 2a 2a 20 73 75 63 68 20 62 61 64 20      ** such bad 
2bc40 73 68 61 70 65 20 74 68 61 74 20 64 72 6f 70 70  shape that dropp
2bc50 69 6e 67 20 61 20 6c 6f 63 6b 20 6f 72 20 74 77  ing a lock or tw
2bc60 6f 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72  o doesn't matter
2bc70 20 6d 75 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a   much..      */.
2bc80 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
2bc90 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49  se(pNew, h, __LI
2bca0 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 68 20 3d  NE__);.      h =
2bcb0 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75   -1;.    }.    u
2bcc0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
2bcd0 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  .  }..#if SQLITE
2bce0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2bcf0 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64  STYLE && defined
2bd00 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 65 6c  (__APPLE__).  el
2bd10 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53  se if( pLockingS
2bd20 74 79 6c 65 20 3d 3d 20 26 61 66 70 49 6f 4d 65  tyle == &afpIoMe
2bd30 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20  thods ){.    /* 
2bd40 41 46 50 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73  AFP locking uses
2bd50 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73   the file path s
2bd60 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  o it needs to be
2bd70 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20   included in.   
2bd80 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f 63 6b 69   ** the afpLocki
2bd90 6e 67 43 6f 6e 74 65 78 74 2e 0a 20 20 20 20 2a  ngContext..    *
2bda0 2f 0a 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67  /.    afpLocking
2bdb0 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a 20  Context *pCtx;. 
2bdc0 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67     pNew->locking
2bdd0 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 20 3d  Context = pCtx =
2bde0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
2bdf0 34 28 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29  4( sizeof(*pCtx)
2be00 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78   );.    if( pCtx
2be10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
2be20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
2be30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2be40 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65 6e 61 6d   /* NB: zFilenam
2be50 65 20 65 78 69 73 74 73 20 61 6e 64 20 72 65 6d  e exists and rem
2be60 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c  ains valid until
2be70 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 6c 6f   the file is clo
2be80 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 61 63 63  sed.      ** acc
2be90 6f 72 64 69 6e 67 20 74 6f 20 72 65 71 75 69 72  ording to requir
2bea0 65 6d 65 6e 74 20 46 31 31 31 34 31 2e 20 20 53  ement F11141.  S
2beb0 6f 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64  o we do not need
2bec0 20 74 6f 20 6d 61 6b 65 20 61 0a 20 20 20 20 20   to make a.     
2bed0 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20   ** copy of the 
2bee0 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20  filename. */.   
2bef0 20 20 20 70 43 74 78 2d 3e 64 62 50 61 74 68 20     pCtx->dbPath 
2bf00 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20  = zFilename;.   
2bf10 20 20 20 70 43 74 78 2d 3e 72 65 73 65 72 76 65     pCtx->reserve
2bf20 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 72 61  d = 0;.      sra
2bf30 6e 64 6f 6d 64 65 76 28 29 3b 0a 20 20 20 20 20  ndomdev();.     
2bf40 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
2bf50 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69  );.      rc = fi
2bf60 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77  ndInodeInfo(pNew
2bf70 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29  , &pNew->pInode)
2bf80 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2bf90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2bfa0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2bfb0 65 28 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43  e(pNew->lockingC
2bfc0 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20  ontext);.       
2bfd0 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e   robust_close(pN
2bfe0 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  ew, h, __LINE__)
2bff0 3b 0a 20 20 20 20 20 20 20 20 68 20 3d 20 2d 31  ;.        h = -1
2c000 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2c010 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
2c020 3b 20 20 20 20 20 20 20 20 0a 20 20 20 20 7d 0a  ;        .    }.
2c030 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 65 6c    }.#endif..  el
2c040 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53  se if( pLockingS
2c050 74 79 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b  tyle == &dotlock
2c060 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  IoMethods ){.   
2c070 20 2f 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b   /* Dotfile lock
2c080 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c  ing uses the fil
2c090 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65  e path so it nee
2c0a0 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65  ds to be include
2c0b0 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  d in.    ** the 
2c0c0 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f  dotlockLockingCo
2c0d0 6e 74 65 78 74 20 0a 20 20 20 20 2a 2f 0a 20 20  ntext .    */.  
2c0e0 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c    char *zLockFil
2c0f0 65 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69 6c 65  e;.    int nFile
2c100 6e 61 6d 65 3b 0a 20 20 20 20 61 73 73 65 72 74  name;.    assert
2c110 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20 29  ( zFilename!=0 )
2c120 3b 0a 20 20 20 20 6e 46 69 6c 65 6e 61 6d 65 20  ;.    nFilename 
2c130 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 46  = (int)strlen(zF
2c140 69 6c 65 6e 61 6d 65 29 20 2b 20 36 3b 0a 20 20  ilename) + 6;.  
2c150 20 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63    zLockFile = (c
2c160 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  har *)sqlite3_ma
2c170 6c 6c 6f 63 36 34 28 6e 46 69 6c 65 6e 61 6d 65  lloc64(nFilename
2c180 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c 6f 63 6b  );.    if( zLock
2c190 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  File==0 ){.     
2c1a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
2c1b0 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
2c1c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
2c1d0 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d 65 2c  rintf(nFilename,
2c1e0 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22 25 73 22   zLockFile, "%s"
2c1f0 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 2c   DOTLOCK_SUFFIX,
2c200 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20   zFilename);.   
2c210 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63   }.    pNew->loc
2c220 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 7a 4c  kingContext = zL
2c230 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a 23 69  ockFile;.  }..#i
2c240 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 65  f OS_VXWORKS.  e
2c250 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67  lse if( pLocking
2c260 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d 49 6f 4d  Style == &semIoM
2c270 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a  ethods ){.    /*
2c280 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   Named semaphore
2c290 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68   locking uses th
2c2a0 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69  e file path so i
2c2b0 74 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  t needs to be.  
2c2c0 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64 20 69 6e    ** included in
2c2d0 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69 6e 67 43   the semLockingC
2c2e0 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f 0a 20 20  ontext.    */.  
2c2f0 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
2c300 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e  ();.    rc = fin
2c310 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c  dInodeInfo(pNew,
2c320 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b   &pNew->pInode);
2c330 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51  .    if( (rc==SQ
2c340 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28 70 4e 65  LITE_OK) && (pNe
2c350 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3d  w->pInode->pSem=
2c360 3d 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20  =NULL) ){.      
2c370 63 68 61 72 20 2a 7a 53 65 6d 4e 61 6d 65 20 3d  char *zSemName =
2c380 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61   pNew->pInode->a
2c390 53 65 6d 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69  SemName;.      i
2c3a0 6e 74 20 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt n;.      sqli
2c3b0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58  te3_snprintf(MAX
2c3c0 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 53 65 6d 4e  _PATHNAME, zSemN
2c3d0 61 6d 65 2c 20 22 2f 25 73 2e 73 65 6d 22 2c 0a  ame, "/%s.sem",.
2c3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c3f0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 64         pNew->pId
2c400 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
2c410 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 20 6e 3d  );.      for( n=
2c420 31 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3b 20  1; zSemName[n]; 
2c430 6e 2b 2b 20 29 0a 20 20 20 20 20 20 20 20 69 66  n++ ).        if
2c440 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27  ( zSemName[n]=='
2c450 2f 27 20 29 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d  /' ) zSemName[n]
2c460 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20 70 4e   = '_';.      pN
2c470 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  ew->pInode->pSem
2c480 20 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a 53 65 6d   = sem_open(zSem
2c490 4e 61 6d 65 2c 20 4f 5f 43 52 45 41 54 2c 20 30  Name, O_CREAT, 0
2c4a0 36 36 36 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  666, 1);.      i
2c4b0 66 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d  f( pNew->pInode-
2c4c0 3e 70 53 65 6d 20 3d 3d 20 53 45 4d 5f 46 41 49  >pSem == SEM_FAI
2c4d0 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 72  LED ){.        r
2c4e0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2c4f0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
2c500 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65  pInode->aSemName
2c510 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  [0] = '\0';.    
2c520 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e    }.    }.    un
2c530 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
2c540 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
2c550 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
2c560 4e 65 77 2c 20 30 29 3b 0a 23 69 66 20 4f 53 5f  New, 0);.#if OS_
2c570 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63  VXWORKS.  if( rc
2c580 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2c590 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20 72 6f     if( h>=0 ) ro
2c5a0 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c  bust_close(pNew,
2c5b0 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20   h, __LINE__);. 
2c5c0 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 6f     h = -1;.    o
2c5d0 73 55 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d  sUnlink(zFilenam
2c5e0 65 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74  e);.    pNew->ct
2c5f0 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
2c600 49 4c 45 5f 44 45 4c 45 54 45 3b 0a 20 20 7d 0a  ILE_DELETE;.  }.
2c610 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 21  #endif.  if( rc!
2c620 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2c630 20 20 69 66 28 20 68 3e 3d 30 20 29 20 72 6f 62    if( h>=0 ) rob
2c640 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20  ust_close(pNew, 
2c650 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
2c660 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d  }else{.    pNew-
2c670 3e 70 4d 65 74 68 6f 64 20 3d 20 70 4c 6f 63 6b  >pMethod = pLock
2c680 69 6e 67 53 74 79 6c 65 3b 0a 20 20 20 20 4f 70  ingStyle;.    Op
2c690 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20  enCounter(+1);. 
2c6a0 20 20 20 76 65 72 69 66 79 44 62 46 69 6c 65 28     verifyDbFile(
2c6b0 70 4e 65 77 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pNew);.  }.  ret
2c6c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2c6d0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65   Return the name
2c6e0 20 6f 66 20 61 20 64 69 72 65 63 74 6f 72 79 20   of a directory 
2c6f0 69 6e 20 77 68 69 63 68 20 74 6f 20 70 75 74 20  in which to put 
2c700 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e  temporary files.
2c710 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74 61 62  .** If no suitab
2c720 6c 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  le temporary fil
2c730 65 20 64 69 72 65 63 74 6f 72 79 20 63 61 6e 20  e directory can 
2c740 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  be found, return
2c750 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63   NULL..*/.static
2c760 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 69   const char *uni
2c770 78 54 65 6d 70 46 69 6c 65 44 69 72 28 76 6f 69  xTempFileDir(voi
2c780 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  d){.  static con
2c790 73 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b  st char *azDirs[
2c7a0 5d 20 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20  ] = {.     0,.  
2c7b0 20 20 20 30 2c 0a 20 20 20 20 20 30 2c 0a 20 20     0,.     0,.  
2c7c0 20 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20     "/var/tmp",. 
2c7d0 20 20 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a      "/usr/tmp",.
2c7e0 20 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20       "/tmp",.   
2c7f0 20 20 30 20 20 20 20 20 20 20 20 2f 2a 20 4c 69    0        /* Li
2c800 73 74 20 74 65 72 6d 69 6e 61 74 6f 72 20 2a 2f  st terminator */
2c810 0a 20 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64  .  };.  unsigned
2c820 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
2c830 20 73 74 61 74 20 62 75 66 3b 0a 20 20 63 6f 6e   stat buf;.  con
2c840 73 74 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20  st char *zDir = 
2c850 30 3b 0a 0a 20 20 61 7a 44 69 72 73 5b 30 5d 20  0;..  azDirs[0] 
2c860 3d 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64  = sqlite3_temp_d
2c870 69 72 65 63 74 6f 72 79 3b 0a 20 20 69 66 28 20  irectory;.  if( 
2c880 21 61 7a 44 69 72 73 5b 31 5d 20 29 20 61 7a 44  !azDirs[1] ) azD
2c890 69 72 73 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28  irs[1] = getenv(
2c8a0 22 53 51 4c 49 54 45 5f 54 4d 50 44 49 52 22 29  "SQLITE_TMPDIR")
2c8b0 3b 0a 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b  ;.  if( !azDirs[
2c8c0 32 5d 20 29 20 61 7a 44 69 72 73 5b 32 5d 20 3d  2] ) azDirs[2] =
2c8d0 20 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22   getenv("TMPDIR"
2c8e0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
2c8f0 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73  sizeof(azDirs)/s
2c900 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29  izeof(azDirs[0])
2c910 3b 20 7a 44 69 72 3d 61 7a 44 69 72 73 5b 69 2b  ; zDir=azDirs[i+
2c920 2b 5d 29 7b 0a 20 20 20 20 69 66 28 20 7a 44 69  +]){.    if( zDi
2c930 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  r==0 ) continue;
2c940 0a 20 20 20 20 69 66 28 20 6f 73 53 74 61 74 28  .    if( osStat(
2c950 7a 44 69 72 2c 20 26 62 75 66 29 20 29 20 63 6f  zDir, &buf) ) co
2c960 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
2c970 21 53 5f 49 53 44 49 52 28 62 75 66 2e 73 74 5f  !S_ISDIR(buf.st_
2c980 6d 6f 64 65 29 20 29 20 63 6f 6e 74 69 6e 75 65  mode) ) continue
2c990 3b 0a 20 20 20 20 69 66 28 20 6f 73 41 63 63 65  ;.    if( osAcce
2c9a0 73 73 28 7a 44 69 72 2c 20 30 37 29 20 29 20 63  ss(zDir, 07) ) c
2c9b0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 62 72 65  ontinue;.    bre
2c9c0 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
2c9d0 20 7a 44 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   zDir;.}../*.** 
2c9e0 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61  Create a tempora
2c9f0 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20  ry file name in 
2ca00 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74  zBuf.  zBuf must
2ca10 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a   be allocated.**
2ca20 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
2ca30 70 72 6f 63 65 73 73 20 61 6e 64 20 6d 75 73 74  process and must
2ca40 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74   be big enough t
2ca50 6f 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 0a  o hold at least.
2ca60 2a 2a 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  ** pVfs->mxPathn
2ca70 61 6d 65 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74  ame bytes..*/.st
2ca80 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74  atic int unixGet
2ca90 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75  Tempname(int nBu
2caa0 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
2cab0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
2cac0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 43 68  nsigned char zCh
2cad0 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63  ars[] =.    "abc
2cae0 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73  defghijklmnopqrs
2caf0 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42  tuvwxyz".    "AB
2cb00 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52  CDEFGHIJKLMNOPQR
2cb10 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30  STUVWXYZ".    "0
2cb20 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20 75 6e  123456789";.  un
2cb30 73 69 67 6e 65 64 20 69 6e 74 20 69 2c 20 6a 3b  signed int i, j;
2cb40 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2cb50 44 69 72 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20  Dir;..  /* It's 
2cb60 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  odd to simulate 
2cb70 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65  an io-error here
2cb80 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69  , but really thi
2cb90 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75  s is just.  ** u
2cba0 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f  sing the io-erro
2cbb0 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65  r infrastructure
2cbc0 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51   to test that SQ
2cbd0 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69  Lite handles thi
2cbe0 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
2cbf0 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20  failing. .  */. 
2cc00 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
2cc10 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
2cc20 49 4f 45 52 52 20 29 3b 0a 0a 20 20 7a 44 69 72  IOERR );..  zDir
2cc30 20 3d 20 75 6e 69 78 54 65 6d 70 46 69 6c 65 44   = unixTempFileD
2cc40 69 72 28 29 3b 0a 20 20 69 66 28 20 7a 44 69 72  ir();.  if( zDir
2cc50 3d 3d 30 20 29 20 7a 44 69 72 20 3d 20 22 2e 22  ==0 ) zDir = "."
2cc60 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
2cc70 61 74 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  at the output bu
2cc80 66 66 65 72 20 69 73 20 6c 61 72 67 65 20 65 6e  ffer is large en
2cc90 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74 65 6d  ough for the tem
2cca0 70 6f 72 61 72 79 20 66 69 6c 65 20 0a 20 20 2a  porary file .  *
2ccb0 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74 20 69 73  * name. If it is
2ccc0 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53 51 4c   not, return SQL
2ccd0 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a  ITE_ERROR..  */.
2cce0 20 20 69 66 28 20 28 73 74 72 6c 65 6e 28 7a 44    if( (strlen(zD
2ccf0 69 72 29 20 2b 20 73 74 72 6c 65 6e 28 53 51 4c  ir) + strlen(SQL
2cd00 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52  ITE_TEMP_FILE_PR
2cd10 45 46 49 58 29 20 2b 20 31 38 29 20 3e 3d 20 28  EFIX) + 18) >= (
2cd20 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 7b 0a 20  size_t)nBuf ){. 
2cd30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2cd40 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 64  _ERROR;.  }..  d
2cd50 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  o{.    sqlite3_s
2cd60 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31 38 2c  nprintf(nBuf-18,
2cd70 20 7a 42 75 66 2c 20 22 25 73 2f 22 53 51 4c 49   zBuf, "%s/"SQLI
2cd80 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45  TE_TEMP_FILE_PRE
2cd90 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20  FIX, zDir);.    
2cda0 6a 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  j = (int)strlen(
2cdb0 7a 42 75 66 29 3b 0a 20 20 20 20 73 71 6c 69 74  zBuf);.    sqlit
2cdc0 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35  e3_randomness(15
2cdd0 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 20  , &zBuf[j]);.   
2cde0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20   for(i=0; i<15; 
2cdf0 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  i++, j++){.     
2ce00 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72   zBuf[j] = (char
2ce10 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67  )zChars[ ((unsig
2ce20 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d  ned char)zBuf[j]
2ce30 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73  )%(sizeof(zChars
2ce40 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a 20 20  )-1) ];.    }.  
2ce50 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20    zBuf[j] = 0;. 
2ce60 20 20 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d 20 30     zBuf[j+1] = 0
2ce70 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6f 73 41 63  ;.  }while( osAc
2ce80 63 65 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20  cess(zBuf,0)==0 
2ce90 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
2cea0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51  TE_OK;.}..#if SQ
2ceb0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2cec0 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
2ced0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
2cee0 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 74 6f  /*.** Routine to
2cef0 20 74 72 61 6e 73 66 6f 72 6d 20 61 20 75 6e 69   transform a uni
2cf00 78 46 69 6c 65 20 69 6e 74 6f 20 61 20 70 72 6f  xFile into a pro
2cf10 78 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69 78 46  xy-locking unixF
2cf20 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ile..** Implemen
2cf30 74 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 72  tation in the pr
2cf40 6f 78 79 2d 6c 6f 63 6b 20 64 69 76 69 73 69 6f  oxy-lock divisio
2cf50 6e 2c 20 62 75 74 20 75 73 65 64 20 62 79 20 75  n, but used by u
2cf60 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a 20 69 66 20  nixOpen().** if 
2cf70 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52  SQLITE_PREFER_PR
2cf80 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 69 73 20 64  OXY_LOCKING is d
2cf90 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  efined..*/.stati
2cfa0 63 20 69 6e 74 20 70 72 6f 78 79 54 72 61 6e 73  c int proxyTrans
2cfb0 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69  formUnixFile(uni
2cfc0 78 46 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 63 68  xFile*, const ch
2cfd0 61 72 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ar*);.#endif../*
2cfe0 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61  .** Search for a
2cff0 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65  n unused file de
2d000 73 63 72 69 70 74 6f 72 20 74 68 61 74 20 77 61  scriptor that wa
2d010 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20  s opened on the 
2d020 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c  database .** fil
2d030 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c  e (not a journal
2d040 20 6f 72 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   or master-journ
2d050 61 6c 20 66 69 6c 65 29 20 69 64 65 6e 74 69 66  al file) identif
2d060 69 65 64 20 62 79 20 70 61 74 68 6e 61 6d 65 0a  ied by pathname.
2d070 2a 2a 20 7a 50 61 74 68 20 77 69 74 68 20 53 51  ** zPath with SQ
2d080 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c  LITE_OPEN_XXX fl
2d090 61 67 73 20 6d 61 74 63 68 69 6e 67 20 74 68 6f  ags matching tho
2d0a0 73 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  se passed as the
2d0b0 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d   second.** argum
2d0c0 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
2d0d0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68  tion..**.** Such
2d0e0 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
2d0f0 6f 72 20 6d 61 79 20 65 78 69 73 74 20 69 66 20  or may exist if 
2d100 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
2d110 63 74 69 6f 6e 20 77 61 73 20 63 6c 6f 73 65 64  ction was closed
2d120 0a 2a 2a 20 62 75 74 20 74 68 65 20 61 73 73 6f  .** but the asso
2d130 63 69 61 74 65 64 20 66 69 6c 65 20 64 65 73 63  ciated file desc
2d140 72 69 70 74 6f 72 20 63 6f 75 6c 64 20 6e 6f 74  riptor could not
2d150 20 62 65 20 63 6c 6f 73 65 64 20 62 65 63 61 75   be closed becau
2d160 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72  se some.** other
2d170 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2d180 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d   open on the sam
2d190 65 20 66 69 6c 65 20 69 73 20 68 6f 6c 64 69 6e  e file is holdin
2d1a0 67 20 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a  g a file-lock..*
2d1b0 2a 20 52 65 66 65 72 20 74 6f 20 63 6f 6d 6d 65  * Refer to comme
2d1c0 6e 74 73 20 69 6e 20 74 68 65 20 75 6e 69 78 43  nts in the unixC
2d1d0 6c 6f 73 65 28 29 20 66 75 6e 63 74 69 6f 6e 20  lose() function 
2d1e0 61 6e 64 20 74 68 65 20 6c 65 6e 67 74 68 79 20  and the lengthy 
2d1f0 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73 63 72  comment.** descr
2d200 69 62 69 6e 67 20 22 50 6f 73 69 78 20 41 64 76  ibing "Posix Adv
2d210 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 22 20 61  isory Locking" a
2d220 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
2d230 68 69 73 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a  his file for .**
2d240 20 66 75 72 74 68 65 72 20 64 65 74 61 69 6c 73   further details
2d250 2e 20 41 6c 73 6f 2c 20 74 69 63 6b 65 74 20 23  . Also, ticket #
2d260 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  4018..**.** If a
2d270 20 73 75 69 74 61 62 6c 65 20 66 69 6c 65 20 64   suitable file d
2d280 65 73 63 72 69 70 74 6f 72 20 69 73 20 66 6f 75  escriptor is fou
2d290 6e 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 72  nd, then it is r
2d2a0 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a  eturned. If no.*
2d2b0 2a 20 73 75 63 68 20 66 69 6c 65 20 64 65 73 63  * such file desc
2d2c0 72 69 70 74 6f 72 20 69 73 20 6c 6f 63 61 74 65  riptor is locate
2d2d0 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65  d, -1 is returne
2d2e0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 55 6e 69  d..*/.static Uni
2d2f0 78 55 6e 75 73 65 64 46 64 20 2a 66 69 6e 64 52  xUnusedFd *findR
2d300 65 75 73 61 62 6c 65 46 64 28 63 6f 6e 73 74 20  eusableFd(const 
2d310 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74  char *zPath, int
2d320 20 66 6c 61 67 73 29 7b 0a 20 20 55 6e 69 78 55   flags){.  UnixU
2d330 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
2d340 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e   = 0;..  /* Do n
2d350 6f 74 20 73 65 61 72 63 68 20 66 6f 72 20 61 6e  ot search for an
2d360 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73   unused file des
2d370 63 72 69 70 74 6f 72 20 6f 6e 20 76 78 77 6f 72  criptor on vxwor
2d380 6b 73 2e 20 4e 6f 74 20 62 65 63 61 75 73 65 0a  ks. Not because.
2d390 20 20 2a 2a 20 76 78 77 6f 72 6b 73 20 77 6f 75    ** vxworks wou
2d3a0 6c 64 20 6e 6f 74 20 62 65 6e 65 66 69 74 20 66  ld not benefit f
2d3b0 72 6f 6d 20 74 68 65 20 63 68 61 6e 67 65 20 28  rom the change (
2d3c0 69 74 20 6d 69 67 68 74 2c 20 77 65 27 72 65 20  it might, we're 
2d3d0 6e 6f 74 20 73 75 72 65 29 2c 0a 20 20 2a 2a 20  not sure),.  ** 
2d3e0 62 75 74 20 62 65 63 61 75 73 65 20 6e 6f 20 77  but because no w
2d3f0 61 79 20 74 6f 20 74 65 73 74 20 69 74 20 69 73  ay to test it is
2d400 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c   currently avail
2d410 61 62 6c 65 2e 20 49 74 20 69 73 20 62 65 74 74  able. It is bett
2d420 65 72 20 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20  er .  ** not to 
2d430 72 69 73 6b 20 62 72 65 61 6b 69 6e 67 20 76 78  risk breaking vx
2d440 77 6f 72 6b 73 20 73 75 70 70 6f 72 74 20 66 6f  works support fo
2d450 72 20 74 68 65 20 73 61 6b 65 20 6f 66 20 73 75  r the sake of su
2d460 63 68 20 61 6e 20 6f 62 73 63 75 72 65 20 0a 20  ch an obscure . 
2d470 20 2a 2a 20 66 65 61 74 75 72 65 2e 20 20 2a 2f   ** feature.  */
2d480 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53  .#if !OS_VXWORKS
2d490 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73  .  struct stat s
2d4a0 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stat;           
2d4b0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
2d4c0 74 73 20 6f 66 20 73 74 61 74 28 29 20 63 61 6c  ts of stat() cal
2d4d0 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 20 73 74 61  l */..  /* A sta
2d4e0 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 66 61 69  t() call may fai
2d4f0 6c 20 66 6f 72 20 76 61 72 69 6f 75 73 20 72 65  l for various re
2d500 61 73 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 68  asons. If this h
2d510 61 70 70 65 6e 73 2c 20 69 74 20 69 73 0a 20 20  appens, it is.  
2d520 2a 2a 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69  ** almost certai
2d530 6e 20 74 68 61 74 20 61 6e 20 6f 70 65 6e 28 29  n that an open()
2d540 20 63 61 6c 6c 20 6f 6e 20 74 68 65 20 73 61 6d   call on the sam
2d550 65 20 70 61 74 68 20 77 69 6c 6c 20 61 6c 73 6f  e path will also
2d560 20 66 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72 20   fail..  ** For 
2d570 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 69 66 20  this reason, if 
2d580 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
2d590 69 6e 20 74 68 65 20 73 74 61 74 28 29 20 63 61  in the stat() ca
2d5a0 6c 6c 20 68 65 72 65 2c 20 69 74 20 69 73 0a 20  ll here, it is. 
2d5b0 20 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64 20   ** ignored and 
2d5c0 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  -1 is returned. 
2d5d0 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
2d5e0 74 72 79 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65  try to open a ne
2d5f0 77 20 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73 63  w file.  ** desc
2d600 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 73 61  riptor on the sa
2d610 6d 65 20 70 61 74 68 2c 20 66 61 69 6c 2c 20 61  me path, fail, a
2d620 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  nd return an err
2d630 6f 72 20 74 6f 20 53 51 4c 69 74 65 2e 0a 20 20  or to SQLite..  
2d640 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e 20 69 66 20  **.  ** Even if 
2d650 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 70 65  a subsequent ope
2d660 6e 28 29 20 63 61 6c 6c 20 64 6f 65 73 20 73 75  n() call does su
2d670 63 63 65 65 64 2c 20 74 68 65 20 63 6f 6e 73 65  cceed, the conse
2d680 71 75 65 6e 63 65 73 20 6f 66 0a 20 20 2a 2a 20  quences of.  ** 
2d690 6e 6f 74 20 73 65 61 72 63 68 69 6e 67 20 66 6f  not searching fo
2d6a0 72 20 61 20 72 65 75 73 61 62 6c 65 20 66 69 6c  r a reusable fil
2d6b0 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 72 65  e descriptor are
2d6c0 20 6e 6f 74 20 64 69 72 65 2e 20 20 2a 2f 0a 20   not dire.  */. 
2d6d0 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a   if( 0==osStat(z
2d6e0 50 61 74 68 2c 20 26 73 53 74 61 74 29 20 29 7b  Path, &sStat) ){
2d6f0 0a 20 20 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  .    unixInodeIn
2d700 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 0a 20 20 20  fo *pInode;..   
2d710 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
2d720 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20  );.    pInode = 
2d730 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 77  inodeList;.    w
2d740 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20  hile( pInode && 
2d750 28 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e  (pInode->fileId.
2d760 64 65 76 21 3d 73 53 74 61 74 2e 73 74 5f 64 65  dev!=sStat.st_de
2d770 76 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v.              
2d780 20 20 20 20 20 20 20 7c 7c 20 70 49 6e 6f 64 65         || pInode
2d790 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 21 3d 73 53  ->fileId.ino!=sS
2d7a0 74 61 74 2e 73 74 5f 69 6e 6f 29 20 29 7b 0a 20  tat.st_ino) ){. 
2d7b0 20 20 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70        pInode = p
2d7c0 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20  Inode->pNext;.  
2d7d0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 6e 6f    }.    if( pIno
2d7e0 64 65 20 29 7b 0a 20 20 20 20 20 20 55 6e 69 78  de ){.      Unix
2d7f0 55 6e 75 73 65 64 46 64 20 2a 2a 70 70 3b 0a 20  UnusedFd **pp;. 
2d800 20 20 20 20 20 66 6f 72 28 70 70 3d 26 70 49 6e       for(pp=&pIn
2d810 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 2a 70  ode->pUnused; *p
2d820 70 20 26 26 20 28 2a 70 70 29 2d 3e 66 6c 61 67  p && (*pp)->flag
2d830 73 21 3d 66 6c 61 67 73 3b 20 70 70 3d 26 28 28  s!=flags; pp=&((
2d840 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b 0a 20  *pp)->pNext));. 
2d850 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 2a       pUnused = *
2d860 70 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 55  pp;.      if( pU
2d870 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20  nused ){.       
2d880 20 2a 70 70 20 3d 20 70 55 6e 75 73 65 64 2d 3e   *pp = pUnused->
2d890 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
2d8a0 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61     }.    unixLea
2d8b0 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23  veMutex();.  }.#
2d8c0 65 6e 64 69 66 20 20 20 20 2f 2a 20 69 66 20 21  endif    /* if !
2d8d0 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 20 20  OS_VXWORKS */.  
2d8e0 72 65 74 75 72 6e 20 70 55 6e 75 73 65 64 3b 0a  return pUnused;.
2d8f0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
2d900 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2d910 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 20 74   by unixOpen() t
2d920 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
2d930 75 6e 69 78 20 70 65 72 6d 69 73 73 69 6f 6e 73  unix permissions
2d940 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65 20 6e 65  .** to create ne
2d950 77 20 66 69 6c 65 73 20 77 69 74 68 2e 20 49 66  w files with. If
2d960 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
2d970 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b  , then SQLITE_OK
2d980 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
2d990 61 6e 64 20 61 20 76 61 6c 75 65 20 73 75 69 74  and a value suit
2d9a0 61 62 6c 65 20 66 6f 72 20 70 61 73 73 69 6e 67  able for passing
2d9b0 20 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72   as the third ar
2d9c0 67 75 6d 65 6e 74 20 74 6f 20 6f 70 65 6e 28 32  gument to open(2
2d9d0 29 20 69 73 0a 2a 2a 20 77 72 69 74 74 65 6e 20  ) is.** written 
2d9e0 74 6f 20 2a 70 4d 6f 64 65 2e 20 49 66 20 61 6e  to *pMode. If an
2d9f0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
2da00 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
2da10 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65  r code is .** re
2da20 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76  turned and the v
2da30 61 6c 75 65 20 6f 66 20 2a 70 4d 6f 64 65 20 69  alue of *pMode i
2da40 73 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64 2e 0a  s not modified..
2da50 2a 2a 0a 2a 2a 20 49 6e 20 6d 6f 73 74 20 63 61  **.** In most ca
2da60 73 65 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ses, this routin
2da70 65 20 73 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f  e sets *pMode to
2da80 20 30 2c 20 77 68 69 63 68 20 77 69 6c 6c 20 62   0, which will b
2da90 65 63 6f 6d 65 0a 2a 2a 20 61 6e 20 69 6e 64 69  ecome.** an indi
2daa0 63 61 74 69 6f 6e 20 74 6f 20 72 6f 62 75 73 74  cation to robust
2dab0 5f 6f 70 65 6e 28 29 20 74 6f 20 63 72 65 61 74  _open() to creat
2dac0 65 20 74 68 65 20 66 69 6c 65 20 75 73 69 6e 67  e the file using
2dad0 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55  .** SQLITE_DEFAU
2dae0 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
2daf0 4f 4e 53 20 61 64 6a 75 73 74 65 64 20 62 79 20  ONS adjusted by 
2db00 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a 20 42 75  the umask..** Bu
2db10 74 20 69 66 20 74 68 65 20 66 69 6c 65 20 62 65  t if the file be
2db20 69 6e 67 20 6f 70 65 6e 65 64 20 69 73 20 61 20  ing opened is a 
2db30 57 41 4c 20 6f 72 20 72 65 67 75 6c 61 72 20 6a  WAL or regular j
2db40 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
2db50 6e 20 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  n .** this funct
2db60 69 6f 6e 20 71 75 65 72 69 65 73 20 74 68 65 20  ion queries the 
2db70 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20  file-system for 
2db80 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  the permissions 
2db90 6f 6e 20 74 68 65 20 0a 2a 2a 20 63 6f 72 72 65  on the .** corre
2dba0 73 70 6f 6e 64 69 6e 67 20 64 61 74 61 62 61 73  sponding databas
2dbb0 65 20 66 69 6c 65 20 61 6e 64 20 73 65 74 73 20  e file and sets 
2dbc0 2a 70 4d 6f 64 65 20 74 6f 20 74 68 69 73 20 76  *pMode to this v
2dbd0 61 6c 75 65 2e 20 57 68 65 6e 65 76 65 72 20 0a  alue. Whenever .
2dbe0 2a 2a 20 70 6f 73 73 69 62 6c 65 2c 20 57 41 4c  ** possible, WAL
2dbf0 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   and journal fil
2dc00 65 73 20 61 72 65 20 63 72 65 61 74 65 64 20 75  es are created u
2dc10 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 70 65  sing the same pe
2dc20 72 6d 69 73 73 69 6f 6e 73 20 0a 2a 2a 20 61 73  rmissions .** as
2dc30 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
2dc40 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2dc50 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 51 4c 49  *.** If the SQLI
2dc60 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41  TE_ENABLE_8_3_NA
2dc70 4d 45 53 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e  MES option is en
2dc80 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 0a  abled, then the.
2dc90 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65  ** original file
2dca0 6e 61 6d 65 20 69 73 20 75 6e 61 76 61 69 6c 61  name is unavaila
2dcb0 62 6c 65 2e 20 20 42 75 74 20 38 5f 33 5f 4e 41  ble.  But 8_3_NA
2dcc0 4d 45 53 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  MES is only used
2dcd0 20 66 6f 72 0a 2a 2a 20 46 41 54 20 66 69 6c 65   for.** FAT file
2dce0 73 79 73 74 65 6d 73 20 61 6e 64 20 70 65 72 6d  systems and perm
2dcf0 69 73 73 69 6f 6e 73 20 64 6f 20 6e 6f 74 20 6d  issions do not m
2dd00 61 74 74 65 72 20 74 68 65 72 65 2c 20 73 6f 20  atter there, so 
2dd10 6a 75 73 74 20 75 73 65 0a 2a 2a 20 74 68 65 20  just use.** the 
2dd20 64 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69  default permissi
2dd30 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ons..*/.static i
2dd40 6e 74 20 66 69 6e 64 43 72 65 61 74 65 46 69 6c  nt findCreateFil
2dd50 65 4d 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20 63  eMode(.  const c
2dd60 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
2dd70 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68           /* Path
2dd80 20 6f 66 20 66 69 6c 65 20 28 70 6f 73 73 69 62   of file (possib
2dd90 6c 79 29 20 62 65 69 6e 67 20 63 72 65 61 74 65  ly) being create
2dda0 64 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  d */.  int flags
2ddb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2ddc0 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
2ddd0 70 61 73 73 65 64 20 61 73 20 34 74 68 20 61 72  passed as 4th ar
2dde0 67 75 6d 65 6e 74 20 74 6f 20 78 4f 70 65 6e 28  gument to xOpen(
2ddf0 29 20 2a 2f 0a 20 20 6d 6f 64 65 5f 74 20 2a 70  ) */.  mode_t *p
2de00 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20  Mode,           
2de10 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50         /* OUT: P
2de20 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 6f 70  ermissions to op
2de30 65 6e 20 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a  en file with */.
2de40 20 20 75 69 64 5f 74 20 2a 70 55 69 64 2c 20 20    uid_t *pUid,  
2de50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de60 20 20 2f 2a 20 4f 55 54 3a 20 75 69 64 20 74 6f    /* OUT: uid to
2de70 20 73 65 74 20 6f 6e 20 74 68 65 20 66 69 6c 65   set on the file
2de80 20 2a 2f 0a 20 20 67 69 64 5f 74 20 2a 70 47 69   */.  gid_t *pGi
2de90 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
2dea0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 67 69        /* OUT: gi
2deb0 64 20 74 6f 20 73 65 74 20 6f 6e 20 74 68 65 20  d to set on the 
2dec0 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  file */.){.  int
2ded0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2dee0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2def0 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
2df00 20 2a 70 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 2a   *pMode = 0;.  *
2df10 70 55 69 64 20 3d 20 30 3b 0a 20 20 2a 70 47 69  pUid = 0;.  *pGi
2df20 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 66 6c 61  d = 0;.  if( fla
2df30 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs & (SQLITE_OPE
2df40 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45  N_WAL|SQLITE_OPE
2df50 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20  N_MAIN_JOURNAL) 
2df60 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 44 62 5b  ){.    char zDb[
2df70 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b  MAX_PATHNAME+1];
2df80 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
2df90 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20   file path */.  
2dfa0 20 20 69 6e 74 20 6e 44 62 3b 20 20 20 20 20 20    int nDb;      
2dfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dfc0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c  /* Number of val
2dfd0 69 64 20 62 79 74 65 73 20 69 6e 20 7a 44 62 20  id bytes in zDb 
2dfe0 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  */.    struct st
2dff0 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20  at sStat;       
2e000 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 6f       /* Output o
2e010 66 20 73 74 61 74 28 29 20 6f 6e 20 64 61 74 61  f stat() on data
2e020 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
2e030 20 20 2f 2a 20 7a 50 61 74 68 20 69 73 20 61 20    /* zPath is a 
2e040 70 61 74 68 20 74 6f 20 61 20 57 41 4c 20 6f 72  path to a WAL or
2e050 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
2e060 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
2e070 63 6b 20 64 65 72 69 76 65 73 0a 20 20 20 20 2a  ck derives.    *
2e080 2a 20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68  * the path to th
2e090 65 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74  e associated dat
2e0a0 61 62 61 73 65 20 66 69 6c 65 20 66 72 6f 6d 20  abase file from 
2e0b0 7a 50 61 74 68 2e 20 54 68 69 73 20 62 6c 6f 63  zPath. This bloc
2e0c0 6b 20 68 61 6e 64 6c 65 73 0a 20 20 20 20 2a 2a  k handles.    **
2e0d0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e   the following n
2e0e0 61 6d 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e  aming convention
2e0f0 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
2e100 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e     "<path to db>
2e110 2d 6a 6f 75 72 6e 61 6c 22 0a 20 20 20 20 2a 2a  -journal".    **
2e120 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e     "<path to db>
2e130 2d 77 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22  -wal".    **   "
2e140 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75  <path to db>-jou
2e150 72 6e 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 20 20  rnalNN".    **  
2e160 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 77   "<path to db>-w
2e170 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 0a 20 20 20  alNN".    **.   
2e180 20 2a 2a 20 77 68 65 72 65 20 4e 4e 20 69 73 20   ** where NN is 
2e190 61 20 64 65 63 69 6d 61 6c 20 6e 75 6d 62 65 72  a decimal number
2e1a0 2e 20 54 68 65 20 4e 4e 20 6e 61 6d 69 6e 67 20  . The NN naming 
2e1b0 73 63 68 65 6d 65 73 20 61 72 65 20 0a 20 20 20  schemes are .   
2e1c0 20 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65 20   ** used by the 
2e1d0 74 65 73 74 5f 6d 75 6c 74 69 70 6c 65 78 2e 63  test_multiplex.c
2e1e0 20 6d 6f 64 75 6c 65 2e 0a 20 20 20 20 2a 2f 0a   module..    */.
2e1f0 20 20 20 20 6e 44 62 20 3d 20 73 71 6c 69 74 65      nDb = sqlite
2e200 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 29  3Strlen30(zPath)
2e210 20 2d 20 31 3b 20 0a 23 69 66 64 65 66 20 53 51   - 1; .#ifdef SQ
2e220 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f  LITE_ENABLE_8_3_
2e230 4e 41 4d 45 53 0a 20 20 20 20 77 68 69 6c 65 28  NAMES.    while(
2e240 20 6e 44 62 3e 30 20 26 26 20 73 71 6c 69 74 65   nDb>0 && sqlite
2e250 33 49 73 61 6c 6e 75 6d 28 7a 50 61 74 68 5b 6e  3Isalnum(zPath[n
2e260 44 62 5d 29 20 29 20 6e 44 62 2d 2d 3b 0a 20 20  Db]) ) nDb--;.  
2e270 20 20 69 66 28 20 6e 44 62 3d 3d 30 20 7c 7c 20    if( nDb==0 || 
2e280 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 2d 27 20  zPath[nDb]!='-' 
2e290 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2e2a0 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 20 20 77 68  OK;.#else.    wh
2e2b0 69 6c 65 28 20 7a 50 61 74 68 5b 6e 44 62 5d 21  ile( zPath[nDb]!
2e2c0 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 61 73  ='-' ){.      as
2e2d0 73 65 72 74 28 20 6e 44 62 3e 30 20 29 3b 0a 20  sert( nDb>0 );. 
2e2e0 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 50 61       assert( zPa
2e2f0 74 68 5b 6e 44 62 5d 21 3d 27 5c 6e 27 20 29 3b  th[nDb]!='\n' );
2e300 0a 20 20 20 20 20 20 6e 44 62 2d 2d 3b 0a 20 20  .      nDb--;.  
2e310 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 6d    }.#endif.    m
2e320 65 6d 63 70 79 28 7a 44 62 2c 20 7a 50 61 74 68  emcpy(zDb, zPath
2e330 2c 20 6e 44 62 29 3b 0a 20 20 20 20 7a 44 62 5b  , nDb);.    zDb[
2e340 6e 44 62 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20  nDb] = '\0';..  
2e350 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74 28    if( 0==osStat(
2e360 7a 44 62 2c 20 26 73 53 74 61 74 29 20 29 7b 0a  zDb, &sStat) ){.
2e370 20 20 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20 73        *pMode = s
2e380 53 74 61 74 2e 73 74 5f 6d 6f 64 65 20 26 20 30  Stat.st_mode & 0
2e390 37 37 37 3b 0a 20 20 20 20 20 20 2a 70 55 69 64  777;.      *pUid
2e3a0 20 3d 20 73 53 74 61 74 2e 73 74 5f 75 69 64 3b   = sStat.st_uid;
2e3b0 0a 20 20 20 20 20 20 2a 70 47 69 64 20 3d 20 73  .      *pGid = s
2e3c0 53 74 61 74 2e 73 74 5f 67 69 64 3b 0a 20 20 20  Stat.st_gid;.   
2e3d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
2e3e0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
2e3f0 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  FSTAT;.    }.  }
2e400 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
2e410 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
2e420 45 54 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a 20 20  ETEONCLOSE ){.  
2e430 20 20 2a 70 4d 6f 64 65 20 3d 20 30 36 30 30 3b    *pMode = 0600;
2e440 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2e450 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
2e460 74 68 65 20 66 69 6c 65 20 7a 50 61 74 68 2e 0a  the file zPath..
2e470 2a 2a 20 0a 2a 2a 20 50 72 65 76 69 6f 75 73 6c  ** .** Previousl
2e480 79 2c 20 74 68 65 20 53 51 4c 69 74 65 20 4f 53  y, the SQLite OS
2e490 20 6c 61 79 65 72 20 75 73 65 64 20 74 68 72 65   layer used thre
2e4a0 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 70  e functions in p
2e4b0 6c 61 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20  lace of this.** 
2e4c0 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73  one:.**.**     s
2e4d0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
2e4e0 57 72 69 74 65 28 29 3b 0a 2a 2a 20 20 20 20 20  Write();.**     
2e4f0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
2e500 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20 20 20  dOnly();.**     
2e510 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63  sqlite3OsOpenExc
2e520 6c 75 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20  lusive();.**.** 
2e530 54 68 65 73 65 20 63 61 6c 6c 73 20 63 6f 72 72  These calls corr
2e540 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 66 6f  espond to the fo
2e550 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74  llowing combinat
2e560 69 6f 6e 73 20 6f 66 20 66 6c 61 67 73 3a 0a 2a  ions of flags:.*
2e570 2a 0a 2a 2a 20 20 20 20 20 52 65 61 64 57 72 69  *.**     ReadWri
2e580 74 65 28 29 20 2d 3e 20 20 20 20 20 28 52 45 41  te() ->     (REA
2e590 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 29  DWRITE | CREATE)
2e5a0 0a 2a 2a 20 20 20 20 20 52 65 61 64 4f 6e 6c 79  .**     ReadOnly
2e5b0 28 29 20 20 2d 3e 20 20 20 20 20 28 52 45 41 44  ()  ->     (READ
2e5c0 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20 20 20 4f 70  ONLY) .**     Op
2e5d0 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20 2d 3e  enExclusive() ->
2e5e0 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 52   (READWRITE | CR
2e5f0 45 41 54 45 20 7c 20 45 58 43 4c 55 53 49 56 45  EATE | EXCLUSIVE
2e600 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64 20  ).**.** The old 
2e610 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20  OpenExclusive() 
2e620 61 63 63 65 70 74 65 64 20 61 20 62 6f 6f 6c 65  accepted a boole
2e630 61 6e 20 61 72 67 75 6d 65 6e 74 20 2d 20 22 64  an argument - "d
2e640 65 6c 46 6c 61 67 22 2e 20 49 66 0a 2a 2a 20 74  elFlag". If.** t
2e650 72 75 65 2c 20 74 68 65 20 66 69 6c 65 20 77 61  rue, the file wa
2e660 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20  s configured to 
2e670 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
2e680 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68   deleted when th
2e690 65 0a 2a 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65  e.** file handle
2e6a0 20 63 6c 6f 73 65 64 2e 20 54 6f 20 61 63 68 69   closed. To achi
2e6b0 65 76 65 20 74 68 65 20 73 61 6d 65 20 65 66 66  eve the same eff
2e6c0 65 63 74 20 75 73 69 6e 67 20 74 68 69 73 20 6e  ect using this n
2e6d0 65 77 20 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65  ew .** interface
2e6e0 2c 20 61 64 64 20 74 68 65 20 44 45 4c 45 54 45  , add the DELETE
2e6f0 4f 4e 43 4c 4f 53 45 20 66 6c 61 67 20 74 6f 20  ONCLOSE flag to 
2e700 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 20  those specified 
2e710 61 62 6f 76 65 20 66 6f 72 20 0a 2a 2a 20 4f 70  above for .** Op
2e720 65 6e 45 78 63 6c 75 73 69 76 65 28 29 2e 0a 2a  enExclusive()..*
2e730 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
2e740 78 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  xOpen(.  sqlite3
2e750 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
2e760 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53        /* The VFS
2e770 20 66 6f 72 20 77 68 69 63 68 20 74 68 69 73 20   for which this 
2e780 69 73 20 74 68 65 20 78 4f 70 65 6e 20 6d 65 74  is the xOpen met
2e790 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  hod */.  const c
2e7a0 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
2e7b0 20 20 20 20 20 20 2f 2a 20 50 61 74 68 6e 61 6d        /* Pathnam
2e7c0 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20  e of file to be 
2e7d0 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69  opened */.  sqli
2e7e0 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
2e7f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2e800 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2e810 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 69 6e 20  to be filled in 
2e820 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
2e830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e840 20 20 2f 2a 20 49 6e 70 75 74 20 66 6c 61 67 73    /* Input flags
2e850 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20   to control the 
2e860 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  opening */.  int
2e870 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20   *pOutFlags     
2e880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
2e890 70 75 74 20 66 6c 61 67 73 20 72 65 74 75 72 6e  put flags return
2e8a0 65 64 20 74 6f 20 53 51 4c 69 74 65 20 63 6f 72  ed to SQLite cor
2e8b0 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69  e */.){.  unixFi
2e8c0 6c 65 20 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c  le *p = (unixFil
2e8d0 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74  e *)pFile;.  int
2e8e0 20 66 64 20 3d 20 2d 31 3b 20 20 20 20 20 20 20   fd = -1;       
2e8f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2e900 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 72  ile descriptor r
2e910 65 74 75 72 6e 65 64 20 62 79 20 6f 70 65 6e 28  eturned by open(
2e920 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 65 6e 46  ) */.  int openF
2e930 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20  lags = 0;       
2e940 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74        /* Flags t
2e950 6f 20 70 61 73 73 20 74 6f 20 6f 70 65 6e 28 29  o pass to open()
2e960 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20   */.  int eType 
2e970 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46 46 46  = flags&0xFFFFFF
2e980 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20  00;  /* Type of 
2e990 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
2e9a0 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20    int noLock;   
2e9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e9c0 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74   /* True to omit
2e9d0 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69   locking primiti
2e9e0 76 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ves */.  int rc 
2e9f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2ea00 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74          /* Funct
2ea10 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20  ion Return Code 
2ea20 2a 2f 0a 20 20 69 6e 74 20 63 74 72 6c 46 6c 61  */.  int ctrlFla
2ea30 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  gs = 0;         
2ea40 20 20 20 20 2f 2a 20 55 4e 49 58 46 49 4c 45 5f      /* UNIXFILE_
2ea50 2a 20 66 6c 61 67 73 20 2a 2f 0a 0a 20 20 69 6e  * flags */..  in
2ea60 74 20 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d  t isExclusive  =
2ea70 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
2ea80 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29  _OPEN_EXCLUSIVE)
2ea90 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65  ;.  int isDelete
2eaa0 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20       = (flags & 
2eab0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
2eac0 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e  TEONCLOSE);.  in
2ead0 74 20 69 73 43 72 65 61 74 65 20 20 20 20 20 3d  t isCreate     =
2eae0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
2eaf0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20  _OPEN_CREATE);. 
2eb00 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20   int isReadonly 
2eb10 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
2eb20 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
2eb30 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64  Y);.  int isRead
2eb40 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20  Write  = (flags 
2eb50 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  & SQLITE_OPEN_RE
2eb60 41 44 57 52 49 54 45 29 3b 0a 23 69 66 20 53 51  ADWRITE);.#if SQ
2eb70 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2eb80 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20  ING_STYLE.  int 
2eb90 69 73 41 75 74 6f 50 72 6f 78 79 20 20 3d 20 28  isAutoProxy  = (
2eba0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
2ebb0 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 29 3b 0a  PEN_AUTOPROXY);.
2ebc0 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
2ebd0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c  ed(__APPLE__) ||
2ebe0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2ebf0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 73  OCKING_STYLE.  s
2ec00 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49  truct statfs fsI
2ec10 6e 66 6f 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  nfo;.#endif..  /
2ec20 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20  * If creating a 
2ec30 6d 61 73 74 65 72 20 6f 72 20 6d 61 69 6e 2d 66  master or main-f
2ec40 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 69  ile journal, thi
2ec50 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  s function will 
2ec60 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 66 69 6c 65  open.  ** a file
2ec70 2d 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74  -descriptor on t
2ec80 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f 6f  he directory too
2ec90 2e 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65  . The first time
2eca0 20 75 6e 69 78 53 79 6e 63 28 29 0a 20 20 2a 2a   unixSync().  **
2ecb0 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 64   is called the d
2ecc0 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65  irectory file de
2ecd0 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65  scriptor will be
2ece0 20 66 73 79 6e 63 28 29 65 64 20 61 6e 64 20 63   fsync()ed and c
2ecf0 6c 6f 73 65 28 29 64 2e 0a 20 20 2a 2f 0a 20 20  lose()d..  */.  
2ed00 69 6e 74 20 73 79 6e 63 44 69 72 20 3d 20 28 69  int syncDir = (i
2ed10 73 43 72 65 61 74 65 20 26 26 20 28 0a 20 20 20  sCreate && (.   
2ed20 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51 4c 49       eType==SQLI
2ed30 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
2ed40 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20  OURNAL .     || 
2ed50 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2ed60 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
2ed70 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  .     || eType==
2ed80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a  SQLITE_OPEN_WAL.
2ed90 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61    ));..  /* If a
2eda0 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69 73  rgument zPath is
2edb0 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c   a NULL pointer,
2edc0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2edd0 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f 70  s required to op
2ede0 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72  en.  ** a tempor
2edf0 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74 68  ary file. Use th
2ee00 69 73 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f  is buffer to sto
2ee10 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65  re the file name
2ee20 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72   in..  */.  char
2ee30 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50 41   zTmpname[MAX_PA
2ee40 54 48 4e 41 4d 45 2b 32 5d 3b 0a 20 20 63 6f 6e  THNAME+2];.  con
2ee50 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  st char *zName =
2ee60 20 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a 20 43 68   zPath;..  /* Ch
2ee70 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  eck the followin
2ee80 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  g statements are
2ee90 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a   true: .  **.  *
2eea0 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c 79 20  *   (a) Exactly 
2eeb0 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41 44 57  one of the READW
2eec0 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c  RITE and READONL
2eed0 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20  Y flags must be 
2eee0 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20  set, and .  **  
2eef0 20 28 62 29 20 69 66 20 43 52 45 41 54 45 20 69   (b) if CREATE i
2ef00 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45 41 44  s set, then READ
2ef10 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  WRITE must also 
2ef20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a  be set, and.  **
2ef30 20 20 20 28 63 29 20 69 66 20 45 58 43 4c 55 53     (c) if EXCLUS
2ef40 49 56 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  IVE is set, then
2ef50 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73   CREATE must als
2ef60 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20  o be set..  **  
2ef70 20 28 64 29 20 69 66 20 44 45 4c 45 54 45 4f 4e   (d) if DELETEON
2ef80 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20 74 68  CLOSE is set, th
2ef90 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61  en CREATE must a
2efa0 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f  lso be set..  */
2efb0 0a 20 20 61 73 73 65 72 74 28 28 69 73 52 65 61  .  assert((isRea
2efc0 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65  donly==0 || isRe
2efd0 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26 20 28  adWrite==0) && (
2efe0 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c 20 69  isReadWrite || i
2eff0 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61  sReadonly));.  a
2f000 73 73 65 72 74 28 69 73 43 72 65 61 74 65 3d 3d  ssert(isCreate==
2f010 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65  0 || isReadWrite
2f020 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 45 78  );.  assert(isEx
2f030 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73  clusive==0 || is
2f040 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72  Create);.  asser
2f050 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c  t(isDelete==0 ||
2f060 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f   isCreate);..  /
2f070 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d  * The main DB, m
2f080 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c  ain journal, WAL
2f090 20 66 69 6c 65 20 61 6e 64 20 6d 61 73 74 65 72   file and master
2f0a0 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65 76   journal are nev
2f0b0 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74  er .  ** automat
2f0c0 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20  ically deleted. 
2f0d0 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65 76 65  Nor are they eve
2f0e0 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
2f0f0 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s.  */.  assert(
2f100 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
2f110 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
2f120 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2f130 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _DB );.  assert(
2f140 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
2f150 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
2f160 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2f170 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73  _JOURNAL );.  as
2f180 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
2f190 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
2f1a0 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
2f1b0 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
2f1c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  );.  assert( (!i
2f1d0 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
2f1e0 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
2f1f0 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a  TE_OPEN_WAL );..
2f200 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
2f210 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72   the upper layer
2f220 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f 66 20   has set one of 
2f230 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65 22 20  the "file-type" 
2f240 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65  flags. */.  asse
2f250 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54  rt( eType==SQLIT
2f260 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20  E_OPEN_MAIN_DB  
2f270 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
2f280 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44  LITE_OPEN_TEMP_D
2f290 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  B .       || eTy
2f2a0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
2f2b0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20  MAIN_JOURNAL || 
2f2c0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2f2d0 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20  EN_TEMP_JOURNAL 
2f2e0 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  .       || eType
2f2f0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55  ==SQLITE_OPEN_SU
2f300 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54  BJOURNAL   || eT
2f310 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
2f320 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
2f330 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  .       || eType
2f340 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52  ==SQLITE_OPEN_TR
2f350 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54  ANSIENT_DB || eT
2f360 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
2f370 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  _WAL.  );..  /* 
2f380 44 65 74 65 63 74 20 61 20 70 69 64 20 63 68 61  Detect a pid cha
2f390 6e 67 65 20 61 6e 64 20 72 65 73 65 74 20 74 68  nge and reset th
2f3a0 65 20 50 52 4e 47 2e 20 20 54 68 65 72 65 20 69  e PRNG.  There i
2f3b0 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69  s a race conditi
2f3c0 6f 6e 0a 20 20 2a 2a 20 68 65 72 65 20 73 75 63  on.  ** here suc
2f3d0 68 20 74 68 61 74 20 74 77 6f 20 6f 72 20 6d 6f  h that two or mo
2f3e0 72 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20 74  re threads all t
2f3f0 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e 20 64 61  rying to open da
2f400 74 61 62 61 73 65 73 20 61 74 0a 20 20 2a 2a 20  tabases at.  ** 
2f410 74 68 65 20 73 61 6d 65 20 69 6e 73 74 61 6e 74  the same instant
2f420 20 6d 69 67 68 74 20 61 6c 6c 20 72 65 73 65 74   might all reset
2f430 20 74 68 65 20 50 52 4e 47 2e 20 20 42 75 74 20   the PRNG.  But 
2f440 6d 75 6c 74 69 70 6c 65 20 72 65 73 65 74 73 0a  multiple resets.
2f450 20 20 2a 2a 20 61 72 65 20 68 61 72 6d 6c 65 73    ** are harmles
2f460 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 61  s..  */.  if( ra
2f470 6e 64 6f 6d 6e 65 73 73 50 69 64 21 3d 6f 73 47  ndomnessPid!=osG
2f480 65 74 70 69 64 28 30 29 20 29 7b 0a 20 20 20 20  etpid(0) ){.    
2f490 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 20 3d 20  randomnessPid = 
2f4a0 6f 73 47 65 74 70 69 64 28 30 29 3b 0a 20 20 20  osGetpid(0);.   
2f4b0 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
2f4c0 65 73 73 28 30 2c 30 29 3b 0a 20 20 7d 0a 0a 20  ess(0,0);.  }.. 
2f4d0 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69   memset(p, 0, si
2f4e0 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b  zeof(unixFile));
2f4f0 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53  ..  if( eType==S
2f500 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
2f510 44 42 20 29 7b 0a 20 20 20 20 55 6e 69 78 55 6e  DB ){.    UnixUn
2f520 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b  usedFd *pUnused;
2f530 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 66  .    pUnused = f
2f540 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 7a 4e  indReusableFd(zN
2f550 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ame, flags);.   
2f560 20 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a   if( pUnused ){.
2f570 20 20 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73        fd = pUnus
2f580 65 64 2d 3e 66 64 3b 0a 20 20 20 20 7d 65 6c 73  ed->fd;.    }els
2f590 65 7b 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64  e{.      pUnused
2f5a0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
2f5b0 63 36 34 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75  c64(sizeof(*pUnu
2f5c0 73 65 64 29 29 3b 0a 20 20 20 20 20 20 69 66 28  sed));.      if(
2f5d0 20 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20   !pUnused ){.   
2f5e0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2f5f0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
2f600 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70  }.    }.    p->p
2f610 55 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64  Unused = pUnused
2f620 3b 0a 0a 20 20 20 20 2f 2a 20 44 61 74 61 62 61  ;..    /* Databa
2f630 73 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65  se filenames are
2f640 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72   double-zero ter
2f650 6d 69 6e 61 74 65 64 20 69 66 20 74 68 65 79 20  minated if they 
2f660 61 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 55  are not.    ** U
2f670 52 49 73 20 77 69 74 68 20 70 61 72 61 6d 65 74  RIs with paramet
2f680 65 72 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65  ers.  Hence, the
2f690 79 20 63 61 6e 20 61 6c 77 61 79 73 20 62 65 20  y can always be 
2f6a0 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20 20 20  passed into.    
2f6b0 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70  ** sqlite3_uri_p
2f6c0 61 72 61 6d 65 74 65 72 28 29 2e 20 2a 2f 0a 20  arameter(). */. 
2f6d0 20 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67     assert( (flag
2f6e0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
2f6f0 55 52 49 29 20 7c 7c 20 7a 4e 61 6d 65 5b 73 74  URI) || zName[st
2f700 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d 3d  rlen(zName)+1]==
2f710 30 20 29 3b 0a 0a 20 20 7d 65 6c 73 65 20 69 66  0 );..  }else if
2f720 28 20 21 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  ( !zName ){.    
2f730 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 4e  /* If zName is N
2f740 55 4c 4c 2c 20 74 68 65 20 75 70 70 65 72 20 6c  ULL, the upper l
2f750 61 79 65 72 20 69 73 20 72 65 71 75 65 73 74 69  ayer is requesti
2f760 6e 67 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20  ng a temp file. 
2f770 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 69 73  */.    assert(is
2f780 44 65 6c 65 74 65 20 26 26 20 21 73 79 6e 63 44  Delete && !syncD
2f790 69 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 75 6e  ir);.    rc = un
2f7a0 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 4d 41  ixGetTempname(MA
2f7b0 58 5f 50 41 54 48 4e 41 4d 45 2b 32 2c 20 7a 54  X_PATHNAME+2, zT
2f7c0 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  mpname);.    if(
2f7d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2f7e0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
2f7f0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61  c;.    }.    zNa
2f800 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 0a  me = zTmpname;..
2f810 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 64      /* Generated
2f820 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 6e   temporary filen
2f830 61 6d 65 73 20 61 72 65 20 61 6c 77 61 79 73 20  ames are always 
2f840 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d  double-zero term
2f850 69 6e 61 74 65 64 0a 20 20 20 20 2a 2a 20 66 6f  inated.    ** fo
2f860 72 20 75 73 65 20 62 79 20 73 71 6c 69 74 65 33  r use by sqlite3
2f870 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 29  _uri_parameter()
2f880 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
2f890 20 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e   zName[strlen(zN
2f8a0 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 20 20  ame)+1]==0 );.  
2f8b0 7d 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e  }..  /* Determin
2f8c0 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
2f8d0 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
2f8e0 65 72 20 70 61 73 73 65 64 20 74 6f 20 50 4f 53  er passed to POS
2f8f0 49 58 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a  IX function.  **
2f900 20 6f 70 65 6e 28 29 2e 20 54 68 65 73 65 20 6d   open(). These m
2f910 75 73 74 20 62 65 20 63 61 6c 63 75 6c 61 74 65  ust be calculate
2f920 64 20 65 76 65 6e 20 69 66 20 6f 70 65 6e 28 29  d even if open()
2f930 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2c 20   is not called, 
2f940 61 73 0a 20 20 2a 2a 20 74 68 65 79 20 6d 61 79  as.  ** they may
2f950 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 70 61   be stored as pa
2f960 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68  rt of the file h
2f970 61 6e 64 6c 65 20 61 6e 64 20 75 73 65 64 20 62  andle and used b
2f980 79 20 74 68 65 20 0a 20 20 2a 2a 20 27 63 6f 6e  y the .  ** 'con
2f990 63 68 20 66 69 6c 65 27 20 6c 6f 63 6b 69 6e 67  ch file' locking
2f9a0 20 66 75 6e 63 74 69 6f 6e 73 20 6c 61 74 65 72   functions later
2f9b0 20 6f 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69   on.  */.  if( i
2f9c0 73 52 65 61 64 6f 6e 6c 79 20 29 20 20 6f 70 65  sReadonly )  ope
2f9d0 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e  nFlags |= O_RDON
2f9e0 4c 59 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64  LY;.  if( isRead
2f9f0 57 72 69 74 65 20 29 20 6f 70 65 6e 46 6c 61 67  Write ) openFlag
2fa00 73 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20 20 69  s |= O_RDWR;.  i
2fa10 66 28 20 69 73 43 72 65 61 74 65 20 29 20 20 20  f( isCreate )   
2fa20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f   openFlags |= O_
2fa30 43 52 45 41 54 3b 0a 20 20 69 66 28 20 69 73 45  CREAT;.  if( isE
2fa40 78 63 6c 75 73 69 76 65 20 29 20 6f 70 65 6e 46  xclusive ) openF
2fa50 6c 61 67 73 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c  lags |= (O_EXCL|
2fa60 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f  O_NOFOLLOW);.  o
2fa70 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c  penFlags |= (O_L
2fa80 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52  ARGEFILE|O_BINAR
2fa90 59 29 3b 0a 0a 20 20 69 66 28 20 66 64 3c 30 20  Y);..  if( fd<0 
2faa0 29 7b 0a 20 20 20 20 6d 6f 64 65 5f 74 20 6f 70  ){.    mode_t op
2fab0 65 6e 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  enMode;         
2fac0 20 20 20 20 20 2f 2a 20 50 65 72 6d 69 73 73 69       /* Permissi
2fad0 6f 6e 73 20 74 6f 20 63 72 65 61 74 65 20 66 69  ons to create fi
2fae0 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20 20 20 75  le with */.    u
2faf0 69 64 5f 74 20 75 69 64 3b 20 20 20 20 20 20 20  id_t uid;       
2fb00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fb10 55 73 65 72 69 64 20 66 6f 72 20 74 68 65 20 66  Userid for the f
2fb20 69 6c 65 20 2a 2f 0a 20 20 20 20 67 69 64 5f 74  ile */.    gid_t
2fb30 20 67 69 64 3b 20 20 20 20 20 20 20 20 20 20 20   gid;           
2fb40 20 20 20 20 20 20 20 20 20 2f 2a 20 47 72 6f 75           /* Grou
2fb50 70 69 64 20 66 6f 72 20 74 68 65 20 66 69 6c 65  pid for the file
2fb60 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 69 6e   */.    rc = fin
2fb70 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28  dCreateFileMode(
2fb80 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 2c 20 26 6f  zName, flags, &o
2fb90 70 65 6e 4d 6f 64 65 2c 20 26 75 69 64 2c 20 26  penMode, &uid, &
2fba0 67 69 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  gid);.    if( rc
2fbb0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2fbc0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 2d       assert( !p-
2fbd0 3e 70 55 6e 75 73 65 64 20 29 3b 0a 20 20 20 20  >pUnused );.    
2fbe0 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
2fbf0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
2fc00 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
2fc10 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
2fc20 4e 41 4c 20 29 3b 0a 20 20 20 20 20 20 72 65 74  NAL );.      ret
2fc30 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2fc40 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
2fc50 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c  en(zName, openFl
2fc60 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a  ags, openMode);.
2fc70 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50      OSTRACE(("OP
2fc80 45 4e 58 20 20 20 25 2d 33 64 20 25 73 20 30 25  ENX   %-3d %s 0%
2fc90 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c  o\n", fd, zName,
2fca0 20 6f 70 65 6e 46 6c 61 67 73 29 29 3b 0a 20 20   openFlags));.  
2fcb0 20 20 69 66 28 20 66 64 3c 30 20 26 26 20 65 72    if( fd<0 && er
2fcc0 72 6e 6f 21 3d 45 49 53 44 49 52 20 26 26 20 69  rno!=EISDIR && i
2fcd0 73 52 65 61 64 57 72 69 74 65 20 26 26 20 21 69  sReadWrite && !i
2fce0 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20  sExclusive ){.  
2fcf0 20 20 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f      /* Failed to
2fd00 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 66   open the file f
2fd10 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  or read/write ac
2fd20 63 65 73 73 2e 20 54 72 79 20 72 65 61 64 2d 6f  cess. Try read-o
2fd30 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 66 6c  nly. */.      fl
2fd40 61 67 73 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f  ags &= ~(SQLITE_
2fd50 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
2fd60 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
2fd70 45 29 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c  E);.      openFl
2fd80 61 67 73 20 26 3d 20 7e 28 4f 5f 52 44 57 52 7c  ags &= ~(O_RDWR|
2fd90 4f 5f 43 52 45 41 54 29 3b 0a 20 20 20 20 20 20  O_CREAT);.      
2fda0 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
2fdb0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  OPEN_READONLY;. 
2fdc0 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c       openFlags |
2fdd0 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20  = O_RDONLY;.    
2fde0 20 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31    isReadonly = 1
2fdf0 3b 0a 20 20 20 20 20 20 66 64 20 3d 20 72 6f 62  ;.      fd = rob
2fe00 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20  ust_open(zName, 
2fe10 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d  openFlags, openM
2fe20 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ode);.    }.    
2fe30 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
2fe40 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
2fe50 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
2fe60 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22  PEN_BKPT, "open"
2fe70 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
2fe80 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68  goto open_finish
2fe90 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ed;.    }..    /
2fea0 2a 20 49 66 20 74 68 69 73 20 70 72 6f 63 65 73  * If this proces
2feb0 73 20 69 73 20 72 75 6e 6e 69 6e 67 20 61 73 20  s is running as 
2fec0 72 6f 6f 74 20 61 6e 64 20 69 66 20 63 72 65 61  root and if crea
2fed0 74 69 6e 67 20 61 20 6e 65 77 20 72 6f 6c 6c 62  ting a new rollb
2fee0 61 63 6b 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  ack.    ** journ
2fef0 61 6c 20 6f 72 20 57 41 4c 20 66 69 6c 65 2c 20  al or WAL file, 
2ff00 73 65 74 20 74 68 65 20 6f 77 6e 65 72 73 68 69  set the ownershi
2ff10 70 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  p of the journal
2ff20 20 6f 72 20 57 41 4c 20 74 6f 20 62 65 0a 20 20   or WAL to be.  
2ff30 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 61 73    ** the same as
2ff40 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
2ff50 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  tabase..    */. 
2ff60 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 28     if( flags & (
2ff70 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c  SQLITE_OPEN_WAL|
2ff80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2ff90 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20  _JOURNAL) ){.   
2ffa0 20 20 20 72 6f 62 75 73 74 46 63 68 6f 77 6e 28     robustFchown(
2ffb0 66 64 2c 20 75 69 64 2c 20 67 69 64 29 3b 0a 20  fd, uid, gid);. 
2ffc0 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
2ffd0 74 28 20 66 64 3e 3d 30 20 29 3b 0a 20 20 69 66  t( fd>=0 );.  if
2ffe0 28 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20  ( pOutFlags ){. 
2fff0 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20     *pOutFlags = 
30000 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66  flags;.  }..  if
30010 28 20 70 2d 3e 70 55 6e 75 73 65 64 20 29 7b 0a  ( p->pUnused ){.
30020 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 2d 3e      p->pUnused->
30030 66 64 20 3d 20 66 64 3b 0a 20 20 20 20 70 2d 3e  fd = fd;.    p->
30040 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d  pUnused->flags =
30050 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69   flags;.  }..  i
30060 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a 23  f( isDelete ){.#
30070 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
30080 20 20 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b    zPath = zName;
30090 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53  .#elif defined(S
300a0 51 4c 49 54 45 5f 55 4e 4c 49 4e 4b 5f 41 46 54  QLITE_UNLINK_AFT
300b0 45 52 5f 43 4c 4f 53 45 29 0a 20 20 20 20 7a 50  ER_CLOSE).    zP
300c0 61 74 68 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ath = sqlite3_mp
300d0 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 4e 61 6d  rintf("%s", zNam
300e0 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74  e);.    if( zPat
300f0 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 6f  h==0 ){.      ro
30100 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64  bust_close(p, fd
30110 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
30120 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
30130 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23 65  _NOMEM;.    }.#e
30140 6c 73 65 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b  lse.    osUnlink
30150 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a  (zName);.#endif.
30160 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 45    }.#if SQLITE_E
30170 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
30180 59 4c 45 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  YLE.  else{.    
30190 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f  p->openFlags = o
301a0 70 65 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a 23 65  penFlags;.  }.#e
301b0 6e 64 69 66 0a 0a 20 20 6e 6f 4c 6f 63 6b 20 3d  ndif..  noLock =
301c0 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
301d0 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 0a 20 20  PEN_MAIN_DB;..  
301e0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
301f0 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54  PPLE__) || SQLIT
30200 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
30210 5f 53 54 59 4c 45 0a 20 20 69 66 28 20 66 73 74  _STYLE.  if( fst
30220 61 74 66 73 28 66 64 2c 20 26 66 73 49 6e 66 6f  atfs(fd, &fsInfo
30230 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 73  ) == -1 ){.    s
30240 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 2c  toreLastErrno(p,
30250 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 6f 62   errno);.    rob
30260 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c  ust_close(p, fd,
30270 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
30280 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
30290 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 7d 0a  ERR_ACCESS;.  }.
302a0 20 20 69 66 20 28 30 20 3d 3d 20 73 74 72 6e 63    if (0 == strnc
302b0 6d 70 28 22 6d 73 64 6f 73 22 2c 20 66 73 49 6e  mp("msdos", fsIn
302c0 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c  fo.f_fstypename,
302d0 20 35 29 29 20 7b 0a 20 20 20 20 28 28 75 6e 69   5)) {.    ((uni
302e0 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 66  xFile*)pFile)->f
302f0 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  sFlags |= SQLITE
30300 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f  _FSFLAGS_IS_MSDO
30310 53 3b 0a 20 20 7d 0a 20 20 69 66 20 28 30 20 3d  S;.  }.  if (0 =
30320 3d 20 73 74 72 6e 63 6d 70 28 22 65 78 66 61 74  = strncmp("exfat
30330 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79  ", fsInfo.f_fsty
30340 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b 0a 20 20  pename, 5)) {.  
30350 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46    ((unixFile*)pF
30360 69 6c 65 29 2d 3e 66 73 46 6c 61 67 73 20 7c 3d  ile)->fsFlags |=
30370 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f   SQLITE_FSFLAGS_
30380 49 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a 23 65  IS_MSDOS;.  }.#e
30390 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20 75  ndif..  /* Set u
303a0 70 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 74  p appropriate ct
303b0 72 6c 46 6c 61 67 73 20 2a 2f 0a 20 20 69 66 28  rlFlags */.  if(
303c0 20 69 73 44 65 6c 65 74 65 20 29 20 20 20 20 20   isDelete )     
303d0 20 20 20 20 20 20 20 20 20 20 20 63 74 72 6c 46             ctrlF
303e0 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
303f0 5f 44 45 4c 45 54 45 3b 0a 20 20 69 66 28 20 69  _DELETE;.  if( i
30400 73 52 65 61 64 6f 6e 6c 79 20 29 20 20 20 20 20  sReadonly )     
30410 20 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61           ctrlFla
30420 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 52  gs |= UNIXFILE_R
30430 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 6e 6f 4c  DONLY;.  if( noL
30440 6f 63 6b 20 29 20 20 20 20 20 20 20 20 20 20 20  ock )           
30450 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73         ctrlFlags
30460 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c   |= UNIXFILE_NOL
30470 4f 43 4b 3b 0a 20 20 69 66 28 20 73 79 6e 63 44  OCK;.  if( syncD
30480 69 72 20 29 20 20 20 20 20 20 20 20 20 20 20 20  ir )            
30490 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c       ctrlFlags |
304a0 3d 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59  = UNIXFILE_DIRSY
304b0 4e 43 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20  NC;.  if( flags 
304c0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  & SQLITE_OPEN_UR
304d0 49 20 29 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d  I ) ctrlFlags |=
304e0 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 3b 0a 0a   UNIXFILE_URI;..
304f0 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
30500 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
30510 23 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45  #if SQLITE_PREFE
30520 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a  R_PROXY_LOCKING.
30530 20 20 69 73 41 75 74 6f 50 72 6f 78 79 20 3d 20    isAutoProxy = 
30540 31 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  1;.#endif.  if( 
30550 69 73 41 75 74 6f 50 72 6f 78 79 20 26 26 20 28  isAutoProxy && (
30560 7a 50 61 74 68 21 3d 4e 55 4c 4c 29 20 26 26 20  zPath!=NULL) && 
30570 28 21 6e 6f 4c 6f 63 6b 29 20 26 26 20 70 56 66  (!noLock) && pVf
30580 73 2d 3e 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20  s->xOpen ){.    
30590 63 68 61 72 20 2a 65 6e 76 66 6f 72 63 65 20 3d  char *envforce =
305a0 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f   getenv("SQLITE_
305b0 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b  FORCE_PROXY_LOCK
305c0 49 4e 47 22 29 3b 0a 20 20 20 20 69 6e 74 20 75  ING");.    int u
305d0 73 65 50 72 6f 78 79 20 3d 20 30 3b 0a 0a 20 20  seProxy = 0;..  
305e0 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52 43    /* SQLITE_FORC
305f0 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 3d  E_PROXY_LOCKING=
30600 3d 31 20 6d 65 61 6e 73 20 66 6f 72 63 65 20 61  =1 means force a
30610 6c 77 61 79 73 20 75 73 65 20 70 72 6f 78 79 2c  lways use proxy,
30620 20 30 20 6d 65 61 6e 73 20 0a 20 20 20 20 2a 2a   0 means .    **
30630 20 6e 65 76 65 72 20 75 73 65 20 70 72 6f 78 79   never use proxy
30640 2c 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 75 73 65  , NULL means use
30650 20 70 72 6f 78 79 20 66 6f 72 20 6e 6f 6e 2d 6c   proxy for non-l
30660 6f 63 61 6c 20 66 69 6c 65 73 20 6f 6e 6c 79 2e  ocal files only.
30670 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 6e 76    */.    if( env
30680 66 6f 72 63 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20  force!=NULL ){. 
30690 20 20 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20       useProxy = 
306a0 61 74 6f 69 28 65 6e 76 66 6f 72 63 65 29 3e 30  atoi(envforce)>0
306b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
306c0 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20 21 28     useProxy = !(
306d0 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d  fsInfo.f_flags&M
306e0 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20 20 20 20 7d  NT_LOCAL);.    }
306f0 0a 20 20 20 20 69 66 28 20 75 73 65 50 72 6f 78  .    if( useProx
30700 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
30710 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70  fillInUnixFile(p
30720 56 66 73 2c 20 66 64 2c 20 70 46 69 6c 65 2c 20  Vfs, fd, pFile, 
30730 7a 50 61 74 68 2c 20 63 74 72 6c 46 6c 61 67 73  zPath, ctrlFlags
30740 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
30750 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30760 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79        rc = proxy
30770 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c  TransformUnixFil
30780 65 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69  e((unixFile*)pFi
30790 6c 65 2c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 20  le, ":auto:");. 
307a0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
307b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
307c0 20 20 20 20 20 20 2f 2a 20 55 73 65 20 75 6e 69        /* Use uni
307d0 78 43 6c 6f 73 65 20 74 6f 20 63 6c 65 61 6e 20  xClose to clean 
307e0 75 70 20 74 68 65 20 72 65 73 6f 75 72 63 65 73  up the resources
307f0 20 61 64 64 65 64 20 69 6e 20 66 69 6c 6c 49 6e   added in fillIn
30800 55 6e 69 78 46 69 6c 65 20 0a 20 20 20 20 20 20  UnixFile .      
30810 20 20 20 20 2a 2a 20 61 6e 64 20 63 6c 65 61 72      ** and clear
30820 20 61 6c 6c 20 74 68 65 20 73 74 72 75 63 74 75   all the structu
30830 72 65 27 73 20 72 65 66 65 72 65 6e 63 65 73 2e  re's references.
30840 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20    Specifically, 
30850 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 46  .          ** pF
30860 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 77 69  ile->pMethods wi
30870 6c 6c 20 62 65 20 4e 55 4c 4c 20 73 6f 20 73 71  ll be NULL so sq
30880 6c 69 74 65 33 4f 73 43 6c 6f 73 65 20 77 69 6c  lite3OsClose wil
30890 6c 20 62 65 20 61 20 6e 6f 2d 6f 70 20 0a 20 20  l be a no-op .  
308a0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
308b0 20 20 20 20 20 75 6e 69 78 43 6c 6f 73 65 28 70       unixClose(p
308c0 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20  File);.         
308d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
308e0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
308f0 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69      goto open_fi
30900 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20  nished;.    }.  
30910 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 63  }.#endif.  .  rc
30920 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c   = fillInUnixFil
30930 65 28 70 56 66 73 2c 20 66 64 2c 20 70 46 69 6c  e(pVfs, fd, pFil
30940 65 2c 20 7a 50 61 74 68 2c 20 63 74 72 6c 46 6c  e, zPath, ctrlFl
30950 61 67 73 29 3b 0a 0a 6f 70 65 6e 5f 66 69 6e 69  ags);..open_fini
30960 73 68 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d  shed:.  if( rc!=
30970 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30980 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
30990 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20 7d 0a 20  >pUnused);.  }. 
309a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
309b0 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
309c0 20 66 69 6c 65 20 61 74 20 7a 50 61 74 68 2e 20   file at zPath. 
309d0 49 66 20 74 68 65 20 64 69 72 53 79 6e 63 20 61  If the dirSync a
309e0 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c  rgument is true,
309f0 20 66 73 79 6e 63 28 29 0a 2a 2a 20 74 68 65 20   fsync().** the 
30a00 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72 20  directory after 
30a10 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c  deleting the fil
30a20 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
30a30 20 75 6e 69 78 44 65 6c 65 74 65 28 0a 20 20 73   unixDelete(.  s
30a40 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
30a50 73 65 64 2c 20 20 20 20 20 2f 2a 20 56 46 53 20  sed,     /* VFS 
30a60 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20  containing this 
30a70 61 73 20 74 68 65 20 78 44 65 6c 65 74 65 20 6d  as the xDelete m
30a80 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ethod */.  const
30a90 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
30aa0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
30ab0 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74  file to be delet
30ac0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 53  ed */.  int dirS
30ad0 79 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20  ync             
30ae0 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 66 73    /* If true, fs
30af0 79 6e 63 28 29 20 64 69 72 65 63 74 6f 72 79 20  ync() directory 
30b00 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20 66  after deleting f
30b10 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ile */.){.  int 
30b20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
30b30 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
30b40 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53  ER(NotUsed);.  S
30b50 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
30b60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
30b70 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 69 66  RR_DELETE);.  if
30b80 28 20 6f 73 55 6e 6c 69 6e 6b 28 7a 50 61 74 68  ( osUnlink(zPath
30b90 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 69  )==(-1) ){.    i
30ba0 66 28 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54  f( errno==ENOENT
30bb0 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
30bc0 20 20 20 20 20 20 20 20 7c 7c 20 6f 73 41 63 63          || osAcc
30bd0 65 73 73 28 7a 50 61 74 68 2c 30 29 21 3d 30 0a  ess(zPath,0)!=0.
30be0 23 65 6e 64 69 66 0a 20 20 20 20 29 7b 0a 20 20  #endif.    ){.  
30bf0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
30c00 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45  IOERR_DELETE_NOE
30c10 4e 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  NT;.    }else{. 
30c20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
30c30 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
30c40 45 52 52 5f 44 45 4c 45 54 45 2c 20 22 75 6e 6c  ERR_DELETE, "unl
30c50 69 6e 6b 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20  ink", zPath);.  
30c60 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
30c70 63 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  c;.  }.#ifndef S
30c80 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49  QLITE_DISABLE_DI
30c90 52 53 59 4e 43 0a 20 20 69 66 28 20 28 64 69 72  RSYNC.  if( (dir
30ca0 53 79 6e 63 20 26 20 31 29 21 3d 30 20 29 7b 0a  Sync & 1)!=0 ){.
30cb0 20 20 20 20 69 6e 74 20 66 64 3b 0a 20 20 20 20      int fd;.    
30cc0 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63  rc = osOpenDirec
30cd0 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 66 64 29  tory(zPath, &fd)
30ce0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
30cf0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 20 4f  LITE_OK ){.#if O
30d00 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 20 20  S_VXWORKS.      
30d10 69 66 28 20 66 73 79 6e 63 28 66 64 29 3d 3d 2d  if( fsync(fd)==-
30d20 31 20 29 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  1 ).#else.      
30d30 69 66 28 20 66 73 79 6e 63 28 66 64 29 20 29 0a  if( fsync(fd) ).
30d40 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20  #endif.      {. 
30d50 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
30d60 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
30d70 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 2c  IOERR_DIR_FSYNC,
30d80 20 22 66 73 79 6e 63 22 2c 20 7a 50 61 74 68 29   "fsync", zPath)
30d90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
30da0 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20  robust_close(0, 
30db0 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
30dc0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
30dd0 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  =SQLITE_CANTOPEN
30de0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
30df0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
30e00 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
30e10 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
30e20 20 54 65 73 74 20 74 68 65 20 65 78 69 73 74 65   Test the existe
30e30 6e 63 65 20 6f 66 20 6f 72 20 61 63 63 65 73 73  nce of or access
30e40 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20   permissions of 
30e50 66 69 6c 65 20 7a 50 61 74 68 2e 20 54 68 65 0a  file zPath. The.
30e60 2a 2a 20 74 65 73 74 20 70 65 72 66 6f 72 6d 65  ** test performe
30e70 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65  d depends on the
30e80 20 76 61 6c 75 65 20 6f 66 20 66 6c 61 67 73 3a   value of flags:
30e90 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  .**.**     SQLIT
30ea0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a  E_ACCESS_EXISTS:
30eb0 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
30ec0 20 66 69 6c 65 20 65 78 69 73 74 73 0a 2a 2a 20   file exists.** 
30ed0 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53      SQLITE_ACCES
30ee0 53 5f 52 45 41 44 57 52 49 54 45 3a 20 52 65 74  S_READWRITE: Ret
30ef0 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c  urn 1 if the fil
30f00 65 20 69 73 20 72 65 61 64 20 61 6e 64 20 77 72  e is read and wr
30f10 69 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 53  itable..**     S
30f20 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
30f30 44 4f 4e 4c 59 3a 20 52 65 74 75 72 6e 20 31 20  DONLY: Return 1 
30f40 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 72  if the file is r
30f50 65 61 64 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f  eadable..**.** O
30f60 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20  therwise return 
30f70 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  0..*/.static int
30f80 20 75 6e 69 78 41 63 63 65 73 73 28 0a 20 20 73   unixAccess(.  s
30f90 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
30fa0 73 65 64 2c 20 20 20 2f 2a 20 54 68 65 20 56 46  sed,   /* The VF
30fb0 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69  S containing thi
30fc0 73 20 78 41 63 63 65 73 73 20 6d 65 74 68 6f 64  s xAccess method
30fd0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
30fe0 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 2f 2a   *zPath,      /*
30ff0 20 50 61 74 68 20 6f 66 20 74 68 65 20 66 69 6c   Path of the fil
31000 65 20 74 6f 20 65 78 61 6d 69 6e 65 20 2a 2f 0a  e to examine */.
31010 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
31020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61            /* Wha
31030 74 20 64 6f 20 77 65 20 77 61 6e 74 20 74 6f 20  t do we want to 
31040 6c 65 61 72 6e 20 61 62 6f 75 74 20 74 68 65 20  learn about the 
31050 7a 50 61 74 68 20 66 69 6c 65 3f 20 2a 2f 0a 20  zPath file? */. 
31060 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 20 20 20   int *pResOut   
31070 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
31080 65 20 72 65 73 75 6c 74 20 62 6f 6f 6c 65 61 6e  e result boolean
31090 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
310a0 74 20 61 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 55  t amode = 0;.  U
310b0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
310c0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75  NotUsed);.  Simu
310d0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
310e0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
310f0 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 73 77  _ACCESS; );.  sw
31100 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20  itch( flags ){. 
31110 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
31120 43 43 45 53 53 5f 45 58 49 53 54 53 3a 0a 20 20  CCESS_EXISTS:.  
31130 20 20 20 20 61 6d 6f 64 65 20 3d 20 46 5f 4f 4b      amode = F_OK
31140 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
31150 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
31160 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a  CCESS_READWRITE:
31170 0a 20 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 57  .      amode = W
31180 5f 4f 4b 7c 52 5f 4f 4b 3b 0a 20 20 20 20 20 20  _OK|R_OK;.      
31190 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
311a0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
311b0 41 44 3a 0a 20 20 20 20 20 20 61 6d 6f 64 65 20  AD:.      amode 
311c0 3d 20 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72  = R_OK;.      br
311d0 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c  eak;..    defaul
311e0 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t:.      assert(
311f0 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 67 73 20  !"Invalid flags 
31200 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a  argument");.  }.
31210 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 28 6f 73    *pResOut = (os
31220 41 63 63 65 73 73 28 7a 50 61 74 68 2c 20 61 6d  Access(zPath, am
31230 6f 64 65 29 3d 3d 30 29 3b 0a 20 20 69 66 28 20  ode)==0);.  if( 
31240 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43  flags==SQLITE_AC
31250 43 45 53 53 5f 45 58 49 53 54 53 20 26 26 20 2a  CESS_EXISTS && *
31260 70 52 65 73 4f 75 74 20 29 7b 0a 20 20 20 20 73  pResOut ){.    s
31270 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
31280 20 20 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61      if( 0==osSta
31290 74 28 7a 50 61 74 68 2c 20 26 62 75 66 29 20 26  t(zPath, &buf) &
312a0 26 20 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30  & buf.st_size==0
312b0 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 4f   ){.      *pResO
312c0 75 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ut = 0;.    }.  
312d0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
312e0 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
312f0 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20  Turn a relative 
31300 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20  pathname into a 
31310 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 54  full pathname. T
31320 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68  he relative path
31330 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 61 73  .** is stored as
31340 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65   a nul-terminate
31350 64 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20  d string in the 
31360 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74  buffer pointed t
31370 6f 20 62 79 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a  o by.** zPath. .
31380 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e 74  **.** zOut point
31390 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66  s to a buffer of
313a0 20 61 74 20 6c 65 61 73 74 20 73 71 6c 69 74 65   at least sqlite
313b0 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65  3_vfs.mxPathname
313c0 20 62 79 74 65 73 20 0a 2a 2a 20 28 69 6e 20 74   bytes .** (in t
313d0 68 69 73 20 63 61 73 65 2c 20 4d 41 58 5f 50 41  his case, MAX_PA
313e0 54 48 4e 41 4d 45 20 62 79 74 65 73 29 2e 20 54  THNAME bytes). T
313f0 68 65 20 66 75 6c 6c 2d 70 61 74 68 20 69 73 20  he full-path is 
31400 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 74 68  written to.** th
31410 69 73 20 62 75 66 66 65 72 20 62 65 66 6f 72 65  is buffer before
31420 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
31430 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 75  tatic int unixFu
31440 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71  llPathname(.  sq
31450 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
31460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
31470 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62  ointer to vfs ob
31480 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ject */.  const 
31490 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
314a0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69          /* Possi
314b0 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69 6e 70  bly relative inp
314c0 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74  ut path */.  int
314d0 20 6e 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20   nOut,          
314e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
314f0 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62 75 66  ze of output buf
31500 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  fer in bytes */.
31510 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 20 20 20    char *zOut    
31520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31530 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65 72  /* Output buffer
31540 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79   */.){.  int nBy
31550 74 65 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f  te;..  /* It's o
31560 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61  dd to simulate a
31570 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c  n io-error here,
31580 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73   but really this
31590 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73   is just.  ** us
315a0 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72  ing the io-error
315b0 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20   infrastructure 
315c0 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
315d0 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73  ite handles this
315e0 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66  .  ** function f
315f0 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e  ailing. This fun
31600 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c  ction could fail
31610 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65   if, for example
31620 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65  , the.  ** curre
31630 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63  nt working direc
31640 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e  tory has been un
31650 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53  linked..  */.  S
31660 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
31670 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
31680 52 4f 52 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  ROR );..  assert
31690 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ( pVfs->mxPathna
316a0 6d 65 3d 3d 4d 41 58 5f 50 41 54 48 4e 41 4d 45  me==MAX_PATHNAME
316b0 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
316c0 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20  AMETER(pVfs);.. 
316d0 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 72   /* Attempt to r
316e0 65 73 6f 6c 76 65 20 74 68 65 20 70 61 74 68 20  esolve the path 
316f0 61 73 20 69 66 20 69 74 20 77 65 72 65 20 61 20  as if it were a 
31700 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 2e 20 49  symbolic link. I
31710 66 20 69 74 20 69 73 0a 20 20 2a 2a 20 61 20 73  f it is.  ** a s
31720 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 2c 20 74 68  ymbolic link, th
31730 65 20 72 65 73 6f 6c 76 65 64 20 70 61 74 68 20  e resolved path 
31740 69 73 20 73 74 6f 72 65 64 20 69 6e 20 62 75 66  is stored in buf
31750 66 65 72 20 7a 4f 75 74 5b 5d 2e 20 4f 72 2c 20  fer zOut[]. Or, 
31760 69 66 0a 20 20 2a 2a 20 74 68 65 20 69 64 65 6e  if.  ** the iden
31770 74 69 66 69 65 64 20 66 69 6c 65 20 69 73 20 6e  tified file is n
31780 6f 74 20 61 20 73 79 6d 62 6f 6c 69 63 20 6c 69  ot a symbolic li
31790 6e 6b 20 6f 72 20 64 6f 65 73 20 6e 6f 74 20 65  nk or does not e
317a0 78 69 73 74 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  xist, then.  ** 
317b0 7a 50 61 74 68 20 69 73 20 63 6f 70 69 65 64 20  zPath is copied 
317c0 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 7a 4f  directly into zO
317d0 75 74 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20  ut. Either way, 
317e0 6e 42 79 74 65 20 69 73 20 6c 65 66 74 20 73 65  nByte is left se
317f0 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 73 69  t to.  ** the si
31800 7a 65 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67  ze of the string
31810 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 7a 4f 75   copied into zOu
31820 74 5b 5d 20 69 6e 20 62 79 74 65 73 2e 20 20 2a  t[] in bytes.  *
31830 2f 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 52 65  /.  nByte = osRe
31840 61 64 6c 69 6e 6b 28 7a 50 61 74 68 2c 20 7a 4f  adlink(zPath, zO
31850 75 74 2c 20 6e 4f 75 74 2d 31 29 3b 0a 20 20 69  ut, nOut-1);.  i
31860 66 28 20 6e 42 79 74 65 3c 30 20 29 7b 0a 20 20  f( nByte<0 ){.  
31870 20 20 69 66 28 20 65 72 72 6e 6f 21 3d 45 49 4e    if( errno!=EIN
31880 56 41 4c 20 26 26 20 65 72 72 6e 6f 21 3d 45 4e  VAL && errno!=EN
31890 4f 45 4e 54 20 29 7b 0a 20 20 20 20 20 20 72 65  OENT ){.      re
318a0 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f  turn unixLogErro
318b0 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
318c0 4e 5f 42 4b 50 54 2c 20 22 72 65 61 64 6c 69 6e  N_BKPT, "readlin
318d0 6b 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20  k", zPath);.    
318e0 7d 0a 20 20 20 20 7a 4f 75 74 5b 6e 4f 75 74 2d  }.    zOut[nOut-
318f0 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 73  1] = '\0';.    s
31900 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
31910 6e 4f 75 74 2d 31 2c 20 7a 4f 75 74 2c 20 22 25  nOut-1, zOut, "%
31920 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20  s", zPath);.    
31930 6e 42 79 74 65 20 3d 20 73 71 6c 69 74 65 33 53  nByte = sqlite3S
31940 74 72 6c 65 6e 33 30 28 7a 4f 75 74 29 3b 0a 20  trlen30(zOut);. 
31950 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4f 75 74   }else{.    zOut
31960 5b 6e 42 79 74 65 5d 20 3d 20 27 5c 30 27 3b 0a  [nByte] = '\0';.
31970 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 62 75 66    }..  /* If buf
31980 66 65 72 20 7a 4f 75 74 5b 5d 20 6e 6f 77 20 63  fer zOut[] now c
31990 6f 6e 74 61 69 6e 73 20 61 6e 20 61 62 73 6f 6c  ontains an absol
319a0 75 74 65 20 70 61 74 68 20 74 68 65 72 65 20 69  ute path there i
319b0 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 0a 20  s nothing more. 
319c0 20 2a 2a 20 74 6f 20 64 6f 2e 20 49 66 20 69 74   ** to do. If it
319d0 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 6c 61   contains a rela
319e0 74 69 76 65 20 70 61 74 68 2c 20 64 6f 20 74 68  tive path, do th
319f0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a  e following:.  *
31a00 2a 0a 20 20 2a 2a 20 20 20 2a 20 6d 6f 76 65 20  *.  **   * move 
31a10 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74  the relative pat
31a20 68 20 73 74 72 69 6e 67 20 73 6f 20 74 68 61 74  h string so that
31a30 20 69 74 20 69 73 20 61 74 20 74 68 65 20 65 6e   it is at the en
31a40 64 20 6f 66 20 74 68 0a 20 20 2a 2a 20 20 20 20  d of th.  **    
31a50 20 7a 4f 75 74 5b 5d 20 62 75 66 66 65 72 2e 0a   zOut[] buffer..
31a60 20 20 2a 2a 20 20 20 2a 20 43 61 6c 6c 20 67 65    **   * Call ge
31a70 74 63 77 64 28 29 20 74 6f 20 72 65 61 64 20 74  tcwd() to read t
31a80 68 65 20 70 61 74 68 20 6f 66 20 74 68 65 20 63  he path of the c
31a90 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64  urrent working d
31aa0 69 72 65 63 74 6f 72 79 20 0a 20 20 2a 2a 20 20  irectory .  **  
31ab0 20 20 20 69 6e 74 6f 20 74 68 65 20 73 74 61 72     into the star
31ac0 74 20 6f 66 20 74 68 65 20 7a 4f 75 74 5b 5d 20  t of the zOut[] 
31ad0 62 75 66 66 65 72 2e 0a 20 20 2a 2a 20 20 20 2a  buffer..  **   *
31ae0 20 41 70 70 65 6e 64 20 61 20 27 2f 27 20 63 68   Append a '/' ch
31af0 61 72 61 63 74 65 72 20 74 6f 20 74 68 65 20 63  aracter to the c
31b00 77 64 20 73 74 72 69 6e 67 20 61 6e 64 20 6d 6f  wd string and mo
31b10 76 65 20 74 68 65 20 0a 20 20 2a 2a 20 20 20 20  ve the .  **    
31b20 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 62   relative path b
31b30 61 63 6b 20 77 69 74 68 69 6e 20 74 68 65 20 62  ack within the b
31b40 75 66 66 65 72 20 73 6f 20 74 68 61 74 20 69 74  uffer so that it
31b50 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 20 20   immediately .  
31b60 2a 2a 20 20 20 20 20 66 6f 6c 6c 6f 77 73 20 74  **     follows t
31b70 68 65 20 27 2f 27 2e 0a 20 20 2a 2a 0a 20 20 2a  he '/'..  **.  *
31b80 2a 20 54 68 69 73 20 63 6f 64 65 20 69 73 20 77  * This code is w
31b90 72 69 74 74 65 6e 20 73 6f 20 74 68 61 74 20 69  ritten so that i
31ba0 66 20 74 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f  f the combinatio
31bb0 6e 20 6f 66 20 74 68 65 20 43 57 44 20 61 6e 64  n of the CWD and
31bc0 20 72 65 6c 61 74 69 76 65 0a 20 20 2a 2a 20 70   relative.  ** p
31bd0 61 74 68 20 61 72 65 20 6c 61 72 67 65 72 20 74  ath are larger t
31be0 68 61 6e 20 74 68 65 20 61 6c 6c 6f 63 61 74 65  han the allocate
31bf0 64 20 73 69 7a 65 20 6f 66 20 7a 4f 75 74 5b 5d  d size of zOut[]
31c00 20 74 68 65 20 43 57 44 20 69 73 20 73 69 6c 65   the CWD is sile
31c10 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 75 6e 63 61  ntly.  ** trunca
31c20 74 65 64 20 74 6f 20 6d 61 6b 65 20 69 74 20 66  ted to make it f
31c30 69 74 2e 20 54 68 69 73 20 69 73 20 4f 6b 2c 20  it. This is Ok, 
31c40 61 73 20 53 51 4c 69 74 65 20 72 65 66 75 73 65  as SQLite refuse
31c50 73 20 74 6f 20 6f 70 65 6e 20 61 6e 79 0a 20 20  s to open any.  
31c60 2a 2a 20 66 69 6c 65 20 66 6f 72 20 77 68 69 63  ** file for whic
31c70 68 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  h this function 
31c80 72 65 74 75 72 6e 73 20 61 20 66 75 6c 6c 20 70  returns a full p
31c90 61 74 68 20 6c 61 72 67 65 72 20 74 68 61 6e 20  ath larger than 
31ca0 28 6e 4f 75 74 2d 38 29 0a 20 20 2a 2a 20 62 79  (nOut-8).  ** by
31cb0 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 20 2a 2f  tes in size.  */
31cc0 0a 20 20 69 66 28 20 7a 4f 75 74 5b 30 5d 21 3d  .  if( zOut[0]!=
31cd0 27 2f 27 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  '/' ){.    int n
31ce0 43 77 64 3b 0a 20 20 20 20 69 6e 74 20 6e 52 65  Cwd;.    int nRe
31cf0 6d 20 3d 20 6e 4f 75 74 2d 6e 42 79 74 65 2d 31  m = nOut-nByte-1
31d00 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 7a  ;.    memmove(&z
31d10 4f 75 74 5b 6e 52 65 6d 5d 2c 20 7a 4f 75 74 2c  Out[nRem], zOut,
31d20 20 6e 42 79 74 65 2b 31 29 3b 0a 20 20 20 20 7a   nByte+1);.    z
31d30 4f 75 74 5b 6e 52 65 6d 2d 31 5d 20 3d 20 27 5c  Out[nRem-1] = '\
31d40 30 27 3b 0a 20 20 20 20 69 66 28 20 6f 73 47 65  0';.    if( osGe
31d50 74 63 77 64 28 7a 4f 75 74 2c 20 6e 52 65 6d 2d  tcwd(zOut, nRem-
31d60 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  1)==0 ){.      r
31d70 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72  eturn unixLogErr
31d80 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
31d90 45 4e 5f 42 4b 50 54 2c 20 22 67 65 74 63 77 64  EN_BKPT, "getcwd
31da0 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d  ", zPath);.    }
31db0 0a 20 20 20 20 6e 43 77 64 20 3d 20 73 71 6c 69  .    nCwd = sqli
31dc0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 75 74  te3Strlen30(zOut
31dd0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
31de0 43 77 64 3c 3d 6e 52 65 6d 2d 31 20 29 3b 0a 20  Cwd<=nRem-1 );. 
31df0 20 20 20 7a 4f 75 74 5b 6e 43 77 64 5d 20 3d 20     zOut[nCwd] = 
31e00 27 2f 27 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65  '/';.    memmove
31e10 28 26 7a 4f 75 74 5b 6e 43 77 64 2b 31 5d 2c 20  (&zOut[nCwd+1], 
31e20 26 7a 4f 75 74 5b 6e 52 65 6d 5d 2c 20 6e 42 79  &zOut[nRem], nBy
31e30 74 65 2b 31 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  te+1);.  }..  re
31e40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
31e50 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
31e60 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
31e70 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74  ENSION./*.** Int
31e80 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e  erfaces for open
31e90 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62  ing a shared lib
31ea0 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e  rary, finding en
31eb0 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69  try points.** wi
31ec0 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20  thin the shared 
31ed0 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f  library, and clo
31ee0 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  sing the shared 
31ef0 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63  library..*/.#inc
31f00 6c 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a 73  lude <dlfcn.h>.s
31f10 74 61 74 69 63 20 76 6f 69 64 20 2a 75 6e 69 78  tatic void *unix
31f20 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76  DlOpen(sqlite3_v
31f30 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 63 6f 6e  fs *NotUsed, con
31f40 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
31f50 6d 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  me){.  UNUSED_PA
31f60 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
31f70 3b 0a 20 20 72 65 74 75 72 6e 20 64 6c 6f 70 65  ;.  return dlope
31f80 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52 54 4c  n(zFilename, RTL
31f90 44 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f 47 4c 4f  D_NOW | RTLD_GLO
31fa0 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  BAL);.}../*.** S
31fb0 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73  QLite calls this
31fc0 20 66 75 6e 63 74 69 6f 6e 20 69 6d 6d 65 64 69   function immedi
31fd0 61 74 65 6c 79 20 61 66 74 65 72 20 61 20 63 61  ately after a ca
31fe0 6c 6c 20 74 6f 20 75 6e 69 78 44 6c 53 79 6d 28  ll to unixDlSym(
31ff0 29 20 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f 70  ) or.** unixDlOp
32000 65 6e 28 29 20 66 61 69 6c 73 20 28 72 65 74 75  en() fails (retu
32010 72 6e 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74  rns a null point
32020 65 72 29 2e 20 49 66 20 61 20 6d 6f 72 65 20 64  er). If a more d
32030 65 74 61 69 6c 65 64 20 65 72 72 6f 72 0a 2a 2a  etailed error.**
32040 20 6d 65 73 73 61 67 65 20 69 73 20 61 76 61 69   message is avai
32050 6c 61 62 6c 65 2c 20 69 74 20 69 73 20 77 72 69  lable, it is wri
32060 74 74 65 6e 20 74 6f 20 7a 42 75 66 4f 75 74 2e  tten to zBufOut.
32070 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6d 65 73   If no error mes
32080 73 61 67 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c  sage.** is avail
32090 61 62 6c 65 2c 20 7a 42 75 66 4f 75 74 20 69 73  able, zBufOut is
320a0 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64   left unmodified
320b0 20 61 6e 64 20 53 51 4c 69 74 65 20 75 73 65 73   and SQLite uses
320c0 20 61 20 64 65 66 61 75 6c 74 0a 2a 2a 20 65 72   a default.** er
320d0 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a  ror message..*/.
320e0 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
320f0 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f  DlError(sqlite3_
32100 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  vfs *NotUsed, in
32110 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
32120 75 66 4f 75 74 29 7b 0a 20 20 63 6f 6e 73 74 20  ufOut){.  const 
32130 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 55 4e  char *zErr;.  UN
32140 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
32150 6f 74 55 73 65 64 29 3b 0a 20 20 75 6e 69 78 45  otUsed);.  unixE
32160 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 7a  nterMutex();.  z
32170 45 72 72 20 3d 20 64 6c 65 72 72 6f 72 28 29 3b  Err = dlerror();
32180 0a 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20  .  if( zErr ){. 
32190 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
321a0 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 4f 75  ntf(nBuf, zBufOu
321b0 74 2c 20 22 25 73 22 2c 20 7a 45 72 72 29 3b 0a  t, "%s", zErr);.
321c0 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d    }.  unixLeaveM
321d0 75 74 65 78 28 29 3b 0a 7d 0a 73 74 61 74 69 63  utex();.}.static
321e0 20 76 6f 69 64 20 28 2a 75 6e 69 78 44 6c 53 79   void (*unixDlSy
321f0 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  m(sqlite3_vfs *N
32200 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 2c  otUsed, void *p,
32210 20 63 6f 6e 73 74 20 63 68 61 72 2a 7a 53 79 6d   const char*zSym
32220 29 29 28 76 6f 69 64 29 7b 0a 20 20 2f 2a 20 0a  ))(void){.  /* .
32230 20 20 2a 2a 20 47 43 43 20 77 69 74 68 20 2d 70    ** GCC with -p
32240 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 20 73  edantic-errors s
32250 61 79 73 20 74 68 61 74 20 43 39 30 20 64 6f 65  ays that C90 doe
32260 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 76 6f  s not allow a vo
32270 69 64 2a 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63  id* to be.  ** c
32280 61 73 74 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74  ast into a point
32290 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
322a0 2e 20 20 41 6e 64 20 79 65 74 20 74 68 65 20 6c  .  And yet the l
322b0 69 62 72 61 72 79 20 64 6c 73 79 6d 28 29 20 72  ibrary dlsym() r
322c0 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 72 65 74 75  outine.  ** retu
322d0 72 6e 73 20 61 20 76 6f 69 64 2a 20 77 68 69 63  rns a void* whic
322e0 68 20 69 73 20 72 65 61 6c 6c 79 20 61 20 70 6f  h is really a po
322f0 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
32300 69 6f 6e 2e 20 20 53 6f 20 68 6f 77 20 64 6f 20  ion.  So how do 
32310 77 65 0a 20 20 2a 2a 20 75 73 65 20 64 6c 73 79  we.  ** use dlsy
32320 6d 28 29 20 77 69 74 68 20 2d 70 65 64 61 6e 74  m() with -pedant
32330 69 63 2d 65 72 72 6f 72 73 3f 0a 20 20 2a 2a 0a  ic-errors?.  **.
32340 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 78 20    ** Variable x 
32350 62 65 6c 6f 77 20 69 73 20 64 65 66 69 6e 65 64  below is defined
32360 20 74 6f 20 62 65 20 61 20 70 6f 69 6e 74 65 72   to be a pointer
32370 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74   to a function t
32380 61 6b 69 6e 67 0a 20 20 2a 2a 20 70 61 72 61 6d  aking.  ** param
32390 65 74 65 72 73 20 76 6f 69 64 2a 20 61 6e 64 20  eters void* and 
323a0 63 6f 6e 73 74 20 63 68 61 72 2a 20 61 6e 64 20  const char* and 
323b0 72 65 74 75 72 6e 69 6e 67 20 61 20 70 6f 69 6e  returning a poin
323c0 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
323d0 6e 2e 0a 20 20 2a 2a 20 57 65 20 69 6e 69 74 69  n..  ** We initi
323e0 61 6c 69 7a 65 20 78 20 62 79 20 61 73 73 69 67  alize x by assig
323f0 6e 69 6e 67 20 69 74 20 61 20 70 6f 69 6e 74 65  ning it a pointe
32400 72 20 74 6f 20 74 68 65 20 64 6c 73 79 6d 28 29  r to the dlsym()
32410 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20   function..  ** 
32420 28 54 68 61 74 20 61 73 73 69 67 6e 6d 65 6e 74  (That assignment
32430 20 72 65 71 75 69 72 65 73 20 61 20 63 61 73 74   requires a cast
32440 2e 29 20 20 54 68 65 6e 20 77 65 20 63 61 6c 6c  .)  Then we call
32450 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 74 68   the function th
32460 61 74 0a 20 20 2a 2a 20 78 20 70 6f 69 6e 74 73  at.  ** x points
32470 20 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a   to.  .  **.  **
32480 20 54 68 69 73 20 77 6f 72 6b 2d 61 72 6f 75 6e   This work-aroun
32490 64 20 69 73 20 75 6e 6c 69 6b 65 6c 79 20 74 6f  d is unlikely to
324a0 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 20   work correctly 
324b0 6f 6e 20 61 6e 79 20 73 79 73 74 65 6d 20 77 68  on any system wh
324c0 65 72 65 0a 20 20 2a 2a 20 79 6f 75 20 72 65 61  ere.  ** you rea
324d0 6c 6c 79 20 63 61 6e 6e 6f 74 20 63 61 73 74 20  lly cannot cast 
324e0 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74  a function point
324f0 65 72 20 69 6e 74 6f 20 76 6f 69 64 2a 2e 20 20  er into void*.  
32500 42 75 74 20 74 68 65 6e 2c 20 6f 6e 20 74 68 65  But then, on the
32510 0a 20 20 2a 2a 20 6f 74 68 65 72 20 68 61 6e 64  .  ** other hand
32520 2c 20 64 6c 73 79 6d 28 29 20 77 69 6c 6c 20 6e  , dlsym() will n
32530 6f 74 20 77 6f 72 6b 20 6f 6e 20 73 75 63 68 20  ot work on such 
32540 61 20 73 79 73 74 65 6d 20 65 69 74 68 65 72 2c  a system either,
32550 20 73 6f 20 77 65 20 68 61 76 65 0a 20 20 2a 2a   so we have.  **
32560 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6c 6f 73 74   not really lost
32570 20 61 6e 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a   anything..  */.
32580 20 20 76 6f 69 64 20 28 2a 28 2a 78 29 28 76 6f    void (*(*x)(vo
32590 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  id*,const char*)
325a0 29 28 76 6f 69 64 29 3b 0a 20 20 55 4e 55 53 45  )(void);.  UNUSE
325b0 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
325c0 73 65 64 29 3b 0a 20 20 78 20 3d 20 28 76 6f 69  sed);.  x = (voi
325d0 64 28 2a 28 2a 29 28 76 6f 69 64 2a 2c 63 6f 6e  d(*(*)(void*,con
325e0 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29  st char*))(void)
325f0 29 64 6c 73 79 6d 3b 0a 20 20 72 65 74 75 72 6e  )dlsym;.  return
32600 20 28 2a 78 29 28 70 2c 20 7a 53 79 6d 29 3b 0a   (*x)(p, zSym);.
32610 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  }.static void un
32620 69 78 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65  ixDlClose(sqlite
32630 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
32640 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a  void *pHandle){.
32650 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
32660 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 64  ER(NotUsed);.  d
32670 6c 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29 3b  lclose(pHandle);
32680 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53  .}.#else /* if S
32690 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
326a0 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66  EXTENSION is def
326b0 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69  ined: */.  #defi
326c0 6e 65 20 75 6e 69 78 44 6c 4f 70 65 6e 20 20 30  ne unixDlOpen  0
326d0 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44  .  #define unixD
326e0 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69  lError 0.  #defi
326f0 6e 65 20 75 6e 69 78 44 6c 53 79 6d 20 20 20 30  ne unixDlSym   0
32700 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44  .  #define unixD
32710 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a  lClose 0.#endif.
32720 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e 42 75  ./*.** Write nBu
32730 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f  f bytes of rando
32740 6d 20 64 61 74 61 20 74 6f 20 74 68 65 20 73 75  m data to the su
32750 70 70 6c 69 65 64 20 62 75 66 66 65 72 20 7a 42  pplied buffer zB
32760 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  uf..*/.static in
32770 74 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73  t unixRandomness
32780 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
32790 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c  tUsed, int nBuf,
327a0 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
327b0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
327c0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 61 73 73  (NotUsed);.  ass
327d0 65 72 74 28 28 73 69 7a 65 5f 74 29 6e 42 75 66  ert((size_t)nBuf
327e0 3e 3d 28 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74  >=(sizeof(time_t
327f0 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29 29 3b  )+sizeof(int)));
32800 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 74  ..  /* We have t
32810 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75  o initialize zBu
32820 66 20 74 6f 20 70 72 65 76 65 6e 74 20 76 61 6c  f to prevent val
32830 67 72 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72  grind from repor
32840 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73  ting.  ** errors
32850 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73 20 69  .  The reports i
32860 73 73 75 65 64 20 62 79 20 76 61 6c 67 72 69 6e  ssued by valgrin
32870 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63 74 20  d are incorrect 
32880 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20  - we would.  ** 
32890 70 72 65 66 65 72 20 74 68 61 74 20 74 68 65 20  prefer that the 
328a0 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e  randomness be in
328b0 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b 69 6e  creased by makin
328c0 67 20 75 73 65 20 6f 66 20 74 68 65 0a 20 20 2a  g use of the.  *
328d0 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  * uninitialized 
328e0 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20 2d 20  space in zBuf - 
328f0 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65 72 72  but valgrind err
32900 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f 72 72  ors tend to worr
32910 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72  y.  ** some user
32920 73 2e 20 20 52 61 74 68 65 72 20 74 68 61 6e 20  s.  Rather than 
32930 61 72 67 75 65 2c 20 69 74 20 73 65 65 6d 73 20  argue, it seems 
32940 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f 20 69  easier just to i
32950 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74  nitialize.  ** t
32960 68 65 20 77 68 6f 6c 65 20 61 72 72 61 79 20 61  he whole array a
32970 6e 64 20 73 69 6c 65 6e 63 65 20 76 61 6c 67 72  nd silence valgr
32980 69 6e 64 2c 20 65 76 65 6e 20 69 66 20 74 68 61  ind, even if tha
32990 74 20 6d 65 61 6e 73 20 6c 65 73 73 20 72 61 6e  t means less ran
329a0 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20  domness.  ** in 
329b0 74 68 65 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e  the random seed.
329c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
329d0 74 65 73 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c  testing, initial
329e0 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20  izing zBuf[] to 
329f0 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77 65 20 64  zero is all we d
32a00 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 0a 20  o.  That means. 
32a10 20 2a 2a 20 74 68 61 74 20 77 65 20 61 6c 77 61   ** that we alwa
32a20 79 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 20  ys use the same 
32a30 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65  random number se
32a40 71 75 65 6e 63 65 2e 20 20 54 68 69 73 20 6d 61  quence.  This ma
32a50 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 74 65 73  kes the.  ** tes
32a60 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e 0a 20  ts repeatable.. 
32a70 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75   */.  memset(zBu
32a80 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 20 20 72  f, 0, nBuf);.  r
32a90 61 6e 64 6f 6d 6e 65 73 73 50 69 64 20 3d 20 6f  andomnessPid = o
32aa0 73 47 65 74 70 69 64 28 30 29 3b 20 20 0a 23 69  sGetpid(0);  .#i
32ab0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
32ac0 45 5f 54 45 53 54 29 20 26 26 20 21 64 65 66 69  E_TEST) && !defi
32ad0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
32ae0 52 41 4e 44 4f 4d 4e 45 53 53 29 0a 20 20 7b 0a  RANDOMNESS).  {.
32af0 20 20 20 20 69 6e 74 20 66 64 2c 20 67 6f 74 3b      int fd, got;
32b00 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74  .    fd = robust
32b10 5f 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e  _open("/dev/uran
32b20 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20  dom", O_RDONLY, 
32b30 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30  0);.    if( fd<0
32b40 20 29 7b 0a 20 20 20 20 20 20 74 69 6d 65 5f 74   ){.      time_t
32b50 20 74 3b 0a 20 20 20 20 20 20 74 69 6d 65 28 26   t;.      time(&
32b60 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  t);.      memcpy
32b70 28 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f  (zBuf, &t, sizeo
32b80 66 28 74 29 29 3b 0a 20 20 20 20 20 20 6d 65 6d  f(t));.      mem
32b90 63 70 79 28 26 7a 42 75 66 5b 73 69 7a 65 6f 66  cpy(&zBuf[sizeof
32ba0 28 74 29 5d 2c 20 26 72 61 6e 64 6f 6d 6e 65 73  (t)], &randomnes
32bb0 73 50 69 64 2c 20 73 69 7a 65 6f 66 28 72 61 6e  sPid, sizeof(ran
32bc0 64 6f 6d 6e 65 73 73 50 69 64 29 29 3b 0a 20 20  domnessPid));.  
32bd0 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
32be0 6f 66 28 74 29 2b 73 69 7a 65 6f 66 28 72 61 6e  of(t)+sizeof(ran
32bf0 64 6f 6d 6e 65 73 73 50 69 64 29 3c 3d 28 73 69  domnessPid)<=(si
32c00 7a 65 5f 74 29 6e 42 75 66 20 29 3b 0a 20 20 20  ze_t)nBuf );.   
32c10 20 20 20 6e 42 75 66 20 3d 20 73 69 7a 65 6f 66     nBuf = sizeof
32c20 28 74 29 20 2b 20 73 69 7a 65 6f 66 28 72 61 6e  (t) + sizeof(ran
32c30 64 6f 6d 6e 65 73 73 50 69 64 29 3b 0a 20 20 20  domnessPid);.   
32c40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 6f   }else{.      do
32c50 7b 20 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 66  { got = osRead(f
32c60 64 2c 20 7a 42 75 66 2c 20 6e 42 75 66 29 3b 20  d, zBuf, nBuf); 
32c70 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26  }while( got<0 &&
32c80 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
32c90 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  .      robust_cl
32ca0 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e  ose(0, fd, __LIN
32cb0 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E__);.    }.  }.
32cc0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
32cd0 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  nBuf;.}.../*.** 
32ce0 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74  Sleep for a litt
32cf0 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72  le while.  Retur
32d00 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
32d10 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54  time slept..** T
32d20 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  he argument is t
32d30 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63  he number of mic
32d40 72 6f 73 65 63 6f 6e 64 73 20 77 65 20 77 61 6e  roseconds we wan
32d50 74 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20 54  t to sleep..** T
32d60 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
32d70 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
32d80 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 6f 66   microseconds of
32d90 20 73 6c 65 65 70 20 61 63 74 75 61 6c 6c 79 0a   sleep actually.
32da0 2a 2a 20 72 65 71 75 65 73 74 65 64 20 66 72 6f  ** requested fro
32db0 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  m the underlying
32dc0 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
32dd0 6d 2c 20 61 20 6e 75 6d 62 65 72 20 77 68 69 63  m, a number whic
32de0 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 67 72  h.** might be gr
32df0 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
32e00 75 61 6c 20 74 6f 20 74 68 65 20 61 72 67 75 6d  ual to the argum
32e10 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 6c 65 73  ent, but not les
32e20 73 0a 2a 2a 20 74 68 61 6e 20 74 68 65 20 61 72  s.** than the ar
32e30 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
32e40 63 20 69 6e 74 20 75 6e 69 78 53 6c 65 65 70 28  c int unixSleep(
32e50 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
32e60 55 73 65 64 2c 20 69 6e 74 20 6d 69 63 72 6f 73  Used, int micros
32e70 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20 4f 53 5f  econds){.#if OS_
32e80 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74  VXWORKS.  struct
32e90 20 74 69 6d 65 73 70 65 63 20 73 70 3b 0a 0a 20   timespec sp;.. 
32ea0 20 73 70 2e 74 76 5f 73 65 63 20 3d 20 6d 69 63   sp.tv_sec = mic
32eb0 72 6f 73 65 63 6f 6e 64 73 20 2f 20 31 30 30 30  roseconds / 1000
32ec0 30 30 30 3b 0a 20 20 73 70 2e 74 76 5f 6e 73 65  000;.  sp.tv_nse
32ed0 63 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64  c = (microsecond
32ee0 73 20 25 20 31 30 30 30 30 30 30 29 20 2a 20 31  s % 1000000) * 1
32ef0 30 30 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65 70  000;.  nanosleep
32f00 28 26 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55  (&sp, NULL);.  U
32f10 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
32f20 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
32f30 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b  rn microseconds;
32f40 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48  .#elif defined(H
32f50 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48  AVE_USLEEP) && H
32f60 41 56 45 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c  AVE_USLEEP.  usl
32f70 65 65 70 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73  eep(microseconds
32f80 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
32f90 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
32fa0 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65    return microse
32fb0 63 6f 6e 64 73 3b 0a 23 65 6c 73 65 0a 20 20 69  conds;.#else.  i
32fc0 6e 74 20 73 65 63 6f 6e 64 73 20 3d 20 28 6d 69  nt seconds = (mi
32fd0 63 72 6f 73 65 63 6f 6e 64 73 2b 39 39 39 39 39  croseconds+99999
32fe0 39 29 2f 31 30 30 30 30 30 30 3b 0a 20 20 73 6c  9)/1000000;.  sl
32ff0 65 65 70 28 73 65 63 6f 6e 64 73 29 3b 0a 20 20  eep(seconds);.  
33000 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
33010 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
33020 75 72 6e 20 73 65 63 6f 6e 64 73 2a 31 30 30 30  urn seconds*1000
33030 30 30 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  000;.#endif.}../
33040 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
33050 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20  ng variable, if 
33060 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  set to a non-zer
33070 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65  o value, is inte
33080 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68  rpreted as.** th
33090 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f  e number of seco
330a0 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 20 61  nds since 1970 a
330b0 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 73 65  nd is used to se
330c0 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a  t the result of.
330d0 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72  ** sqlite3OsCurr
330e0 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67  entTime() during
330f0 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66   testing..*/.#if
33100 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
33110 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72  int sqlite3_curr
33120 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f  ent_time = 0;  /
33130 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69  * Fake system ti
33140 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69  me in seconds si
33150 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e  nce 1970. */.#en
33160 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  dif../*.** Find 
33170 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
33180 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43   (in Universal C
33190 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29  oordinated Time)
331a0 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  .  Write into *p
331b0 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72  iNow.** the curr
331c0 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74  ent time and dat
331d0 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
331e0 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38  y number times 8
331f0 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a  6_400_000.  In.*
33200 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77  * other words, w
33210 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77  rite into *piNow
33220 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
33230 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63  illiseconds sinc
33240 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20  e the Julian.** 
33250 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e  epoch of noon in
33260 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f   Greenwich on No
33270 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20  vember 24, 4714 
33280 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  B.C according to
33290 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69   the.** prolepti
332a0 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65  c Gregorian cale
332b0 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73  ndar..**.** On s
332c0 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 53  uccess, return S
332d0 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72  QLITE_OK.  Retur
332e0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69  n SQLITE_ERROR i
332f0 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64  f the time and d
33300 61 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  ate .** cannot b
33310 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  e found..*/.stat
33320 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65  ic int unixCurre
33330 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69  ntTimeInt64(sqli
33340 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
33350 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
33360 2a 70 69 4e 6f 77 29 7b 0a 20 20 73 74 61 74 69  *piNow){.  stati
33370 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
33380 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20  int64 unixEpoch 
33390 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69  = 24405875*(sqli
333a0 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30  te3_int64)864000
333b0 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  0;.  int rc = SQ
333c0 4c 49 54 45 5f 4f 4b 3b 0a 23 69 66 20 64 65 66  LITE_OK;.#if def
333d0 69 6e 65 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a  ined(NO_GETTOD).
333e0 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69    time_t t;.  ti
333f0 6d 65 28 26 74 29 3b 0a 20 20 2a 70 69 4e 6f 77  me(&t);.  *piNow
33400 20 3d 20 28 28 73 71 6c 69 74 65 33 5f 69 6e 74   = ((sqlite3_int
33410 36 34 29 74 29 2a 31 30 30 30 20 2b 20 75 6e 69  64)t)*1000 + uni
33420 78 45 70 6f 63 68 3b 0a 23 65 6c 69 66 20 4f 53  xEpoch;.#elif OS
33430 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63  _VXWORKS.  struc
33440 74 20 74 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b  t timespec sNow;
33450 0a 20 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65  .  clock_gettime
33460 28 43 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c  (CLOCK_REALTIME,
33470 20 26 73 4e 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f   &sNow);.  *piNo
33480 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20  w = unixEpoch + 
33490 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e  1000*(sqlite3_in
334a0 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20  t64)sNow.tv_sec 
334b0 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f 31  + sNow.tv_nsec/1
334c0 30 30 30 30 30 30 3b 0a 23 65 6c 73 65 0a 20 20  000000;.#else.  
334d0 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73  struct timeval s
334e0 4e 6f 77 3b 0a 20 20 69 66 28 20 67 65 74 74 69  Now;.  if( getti
334f0 6d 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20 30  meofday(&sNow, 0
33500 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 69 4e  )==0 ){.    *piN
33510 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b  ow = unixEpoch +
33520 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69   1000*(sqlite3_i
33530 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63  nt64)sNow.tv_sec
33540 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f   + sNow.tv_usec/
33550 31 30 30 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  1000;.  }else{. 
33560 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
33570 52 52 4f 52 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  RROR;.  }.#endif
33580 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
33590 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74  TEST.  if( sqlit
335a0 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
335b0 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20  ){.    *piNow = 
335c0 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e  1000*(sqlite3_in
335d0 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72  t64)sqlite3_curr
335e0 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45  ent_time + unixE
335f0 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  poch;.  }.#endif
33600 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
33610 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
33620 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
33630 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72  .** Find the cur
33640 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e  rent time (in Un
33650 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61  iversal Coordina
33660 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74  ted Time).  Writ
33670 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  e the.** current
33680 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61   time and date a
33690 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e  s a Julian Day n
336a0 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f  umber into *prNo
336b0 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20  w and.** return 
336c0 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  0.  Return 1 if 
336d0 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74  the time and dat
336e0 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  e cannot be foun
336f0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
33700 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65   unixCurrentTime
33710 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
33720 74 55 73 65 64 2c 20 64 6f 75 62 6c 65 20 2a 70  tUsed, double *p
33730 72 4e 6f 77 29 7b 0a 20 20 73 71 6c 69 74 65 33  rNow){.  sqlite3
33740 5f 69 6e 74 36 34 20 69 20 3d 20 30 3b 0a 20 20  _int64 i = 0;.  
33750 69 6e 74 20 72 63 3b 0a 20 20 55 4e 55 53 45 44  int rc;.  UNUSED
33760 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
33770 65 64 29 3b 0a 20 20 72 63 20 3d 20 75 6e 69 78  ed);.  rc = unix
33780 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
33790 28 30 2c 20 26 69 29 3b 0a 20 20 2a 70 72 4e 6f  (0, &i);.  *prNo
337a0 77 20 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30  w = i/86400000.0
337b0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
337c0 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 61 64 64 65 64  ../*.** We added
337d0 20 74 68 65 20 78 47 65 74 4c 61 73 74 45 72 72   the xGetLastErr
337e0 6f 72 28 29 20 6d 65 74 68 6f 64 20 77 69 74 68  or() method with
337f0 20 74 68 65 20 69 6e 74 65 6e 74 69 6f 6e 20 6f   the intention o
33800 66 20 70 72 6f 76 69 64 69 6e 67 0a 2a 2a 20 62  f providing.** b
33810 65 74 74 65 72 20 6c 6f 77 2d 6c 65 76 65 6c 20  etter low-level 
33820 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 77  error messages w
33830 68 65 6e 20 6f 70 65 72 61 74 69 6e 67 2d 73 79  hen operating-sy
33840 73 74 65 6d 20 70 72 6f 62 6c 65 6d 73 20 63 6f  stem problems co
33850 6d 65 20 75 70 0a 2a 2a 20 64 75 72 69 6e 67 20  me up.** during 
33860 53 51 4c 69 74 65 20 6f 70 65 72 61 74 69 6f 6e  SQLite operation
33870 2e 20 20 42 75 74 20 73 6f 20 66 61 72 2c 20 6e  .  But so far, n
33880 6f 6e 65 20 6f 66 20 74 68 61 74 20 68 61 73 20  one of that has 
33890 62 65 65 6e 20 69 6d 70 6c 65 6d 65 6e 74 65 64  been implemented
338a0 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 65 2e  .** in the core.
338b0 20 20 53 6f 20 74 68 69 73 20 72 6f 75 74 69 6e    So this routin
338c0 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  e is never calle
338d0 64 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 69 74 20  d.  For now, it 
338e0 69 73 20 6d 65 72 65 6c 79 0a 2a 2a 20 61 20 70  is merely.** a p
338f0 6c 61 63 65 2d 68 6f 6c 64 65 72 2e 0a 2a 2f 0a  lace-holder..*/.
33900 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47  static int unixG
33910 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69  etLastError(sqli
33920 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
33930 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 2c 20  , int NotUsed2, 
33940 63 68 61 72 20 2a 4e 6f 74 55 73 65 64 33 29 7b  char *NotUsed3){
33950 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
33960 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
33970 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
33980 28 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 55 4e  (NotUsed2);.  UN
33990 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
339a0 6f 74 55 73 65 64 33 29 3b 0a 20 20 72 65 74 75  otUsed3);.  retu
339b0 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a  rn 0;.}.../*.***
339c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
339d0 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 73 71 6c  ***** End of sql
339e0 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73  ite3_vfs methods
339f0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
33a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
33a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
33a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
33ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33ac0 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 50  ******** Begin P
33ad0 72 6f 78 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  roxy Locking ***
33ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
33b00 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e  .** Proxy lockin
33b10 67 20 69 73 20 61 20 22 75 62 65 72 2d 6c 6f 63  g is a "uber-loc
33b20 6b 69 6e 67 2d 6d 65 74 68 6f 64 22 20 69 6e 20  king-method" in 
33b30 74 68 69 73 20 73 65 6e 73 65 3a 20 20 49 74 20  this sense:  It 
33b40 75 73 65 73 20 74 68 65 0a 2a 2a 20 6f 74 68 65  uses the.** othe
33b50 72 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  r locking method
33b60 73 20 6f 6e 20 73 65 63 6f 6e 64 61 72 79 20 6c  s on secondary l
33b70 6f 63 6b 20 66 69 6c 65 73 2e 20 20 50 72 6f 78  ock files.  Prox
33b80 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 0a 2a  y locking is a.*
33b90 2a 20 6d 65 74 61 2d 6c 61 79 65 72 20 6f 76 65  * meta-layer ove
33ba0 72 20 74 6f 70 20 6f 66 20 74 68 65 20 70 72 69  r top of the pri
33bb0 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 69  mitive locking i
33bc0 6d 70 6c 65 6d 65 6e 74 65 64 20 61 62 6f 76 65  mplemented above
33bd0 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 69 73 20 72  .  For.** this r
33be0 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73  eason, the divis
33bf0 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ion that impleme
33c00 6e 74 73 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63  nts of proxy loc
33c10 6b 69 6e 67 20 69 73 20 64 65 66 65 72 72 65 64  king is deferred
33c20 0a 2a 2a 20 75 6e 74 69 6c 20 6c 61 74 65 20 69  .** until late i
33c30 6e 20 74 68 65 20 66 69 6c 65 20 28 68 65 72 65  n the file (here
33c40 29 20 61 66 74 65 72 20 61 6c 6c 20 6f 66 20 74  ) after all of t
33c50 68 65 20 6f 74 68 65 72 20 49 2f 4f 20 6d 65 74  he other I/O met
33c60 68 6f 64 73 20 68 61 76 65 0a 2a 2a 20 62 65 65  hods have.** bee
33c70 6e 20 64 65 66 69 6e 65 64 20 2d 20 73 6f 20 74  n defined - so t
33c80 68 61 74 20 74 68 65 20 70 72 69 6d 69 74 69 76  hat the primitiv
33c90 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  e locking method
33ca0 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 0a  s are available.
33cb0 2a 2a 20 61 73 20 73 65 72 76 69 63 65 73 20 74  ** as services t
33cc0 6f 20 68 65 6c 70 20 77 69 74 68 20 74 68 65 20  o help with the 
33cd0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
33ce0 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e  f proxy locking.
33cf0 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  .**.****.**.** T
33d00 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69  he default locki
33d10 6e 67 20 73 63 68 65 6d 65 73 20 69 6e 20 53 51  ng schemes in SQ
33d20 4c 69 74 65 20 75 73 65 20 62 79 74 65 2d 72 61  Lite use byte-ra
33d30 6e 67 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65  nge locks on the
33d40 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
33d50 65 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20  e to coordinate 
33d60 73 61 66 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74  safe, concurrent
33d70 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69   access by multi
33d80 70 6c 65 20 72 65 61 64 65 72 73 0a 2a 2a 20 61  ple readers.** a
33d90 6e 64 20 77 72 69 74 65 72 73 20 5b 68 74 74 70  nd writers [http
33da0 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67 2f 6c 6f  ://sqlite.org/lo
33db0 63 6b 69 6e 67 76 33 2e 68 74 6d 6c 5d 2e 20 20  ckingv3.html].  
33dc0 54 68 65 20 66 69 76 65 20 66 69 6c 65 20 6c 6f  The five file lo
33dd0 63 6b 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73 20  cking.** states 
33de0 28 55 4e 4c 4f 43 4b 45 44 2c 20 50 45 4e 44 49  (UNLOCKED, PENDI
33df0 4e 47 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45  NG, SHARED, RESE
33e00 52 56 45 44 2c 20 45 58 43 4c 55 53 49 56 45 29  RVED, EXCLUSIVE)
33e10 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64   are implemented
33e20 0a 2a 2a 20 61 73 20 50 4f 53 49 58 20 72 65 61  .** as POSIX rea
33e30 64 20 26 20 77 72 69 74 65 20 6c 6f 63 6b 73 20  d & write locks 
33e40 6f 76 65 72 20 66 69 78 65 64 20 73 65 74 20 6f  over fixed set o
33e50 66 20 6c 6f 63 61 74 69 6f 6e 73 20 28 76 69 61  f locations (via
33e60 20 66 73 63 74 6c 29 2c 0a 2a 2a 20 6f 6e 20 41   fsctl),.** on A
33e70 46 50 20 61 6e 64 20 53 4d 42 20 6f 6e 6c 79 20  FP and SMB only 
33e80 65 78 63 6c 75 73 69 76 65 20 62 79 74 65 2d 72  exclusive byte-r
33e90 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 61  ange locks are a
33ea0 76 61 69 6c 61 62 6c 65 20 76 69 61 20 66 73 63  vailable via fsc
33eb0 74 6c 0a 2a 2a 20 77 69 74 68 20 5f 49 4f 57 52  tl.** with _IOWR
33ec0 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74  ('z', 23, struct
33ed0 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
33ee0 32 29 20 74 6f 20 74 72 61 63 6b 20 74 68 65 20  2) to track the 
33ef0 73 61 6d 65 20 35 20 73 74 61 74 65 73 2e 0a 2a  same 5 states..*
33f00 2a 20 54 6f 20 73 69 6d 75 6c 61 74 65 20 61 20  * To simulate a 
33f10 46 5f 52 44 4c 43 4b 20 6f 6e 20 74 68 65 20 73  F_RDLCK on the s
33f20 68 61 72 65 64 20 72 61 6e 67 65 2c 20 6f 6e 20  hared range, on 
33f30 41 46 50 20 61 20 72 61 6e 64 6f 6d 6c 79 20 73  AFP a randomly s
33f40 65 6c 65 63 74 65 64 0a 2a 2a 20 61 64 64 72 65  elected.** addre
33f50 73 73 20 69 6e 20 74 68 65 20 73 68 61 72 65 64  ss in the shared
33f60 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20   range is taken 
33f70 66 6f 72 20 61 20 53 48 41 52 45 44 20 6c 6f 63  for a SHARED loc
33f80 6b 2c 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a  k, the entire.**
33f90 20 73 68 61 72 65 64 20 72 61 6e 67 65 20 69 73   shared range is
33fa0 20 74 61 6b 65 6e 20 66 6f 72 20 61 6e 20 45 58   taken for an EX
33fb0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 29 3a 0a 2a  CLUSIVE lock):.*
33fc0 2a 0a 2a 2a 20 20 20 20 20 20 50 45 4e 44 49 4e  *.**      PENDIN
33fd0 47 5f 42 59 54 45 20 20 20 20 20 20 20 20 30 78  G_BYTE        0x
33fe0 34 30 30 30 30 30 30 30 0a 2a 2a 20 20 20 20 20  40000000.**     
33ff0 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 20   RESERVED_BYTE  
34000 20 20 20 20 20 30 78 34 30 30 30 30 30 30 31 0a       0x40000001.
34010 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 5f 52  **      SHARED_R
34020 41 4e 47 45 20 20 20 20 20 20 20 20 30 78 34 30  ANGE        0x40
34030 30 30 30 30 30 32 20 2d 3e 20 30 78 34 30 30 30  000002 -> 0x4000
34040 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  0200.**.** This 
34050 77 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e 20 74 68  works well on th
34060 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73  e local file sys
34070 74 65 6d 2c 20 62 75 74 20 73 68 6f 77 73 20 61  tem, but shows a
34080 20 6e 65 61 72 6c 79 20 31 30 30 78 0a 2a 2a 20   nearly 100x.** 
34090 73 6c 6f 77 64 6f 77 6e 20 69 6e 20 72 65 61 64  slowdown in read
340a0 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 6e 20   performance on 
340b0 41 46 50 20 62 65 63 61 75 73 65 20 74 68 65 20  AFP because the 
340c0 41 46 50 20 63 6c 69 65 6e 74 20 64 69 73 61 62  AFP client disab
340d0 6c 65 73 0a 2a 2a 20 74 68 65 20 72 65 61 64 20  les.** the read 
340e0 63 61 63 68 65 20 77 68 65 6e 20 62 79 74 65 2d  cache when byte-
340f0 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20  range locks are 
34100 70 72 65 73 65 6e 74 2e 20 20 45 6e 61 62 6c 69  present.  Enabli
34110 6e 67 20 74 68 65 20 72 65 61 64 0a 2a 2a 20 63  ng the read.** c
34120 61 63 68 65 20 65 78 70 6f 73 65 73 20 61 20 63  ache exposes a c
34130 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20 70  ache coherency p
34140 72 6f 62 6c 65 6d 20 74 68 61 74 20 69 73 20 70  roblem that is p
34150 72 65 73 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f 53  resent on all OS
34160 20 58 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 20   X.** supported 
34170 6e 65 74 77 6f 72 6b 20 66 69 6c 65 20 73 79 73  network file sys
34180 74 65 6d 73 2e 20 20 4e 46 53 20 61 6e 64 20 41  tems.  NFS and A
34190 46 50 20 62 6f 74 68 20 6f 62 73 65 72 76 65 20  FP both observe 
341a0 74 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f 2d  the.** close-to-
341b0 6f 70 65 6e 20 73 65 6d 61 6e 74 69 63 73 20 66  open semantics f
341c0 6f 72 20 65 6e 73 75 72 69 6e 67 20 63 61 63 68  or ensuring cach
341d0 65 20 63 6f 68 65 72 65 6e 63 79 0a 2a 2a 20 5b  e coherency.** [
341e0 68 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72 63  http://nfs.sourc
341f0 65 66 6f 72 67 65 2e 6e 65 74 2f 23 66 61 71 5f  eforge.net/#faq_
34200 61 38 5d 2c 20 77 68 69 63 68 20 64 6f 65 73 20  a8], which does 
34210 6e 6f 74 20 65 66 66 65 63 74 69 76 65 6c 79 0a  not effectively.
34220 2a 2a 20 61 64 64 72 65 73 73 20 74 68 65 20 72  ** address the r
34230 65 71 75 69 72 65 6d 65 6e 74 73 20 66 6f 72 20  equirements for 
34240 63 6f 6e 63 75 72 72 65 6e 74 20 64 61 74 61 62  concurrent datab
34250 61 73 65 20 61 63 63 65 73 73 20 62 79 20 6d 75  ase access by mu
34260 6c 74 69 70 6c 65 0a 2a 2a 20 72 65 61 64 65 72  ltiple.** reader
34270 73 20 61 6e 64 20 77 72 69 74 65 72 73 0a 2a 2a  s and writers.**
34280 20 5b 68 74 74 70 3a 2f 2f 77 77 77 2e 6e 61 62   [http://www.nab
34290 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d 6f  ble.com/SQLite-o
342a0 6e 2d 4e 46 53 2d 63 61 63 68 65 2d 63 6f 68 65  n-NFS-cache-cohe
342b0 72 65 6e 63 79 2d 74 64 31 35 36 35 35 37 30 31  rency-td15655701
342c0 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f  .html]..**.** To
342d0 20 61 64 64 72 65 73 73 20 74 68 65 20 70 65 72   address the per
342e0 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20 63 61 63  formance and cac
342f0 68 65 20 63 6f 68 65 72 65 6e 63 79 20 69 73 73  he coherency iss
34300 75 65 73 2c 20 70 72 6f 78 79 20 66 69 6c 65 20  ues, proxy file 
34310 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67  locking.** chang
34320 65 73 20 74 68 65 20 77 61 79 20 64 61 74 61 62  es the way datab
34330 61 73 65 20 61 63 63 65 73 73 20 69 73 20 63 6f  ase access is co
34340 6e 74 72 6f 6c 6c 65 64 20 62 79 20 6c 69 6d 69  ntrolled by limi
34350 74 69 6e 67 20 61 63 63 65 73 73 20 74 6f 20 61  ting access to a
34360 0a 2a 2a 20 73 69 6e 67 6c 65 20 68 6f 73 74 20  .** single host 
34370 61 74 20 61 20 74 69 6d 65 20 61 6e 64 20 6d 6f  at a time and mo
34380 76 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20  ving file locks 
34390 6f 66 66 20 6f 66 20 74 68 65 20 64 61 74 61 62  off of the datab
343a0 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20  ase file.** and 
343b0 6f 6e 74 6f 20 61 20 70 72 6f 78 79 20 66 69 6c  onto a proxy fil
343c0 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66  e on the local f
343d0 69 6c 65 20 73 79 73 74 65 6d 2e 20 20 0a 2a 2a  ile system.  .**
343e0 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20 70 72 6f  .**.** Using pro
343f0 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d  xy locks.** ----
34400 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
34410 0a 2a 2a 20 43 20 41 50 49 73 0a 2a 2a 0a 2a 2a  .** C APIs.**.**
34420 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63    sqlite3_file_c
34430 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d  ontrol(db, dbnam
34440 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  e, SQLITE_FCNTL_
34450 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
34460 45 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  E,.**           
34470 20 20 20 20 20 20 20 20 20 20 20 20 3c 70 72 6f              <pro
34480 78 79 5f 70 61 74 68 3e 20 7c 20 22 3a 61 75 74  xy_path> | ":aut
34490 6f 3a 22 29 3b 0a 2a 2a 20 20 73 71 6c 69 74 65  o:");.**  sqlite
344a0 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
344b0 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54  b, dbname, SQLIT
344c0 45 5f 46 43 4e 54 4c 5f 47 45 54 5f 4c 4f 43 4b  E_FCNTL_GET_LOCK
344d0 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20 20  PROXYFILE,.**   
344e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
344f0 20 20 20 20 26 3c 70 72 6f 78 79 5f 70 61 74 68      &<proxy_path
34500 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c  >);.**.**.** SQL
34510 20 70 72 61 67 6d 61 73 0a 2a 2a 0a 2a 2a 20 20   pragmas.**.**  
34520 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65  PRAGMA [database
34530 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c  .]lock_proxy_fil
34540 65 3d 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c  e=<proxy_path> |
34550 20 3a 61 75 74 6f 3a 0a 2a 2a 20 20 50 52 41 47   :auto:.**  PRAG
34560 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f  MA [database.]lo
34570 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 0a 2a 2a  ck_proxy_file.**
34580 0a 2a 2a 20 53 70 65 63 69 66 79 69 6e 67 20 22  .** Specifying "
34590 3a 61 75 74 6f 3a 22 20 6d 65 61 6e 73 20 74 68  :auto:" means th
345a0 61 74 20 69 66 20 74 68 65 72 65 20 69 73 20 61  at if there is a
345b0 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 74 68   conch file with
345c0 20 61 20 6d 61 74 63 68 69 6e 67 0a 2a 2a 20 68   a matching.** h
345d0 6f 73 74 20 49 44 20 69 6e 20 69 74 2c 20 74 68  ost ID in it, th
345e0 65 20 70 72 6f 78 79 20 70 61 74 68 20 69 6e 20  e proxy path in 
345f0 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 77  the conch file w
34600 69 6c 6c 20 62 65 20 75 73 65 64 2c 20 6f 74 68  ill be used, oth
34610 65 72 77 69 73 65 0a 2a 2a 20 61 20 70 72 6f 78  erwise.** a prox
34620 79 20 70 61 74 68 20 62 61 73 65 64 20 6f 6e 20  y path based on 
34630 74 68 65 20 75 73 65 72 27 73 20 74 65 6d 70 20  the user's temp 
34640 64 69 72 0a 2a 2a 20 28 76 69 61 20 63 6f 6e 66  dir.** (via conf
34650 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55  str(_CS_DARWIN_U
34660 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 2e 2e 2e  SER_TEMP_DIR,...
34670 29 29 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  )) will be used 
34680 61 6e 64 20 74 68 65 0a 2a 2a 20 61 63 74 75 61  and the.** actua
34690 6c 20 70 72 6f 78 79 20 66 69 6c 65 20 6e 61 6d  l proxy file nam
346a0 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 66  e is generated f
346b0 72 6f 6d 20 74 68 65 20 6e 61 6d 65 20 61 6e 64  rom the name and
346c0 20 70 61 74 68 20 6f 66 20 74 68 65 0a 2a 2a 20   path of the.** 
346d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
346e0 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
346f0 2a 2a 20 20 20 20 20 20 20 46 6f 72 20 64 61 74  **       For dat
34700 61 62 61 73 65 20 70 61 74 68 20 22 2f 55 73 65  abase path "/Use
34710 72 73 2f 6d 65 2f 66 6f 6f 2e 64 62 22 20 0a 2a  rs/me/foo.db" .*
34720 2a 20 20 20 20 20 20 20 54 68 65 20 6c 6f 63 6b  *       The lock
34730 20 70 61 74 68 20 77 69 6c 6c 20 62 65 20 22 3c   path will be "<
34740 74 6d 70 64 69 72 3e 2f 73 71 6c 69 74 65 70 6c  tmpdir>/sqlitepl
34750 6f 63 6b 73 2f 5f 55 73 65 72 73 5f 6d 65 5f 66  ocks/_Users_me_f
34760 6f 6f 2e 64 62 3a 61 75 74 6f 3a 22 29 0a 2a 2a  oo.db:auto:").**
34770 0a 2a 2a 20 4f 6e 63 65 20 61 20 6c 6f 63 6b 20  .** Once a lock 
34780 70 72 6f 78 79 20 69 73 20 63 6f 6e 66 69 67 75  proxy is configu
34790 72 65 64 20 66 6f 72 20 61 20 64 61 74 61 62 61  red for a databa
347a0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 69  se connection, i
347b0 74 20 63 61 6e 20 6e 6f 74 0a 2a 2a 20 62 65 20  t can not.** be 
347c0 72 65 6d 6f 76 65 64 2c 20 68 6f 77 65 76 65 72  removed, however
347d0 20 69 74 20 6d 61 79 20 62 65 20 73 77 69 74 63   it may be switc
347e0 68 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65  hed to a differe
347f0 6e 74 20 70 72 6f 78 79 20 70 61 74 68 20 76 69  nt proxy path vi
34800 61 0a 2a 2a 20 74 68 65 20 61 62 6f 76 65 20 41  a.** the above A
34810 50 49 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68  PIs (assuming th
34820 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69 73 20  e conch file is 
34830 6e 6f 74 20 62 65 69 6e 67 20 68 65 6c 64 20 62  not being held b
34840 79 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 63 6f 6e  y another.** con
34850 6e 65 63 74 69 6f 6e 20 6f 72 20 70 72 6f 63 65  nection or proce
34860 73 73 29 2e 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48  ss). .**.**.** H
34870 6f 77 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ow proxy locking
34880 20 77 6f 72 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d   works.** ------
34890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
348a0 2d 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 66 69  -.**.** Proxy fi
348b0 6c 65 20 6c 6f 63 6b 69 6e 67 20 72 65 6c 69 65  le locking relie
348c0 73 20 70 72 69 6d 61 72 69 6c 79 20 6f 6e 20 74  s primarily on t
348d0 77 6f 20 6e 65 77 20 73 75 70 70 6f 72 74 69 6e  wo new supportin
348e0 67 20 66 69 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a 20  g files: .**.** 
348f0 20 20 2a 20 20 63 6f 6e 63 68 20 66 69 6c 65 20    *  conch file 
34900 74 6f 20 6c 69 6d 69 74 20 61 63 63 65 73 73 20  to limit access 
34910 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
34920 66 69 6c 65 20 74 6f 20 61 20 73 69 6e 67 6c 65  file to a single
34930 20 68 6f 73 74 0a 2a 2a 20 20 20 20 20 20 61 74   host.**      at
34940 20 61 20 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 20 20   a time.**.**   
34950 2a 20 20 70 72 6f 78 79 20 66 69 6c 65 20 74 6f  *  proxy file to
34960 20 61 63 74 20 61 73 20 61 20 70 72 6f 78 79 20   act as a proxy 
34970 66 6f 72 20 74 68 65 20 61 64 76 69 73 6f 72 79  for the advisory
34980 20 6c 6f 63 6b 73 20 6e 6f 72 6d 61 6c 6c 79 0a   locks normally.
34990 2a 2a 20 20 20 20 20 20 74 61 6b 65 6e 20 6f 6e  **      taken on
349a0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
349b0 0a 2a 2a 20 54 68 65 20 63 6f 6e 63 68 20 66 69  .** The conch fi
349c0 6c 65 20 2d 20 74 6f 20 75 73 65 20 61 20 70 72  le - to use a pr
349d0 6f 78 79 20 66 69 6c 65 2c 20 73 71 6c 69 74 65  oxy file, sqlite
349e0 20 6d 75 73 74 20 66 69 72 73 74 20 22 68 6f 6c   must first "hol
349f0 64 20 74 68 65 20 63 6f 6e 63 68 22 0a 2a 2a 20  d the conch".** 
34a00 62 79 20 74 61 6b 69 6e 67 20 61 6e 20 73 71 6c  by taking an sql
34a10 69 74 65 2d 73 74 79 6c 65 20 73 68 61 72 65 64  ite-style shared
34a20 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e   lock on the con
34a30 63 68 20 66 69 6c 65 2c 20 72 65 61 64 69 6e 67  ch file, reading
34a40 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73   the.** contents
34a50 20 61 6e 64 20 63 6f 6d 70 61 72 69 6e 67 20 74   and comparing t
34a60 68 65 20 68 6f 73 74 27 73 20 75 6e 69 71 75 65  he host's unique
34a70 20 68 6f 73 74 20 49 44 20 28 73 65 65 20 62 65   host ID (see be
34a80 6c 6f 77 29 20 61 6e 64 20 6c 6f 63 6b 0a 2a 2a  low) and lock.**
34a90 20 70 72 6f 78 79 20 70 61 74 68 20 61 67 61 69   proxy path agai
34aa0 6e 73 74 20 74 68 65 20 76 61 6c 75 65 73 20 73  nst the values s
34ab0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63 6f 6e  tored in the con
34ac0 63 68 2e 20 20 54 68 65 20 63 6f 6e 63 68 20 66  ch.  The conch f
34ad0 69 6c 65 20 69 73 0a 2a 2a 20 73 74 6f 72 65 64  ile is.** stored
34ae0 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72   in the same dir
34af0 65 63 74 6f 72 79 20 61 73 20 74 68 65 20 64 61  ectory as the da
34b00 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
34b10 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 0a 2a 2a  the file name.**
34b20 20 69 73 20 70 61 74 74 65 72 6e 65 64 20 61 66   is patterned af
34b30 74 65 72 20 74 68 65 20 64 61 74 61 62 61 73 65  ter the database
34b40 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 22 2e   file name as ".
34b50 3c 64 61 74 61 62 61 73 65 6e 61 6d 65 3e 2d 63  <databasename>-c
34b60 6f 6e 63 68 22 2e 0a 2a 2a 20 49 66 20 74 68 65  onch"..** If the
34b70 20 63 6f 6e 63 68 20 66 69 6c 65 20 64 6f 65 73   conch file does
34b80 20 6e 6f 74 20 65 78 69 73 74 2c 20 6f 72 20 69   not exist, or i
34b90 74 73 20 63 6f 6e 74 65 6e 74 73 20 64 6f 20 6e  ts contents do n
34ba0 6f 74 20 6d 61 74 63 68 20 74 68 65 0a 2a 2a 20  ot match the.** 
34bb0 68 6f 73 74 20 49 44 20 61 6e 64 2f 6f 72 20 70  host ID and/or p
34bc0 72 6f 78 79 20 70 61 74 68 2c 20 74 68 65 6e 20  roxy path, then 
34bd0 74 68 65 20 6c 6f 63 6b 20 69 73 20 65 73 63 61  the lock is esca
34be0 6c 61 74 65 64 20 74 6f 20 61 6e 20 65 78 63 6c  lated to an excl
34bf0 75 73 69 76 65 0a 2a 2a 20 6c 6f 63 6b 20 61 6e  usive.** lock an
34c00 64 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  d the conch file
34c10 20 63 6f 6e 74 65 6e 74 73 20 69 73 20 75 70 64   contents is upd
34c20 61 74 65 64 20 77 69 74 68 20 74 68 65 20 68 6f  ated with the ho
34c30 73 74 20 49 44 20 61 6e 64 20 70 72 6f 78 79 0a  st ID and proxy.
34c40 2a 2a 20 70 61 74 68 20 61 6e 64 20 74 68 65 20  ** path and the 
34c50 6c 6f 63 6b 20 69 73 20 64 6f 77 6e 67 72 61 64  lock is downgrad
34c60 65 64 20 74 6f 20 61 20 73 68 61 72 65 64 20 6c  ed to a shared l
34c70 6f 63 6b 20 61 67 61 69 6e 2e 20 20 49 66 20 74  ock again.  If t
34c80 68 65 20 63 6f 6e 63 68 0a 2a 2a 20 69 73 20 68  he conch.** is h
34c90 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 20 70  eld by another p
34ca0 72 6f 63 65 73 73 20 28 77 69 74 68 20 61 20 73  rocess (with a s
34cb0 68 61 72 65 64 20 6c 6f 63 6b 29 2c 20 74 68 65  hared lock), the
34cc0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a   exclusive lock.
34cd0 2a 2a 20 77 69 6c 6c 20 66 61 69 6c 20 61 6e 64  ** will fail and
34ce0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
34cf0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
34d00 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20 2d  The proxy file -
34d10 20 61 20 73 69 6e 67 6c 65 2d 62 79 74 65 20 66   a single-byte f
34d20 69 6c 65 20 75 73 65 64 20 66 6f 72 20 61 6c 6c  ile used for all
34d30 20 61 64 76 69 73 6f 72 79 20 66 69 6c 65 20 6c   advisory file l
34d40 6f 63 6b 73 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79  ocks.** normally
34d50 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61   taken on the da
34d60 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 20 54  tabase file.   T
34d70 68 69 73 20 61 6c 6c 6f 77 73 20 66 6f 72 20 73  his allows for s
34d80 61 66 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 6f  afe sharing.** o
34d90 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
34da0 69 6c 65 20 66 6f 72 20 6d 75 6c 74 69 70 6c 65  ile for multiple
34db0 20 72 65 61 64 65 72 73 20 61 6e 64 20 77 72 69   readers and wri
34dc0 74 65 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  ters on the same
34dd0 0a 2a 2a 20 68 6f 73 74 20 28 74 68 65 20 63 6f  .** host (the co
34de0 6e 63 68 20 65 6e 73 75 72 65 73 20 74 68 61 74  nch ensures that
34df0 20 74 68 65 79 20 61 6c 6c 20 75 73 65 20 74 68   they all use th
34e00 65 20 73 61 6d 65 20 6c 6f 63 61 6c 20 6c 6f 63  e same local loc
34e10 6b 20 66 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 52  k file)..**.** R
34e20 65 71 75 65 73 74 69 6e 67 20 74 68 65 20 6c 6f  equesting the lo
34e30 63 6b 20 70 72 6f 78 79 20 64 6f 65 73 20 6e 6f  ck proxy does no
34e40 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 61  t immediately ta
34e50 6b 65 20 74 68 65 20 63 6f 6e 63 68 2c 20 69 74  ke the conch, it
34e60 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 74 61 6b 65   is.** only take
34e70 6e 20 77 68 65 6e 20 74 68 65 20 66 69 72 73 74  n when the first
34e80 20 72 65 71 75 65 73 74 20 74 6f 20 6c 6f 63 6b   request to lock
34e90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
34ea0 73 20 6d 61 64 65 2e 20 20 0a 2a 2a 20 54 68 69  s made.  .** Thi
34eb0 73 20 6d 61 74 63 68 65 73 20 74 68 65 20 73 65  s matches the se
34ec0 6d 61 6e 74 69 63 73 20 6f 66 20 74 68 65 20 74  mantics of the t
34ed0 72 61 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69  raditional locki
34ee0 6e 67 20 62 65 68 61 76 69 6f 72 2c 20 77 68 65  ng behavior, whe
34ef0 72 65 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 61 20  re.** opening a 
34f00 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61 20  connection to a 
34f10 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 64 6f  database file do
34f20 65 73 20 6e 6f 74 20 74 61 6b 65 20 61 20 6c 6f  es not take a lo
34f30 63 6b 20 6f 6e 20 69 74 2e 0a 2a 2a 20 54 68 65  ck on it..** The
34f40 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64   shared lock and
34f50 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 64 65   an open file de
34f60 73 63 72 69 70 74 6f 72 20 61 72 65 20 6d 61 69  scriptor are mai
34f70 6e 74 61 69 6e 65 64 20 75 6e 74 69 6c 20 0a 2a  ntained until .*
34f80 2a 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * the connection
34f90 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
34fa0 20 69 73 20 63 6c 6f 73 65 64 2e 20 0a 2a 2a 0a   is closed. .**.
34fb0 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 66 69 6c  ** The proxy fil
34fc0 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 66  e and the lock f
34fd0 69 6c 65 20 61 72 65 20 6e 65 76 65 72 20 64 65  ile are never de
34fe0 6c 65 74 65 64 20 73 6f 20 74 68 65 79 20 6f 6e  leted so they on
34ff0 6c 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ly need.** to be
35000 20 63 72 65 61 74 65 64 20 74 68 65 20 66 69 72   created the fir
35010 73 74 20 74 69 6d 65 20 74 68 65 79 20 61 72 65  st time they are
35020 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e   used..**.** Con
35030 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f  figuration optio
35040 6e 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ns.** ----------
35050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a  -----------.**.*
35060 2a 20 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52  *  SQLITE_PREFER
35070 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 2a  _PROXY_LOCKING.*
35080 2a 0a 2a 2a 20 20 20 20 20 20 20 44 61 74 61 62  *.**       Datab
35090 61 73 65 20 66 69 6c 65 73 20 61 63 63 65 73 73  ase files access
350a0 65 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c 20  ed on non-local 
350b0 66 69 6c 65 20 73 79 73 74 65 6d 73 20 61 72 65  file systems are
350c0 0a 2a 2a 20 20 20 20 20 20 20 61 75 74 6f 6d 61  .**       automa
350d0 74 69 63 61 6c 6c 79 20 63 6f 6e 66 69 67 75 72  tically configur
350e0 65 64 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63  ed for proxy loc
350f0 6b 69 6e 67 2c 20 6c 6f 63 6b 20 66 69 6c 65 73  king, lock files
35100 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20 6e 61   are.**       na
35110 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  med automaticall
35120 79 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  y using the same
35130 20 6c 6f 67 69 63 20 61 73 0a 2a 2a 20 20 20 20   logic as.**    
35140 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 70     PRAGMA lock_p
35150 72 6f 78 79 5f 66 69 6c 65 3d 22 3a 61 75 74 6f  roxy_file=":auto
35160 3a 22 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 53 51  :".**    .**  SQ
35170 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45 42 55 47  LITE_PROXY_DEBUG
35180 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 45 6e 61  .**.**       Ena
35190 62 6c 65 73 20 74 68 65 20 6c 6f 67 67 69 6e 67  bles the logging
351a0 20 6f 66 20 65 72 72 6f 72 20 6d 65 73 73 61 67   of error messag
351b0 65 73 20 64 75 72 69 6e 67 20 68 6f 73 74 20 69  es during host i
351c0 64 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20  d file.**       
351d0 72 65 74 72 69 65 76 61 6c 20 61 6e 64 20 63 72  retrieval and cr
351e0 65 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f  eation.**.**  LO
351f0 43 4b 50 52 4f 58 59 44 49 52 0a 2a 2a 0a 2a 2a  CKPROXYDIR.**.**
35200 20 20 20 20 20 20 20 4f 76 65 72 72 69 64 65 73         Overrides
35210 20 74 68 65 20 64 65 66 61 75 6c 74 20 64 69 72   the default dir
35220 65 63 74 6f 72 79 20 75 73 65 64 20 66 6f 72 20  ectory used for 
35230 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73  lock proxy files
35240 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 61   that.**       a
35250 72 65 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74  re named automat
35260 69 63 61 6c 6c 79 20 76 69 61 20 74 68 65 20 22  ically via the "
35270 3a 61 75 74 6f 3a 22 20 73 65 74 74 69 6e 67 0a  :auto:" setting.
35280 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 44 45  **.**  SQLITE_DE
35290 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50  FAULT_PROXYDIR_P
352a0 45 52 4d 49 53 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a  ERMISSIONS.**.**
352b0 20 20 20 20 20 20 20 50 65 72 6d 69 73 73 69 6f         Permissio
352c0 6e 73 20 74 6f 20 75 73 65 20 77 68 65 6e 20 63  ns to use when c
352d0 72 65 61 74 69 6e 67 20 61 20 64 69 72 65 63 74  reating a direct
352e0 6f 72 79 20 66 6f 72 20 73 74 6f 72 69 6e 67 20  ory for storing 
352f0 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6c 6f 63  the.**       loc
35300 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 2c 20 6f  k proxy files, o
35310 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20 4c 4f  nly used when LO
35320 43 4b 50 52 4f 58 59 44 49 52 20 69 73 20 6e 6f  CKPROXYDIR is no
35330 74 20 73 65 74 2e 0a 2a 2a 20 20 20 20 0a 2a 2a  t set..**    .**
35340 20 20 20 20 0a 2a 2a 20 41 73 20 6d 65 6e 74 69      .** As menti
35350 6f 6e 65 64 20 61 62 6f 76 65 2c 20 77 68 65 6e  oned above, when
35360 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53   compiled with S
35370 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f  QLITE_PREFER_PRO
35380 58 59 5f 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a 20 73  XY_LOCKING,.** s
35390 65 74 74 69 6e 67 20 74 68 65 20 65 6e 76 69 72  etting the envir
353a0 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20  onment variable 
353b0 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f  SQLITE_FORCE_PRO
353c0 58 59 5f 4c 4f 43 4b 49 4e 47 20 74 6f 20 31 20  XY_LOCKING to 1 
353d0 77 69 6c 6c 0a 2a 2a 20 66 6f 72 63 65 20 70 72  will.** force pr
353e0 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62  oxy locking to b
353f0 65 20 75 73 65 64 20 66 6f 72 20 65 76 65 72 79  e used for every
35400 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
35410 70 65 6e 65 64 2c 20 61 6e 64 20 30 0a 2a 2a 20  pened, and 0.** 
35420 77 69 6c 6c 20 66 6f 72 63 65 20 61 75 74 6f 6d  will force autom
35430 61 74 69 63 20 70 72 6f 78 79 20 6c 6f 63 6b 69  atic proxy locki
35440 6e 67 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65  ng to be disable
35450 64 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61  d for all databa
35460 73 65 0a 2a 2a 20 66 69 6c 65 73 20 28 65 78 70  se.** files (exp
35470 6c 69 63 69 74 6c 79 20 63 61 6c 6c 69 6e 67 20  licitly calling 
35480 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  the SQLITE_FCNTL
35490 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _SET_LOCKPROXYFI
354a0 4c 45 20 70 72 61 67 6d 61 20 6f 72 0a 2a 2a 20  LE pragma or.** 
354b0 73 71 6c 69 74 65 5f 66 69 6c 65 5f 63 6f 6e 74  sqlite_file_cont
354c0 72 6f 6c 20 41 50 49 20 69 73 20 6e 6f 74 20 61  rol API is not a
354d0 66 66 65 63 74 65 64 20 62 79 20 53 51 4c 49 54  ffected by SQLIT
354e0 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f  E_FORCE_PROXY_LO
354f0 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  CKING)..*/../*.*
35500 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  * Proxy locking 
35510 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  is only availabl
35520 65 20 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a 2f 0a  e on MacOSX .*/.
35530 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
35540 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
35550 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
35560 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  STYLE../*.** The
35570 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
35580 74 65 78 74 20 68 61 73 20 74 68 65 20 70 61 74  text has the pat
35590 68 20 61 6e 64 20 66 69 6c 65 20 73 74 72 75 63  h and file struc
355a0 74 75 72 65 73 20 66 6f 72 20 74 68 65 20 72 65  tures for the re
355b0 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64 20 6c 6f 63  mote .** and loc
355c0 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 73 20 69  al proxy files i
355d0 6e 20 69 74 0a 2a 2f 0a 74 79 70 65 64 65 66 20  n it.*/.typedef 
355e0 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b  struct proxyLock
355f0 69 6e 67 43 6f 6e 74 65 78 74 20 70 72 6f 78 79  ingContext proxy
35600 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  LockingContext;.
35610 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b  struct proxyLock
35620 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 75  ingContext {.  u
35630 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69  nixFile *conchFi
35640 6c 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  le;         /* O
35650 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a  pen conch file *
35660 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68 46  /.  char *conchF
35670 69 6c 65 50 61 74 68 3b 20 20 20 20 20 20 20 20  ilePath;        
35680 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
35690 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20  conch file */.  
356a0 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72  unixFile *lockPr
356b0 6f 78 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  oxy;         /* 
356c0 4f 70 65 6e 20 70 72 6f 78 79 20 6c 6f 63 6b 20  Open proxy lock 
356d0 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
356e0 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 20 20  lockProxyPath;  
356f0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
35700 66 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  f the proxy lock
35710 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
35720 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20 20 20  *dbPath;        
35730 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
35740 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65  of the open file
35750 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e 63 68 48   */.  int conchH
35760 65 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  eld;            
35770 20 20 20 2f 2a 20 31 20 69 66 20 74 68 65 20 63     /* 1 if the c
35780 6f 6e 63 68 20 69 73 20 68 65 6c 64 2c 20 2d 31  onch is held, -1
35790 20 69 66 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a   if lockless */.
357a0 20 20 69 6e 74 20 6e 46 61 69 6c 73 3b 20 20 20    int nFails;   
357b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
357c0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 63  * Number of conc
357d0 68 20 74 61 6b 69 6e 67 20 66 61 69 6c 75 72 65  h taking failure
357e0 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f 6c 64  s */.  void *old
357f0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20  LockingContext; 
35800 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
35810 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65 78 74 20 74  lockingcontext t
35820 6f 20 72 65 73 74 6f 72 65 20 6f 6e 20 63 6c 6f  o restore on clo
35830 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  se */.  sqlite3_
35840 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74  io_methods const
35850 20 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b 20 20 20   *pOldMethod;   
35860 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 49 2f    /* Original I/
35870 4f 20 6d 65 74 68 6f 64 73 20 66 6f 72 20 63 6c  O methods for cl
35880 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a  ose */.};../* .*
35890 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  * The proxy lock
358a0 20 66 69 6c 65 20 70 61 74 68 20 66 6f 72 20 74   file path for t
358b0 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20 64  he database at d
358c0 62 50 61 74 68 20 69 73 20 77 72 69 74 74 65 6e  bPath is written
358d0 20 69 6e 74 6f 20 6c 50 61 74 68 2c 20 0a 2a 2a   into lPath, .**
358e0 20 77 68 69 63 68 20 6d 75 73 74 20 70 6f 69 6e   which must poin
358f0 74 20 74 6f 20 76 61 6c 69 64 2c 20 77 72 69 74  t to valid, writ
35900 61 62 6c 65 20 6d 65 6d 6f 72 79 20 6c 61 72 67  able memory larg
35910 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 20 6d  e enough for a m
35920 61 78 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a 2a 20  axLen length.** 
35930 66 69 6c 65 20 70 61 74 68 2e 20 0a 2a 2f 0a 73  file path. .*/.s
35940 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47  tatic int proxyG
35950 65 74 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74  etLockPath(const
35960 20 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20 63   char *dbPath, c
35970 68 61 72 20 2a 6c 50 61 74 68 2c 20 73 69 7a 65  har *lPath, size
35980 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a 20 20 69 6e  _t maxLen){.  in
35990 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 64 62 4c  t len;.  int dbL
359a0 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69  en;.  int i;..#i
359b0 66 64 65 66 20 4c 4f 43 4b 50 52 4f 58 59 44 49  fdef LOCKPROXYDI
359c0 52 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70  R.  len = strlcp
359d0 79 28 6c 50 61 74 68 2c 20 4c 4f 43 4b 50 52 4f  y(lPath, LOCKPRO
359e0 58 59 44 49 52 2c 20 6d 61 78 4c 65 6e 29 3b 0a  XYDIR, maxLen);.
359f0 23 65 6c 73 65 0a 23 20 69 66 64 65 66 20 5f 43  #else.# ifdef _C
35a00 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45  S_DARWIN_USER_TE
35a10 4d 50 5f 44 49 52 0a 20 20 7b 0a 20 20 20 20 69  MP_DIR.  {.    i
35a20 66 28 20 21 63 6f 6e 66 73 74 72 28 5f 43 53 5f  f( !confstr(_CS_
35a30 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50  DARWIN_USER_TEMP
35a40 5f 44 49 52 2c 20 6c 50 61 74 68 2c 20 6d 61 78  _DIR, lPath, max
35a50 4c 65 6e 29 20 29 7b 0a 20 20 20 20 20 20 4f 53  Len) ){.      OS
35a60 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43 4b 50  TRACE(("GETLOCKP
35a70 41 54 48 20 20 66 61 69 6c 65 64 20 25 73 20 65  ATH  failed %s e
35a80 72 72 6e 6f 3d 25 64 20 70 69 64 3d 25 64 5c 6e  rrno=%d pid=%d\n
35a90 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
35aa0 20 20 6c 50 61 74 68 2c 20 65 72 72 6e 6f 2c 20    lPath, errno, 
35ab0 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20  osGetpid(0)));. 
35ac0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
35ad0 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20  TE_IOERR_LOCK;. 
35ae0 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 73     }.    len = s
35af0 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 73  trlcat(lPath, "s
35b00 71 6c 69 74 65 70 6c 6f 63 6b 73 22 2c 20 6d 61  qliteplocks", ma
35b10 78 4c 65 6e 29 3b 20 20 20 20 0a 20 20 7d 0a 23  xLen);    .  }.#
35b20 20 65 6c 73 65 0a 20 20 6c 65 6e 20 3d 20 73 74   else.  len = st
35b30 72 6c 63 70 79 28 6c 50 61 74 68 2c 20 22 2f 74  rlcpy(lPath, "/t
35b40 6d 70 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23  mp/", maxLen);.#
35b50 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20   endif.#endif.. 
35b60 20 69 66 28 20 6c 50 61 74 68 5b 6c 65 6e 2d 31   if( lPath[len-1
35b70 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20 6c 65  ]!='/' ){.    le
35b80 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74  n = strlcat(lPat
35b90 68 2c 20 22 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b  h, "/", maxLen);
35ba0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 74 72 61  .  }.  .  /* tra
35bb0 6e 73 66 6f 72 6d 20 74 68 65 20 64 62 20 70 61  nsform the db pa
35bc0 74 68 20 74 6f 20 61 20 75 6e 69 71 75 65 20 63  th to a unique c
35bd0 61 63 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 64  ache name */.  d
35be0 62 4c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c  bLen = (int)strl
35bf0 65 6e 28 64 62 50 61 74 68 29 3b 0a 20 20 66 6f  en(dbPath);.  fo
35c00 72 28 20 69 3d 30 3b 20 69 3c 64 62 4c 65 6e 20  r( i=0; i<dbLen 
35c10 26 26 20 28 69 2b 6c 65 6e 2b 37 29 3c 28 69 6e  && (i+len+7)<(in
35c20 74 29 6d 61 78 4c 65 6e 3b 20 69 2b 2b 29 7b 0a  t)maxLen; i++){.
35c30 20 20 20 20 63 68 61 72 20 63 20 3d 20 64 62 50      char c = dbP
35c40 61 74 68 5b 69 5d 3b 0a 20 20 20 20 6c 50 61 74  ath[i];.    lPat
35c50 68 5b 69 2b 6c 65 6e 5d 20 3d 20 28 63 3d 3d 27  h[i+len] = (c=='
35c60 2f 27 29 3f 27 5f 27 3a 63 3b 0a 20 20 7d 0a 20  /')?'_':c;.  }. 
35c70 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 3d 27 5c   lPath[i+len]='\
35c80 30 27 3b 0a 20 20 73 74 72 6c 63 61 74 28 6c 50  0';.  strlcat(lP
35c90 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 2c 20 6d  ath, ":auto:", m
35ca0 61 78 4c 65 6e 29 3b 0a 20 20 4f 53 54 52 41 43  axLen);.  OSTRAC
35cb0 45 28 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20  E(("GETLOCKPATH 
35cc0 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68   proxy lock path
35cd0 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c  =%s pid=%d\n", l
35ce0 50 61 74 68 2c 20 6f 73 47 65 74 70 69 64 28 30  Path, osGetpid(0
35cf0 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  )));.  return SQ
35d00 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a  LITE_OK;.}../* .
35d10 20 2a 2a 20 43 72 65 61 74 65 73 20 74 68 65 20   ** Creates the 
35d20 6c 6f 63 6b 20 66 69 6c 65 20 61 6e 64 20 61 6e  lock file and an
35d30 79 20 6d 69 73 73 69 6e 67 20 64 69 72 65 63 74  y missing direct
35d40 6f 72 69 65 73 20 69 6e 20 6c 6f 63 6b 50 61 74  ories in lockPat
35d50 68 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  h. */.static int
35d60 20 70 72 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b   proxyCreateLock
35d70 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20  Path(const char 
35d80 2a 6c 6f 63 6b 50 61 74 68 29 7b 0a 20 20 69 6e  *lockPath){.  in
35d90 74 20 69 2c 20 6c 65 6e 3b 0a 20 20 63 68 61 72  t i, len;.  char
35da0 20 62 75 66 5b 4d 41 58 50 41 54 48 4c 45 4e 5d   buf[MAXPATHLEN]
35db0 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 20 3d 20  ;.  int start = 
35dc0 30 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 6c  0;.  .  assert(l
35dd0 6f 63 6b 50 61 74 68 21 3d 4e 55 4c 4c 29 3b 0a  ockPath!=NULL);.
35de0 20 20 2f 2a 20 74 72 79 20 74 6f 20 63 72 65 61    /* try to crea
35df0 74 65 20 61 6c 6c 20 74 68 65 20 69 6e 74 65 72  te all the inter
35e00 6d 65 64 69 61 74 65 20 64 69 72 65 63 74 6f 72  mediate director
35e10 69 65 73 20 2a 2f 0a 20 20 6c 65 6e 20 3d 20 28  ies */.  len = (
35e20 69 6e 74 29 73 74 72 6c 65 6e 28 6c 6f 63 6b 50  int)strlen(lockP
35e30 61 74 68 29 3b 0a 20 20 62 75 66 5b 30 5d 20 3d  ath);.  buf[0] =
35e40 20 6c 6f 63 6b 50 61 74 68 5b 30 5d 3b 0a 20 20   lockPath[0];.  
35e50 66 6f 72 28 20 69 3d 31 3b 20 69 3c 6c 65 6e 3b  for( i=1; i<len;
35e60 20 69 2b 2b 20 29 7b 0a 20 20 20 20 69 66 28 20   i++ ){.    if( 
35e70 6c 6f 63 6b 50 61 74 68 5b 69 5d 20 3d 3d 20 27  lockPath[i] == '
35e80 2f 27 20 26 26 20 28 69 20 2d 20 73 74 61 72 74  /' && (i - start
35e90 20 3e 20 30 29 20 29 7b 0a 20 20 20 20 20 20 2f   > 0) ){.      /
35ea0 2a 20 6f 6e 6c 79 20 6d 6b 64 69 72 20 69 66 20  * only mkdir if 
35eb0 6c 65 61 66 20 64 69 72 20 21 3d 20 22 2e 22 20  leaf dir != "." 
35ec0 6f 72 20 22 2f 22 20 6f 72 20 22 2e 2e 22 20 2a  or "/" or ".." *
35ed0 2f 0a 20 20 20 20 20 20 69 66 28 20 69 2d 73 74  /.      if( i-st
35ee0 61 72 74 3e 32 20 7c 7c 20 28 69 2d 73 74 61 72  art>2 || (i-star
35ef0 74 3d 3d 31 20 26 26 20 62 75 66 5b 73 74 61 72  t==1 && buf[star
35f00 74 5d 20 21 3d 20 27 2e 27 20 26 26 20 62 75 66  t] != '.' && buf
35f10 5b 73 74 61 72 74 5d 20 21 3d 20 27 2f 27 29 20  [start] != '/') 
35f20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 2d  .         || (i-
35f30 73 74 61 72 74 3d 3d 32 20 26 26 20 62 75 66 5b  start==2 && buf[
35f40 73 74 61 72 74 5d 20 21 3d 20 27 2e 27 20 26 26  start] != '.' &&
35f50 20 62 75 66 5b 73 74 61 72 74 2b 31 5d 20 21 3d   buf[start+1] !=
35f60 20 27 2e 27 29 20 29 7b 0a 20 20 20 20 20 20 20   '.') ){.       
35f70 20 62 75 66 5b 69 5d 3d 27 5c 30 27 3b 0a 20 20   buf[i]='\0';.  
35f80 20 20 20 20 20 20 69 66 28 20 6f 73 4d 6b 64 69        if( osMkdi
35f90 72 28 62 75 66 2c 20 53 51 4c 49 54 45 5f 44 45  r(buf, SQLITE_DE
35fa0 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50  FAULT_PROXYDIR_P
35fb0 45 52 4d 49 53 53 49 4f 4e 53 29 20 29 7b 0a 20  ERMISSIONS) ){. 
35fc0 20 20 20 20 20 20 20 20 20 69 6e 74 20 65 72 72           int err
35fd0 3d 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20  =errno;.        
35fe0 20 20 69 66 28 20 65 72 72 21 3d 45 45 58 49 53    if( err!=EEXIS
35ff0 54 20 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  T ) {.          
36000 20 20 4f 53 54 52 41 43 45 28 28 22 43 52 45 41    OSTRACE(("CREA
36010 54 45 4c 4f 43 4b 50 41 54 48 20 20 46 41 49 4c  TELOCKPATH  FAIL
36020 45 44 20 63 72 65 61 74 69 6e 67 20 25 73 2c 20  ED creating %s, 
36030 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
36040 20 20 20 20 20 20 20 22 27 25 73 27 20 70 72 6f         "'%s' pro
36050 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20  xy lock path=%s 
36060 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  pid=%d\n",.     
36070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36080 62 75 66 2c 20 73 74 72 65 72 72 6f 72 28 65 72  buf, strerror(er
36090 72 29 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 6f 73  r), lockPath, os
360a0 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20 20 20  Getpid(0)));.   
360b0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
360c0 65 72 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  err;.          }
360d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
360e0 20 7d 0a 20 20 20 20 20 20 73 74 61 72 74 3d 69   }.      start=i
360f0 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 75  +1;.    }.    bu
36100 66 5b 69 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b  f[i] = lockPath[
36110 69 5d 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43  i];.  }.  OSTRAC
36120 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b 50 41  E(("CREATELOCKPA
36130 54 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70  TH  proxy lock p
36140 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22  ath=%s pid=%d\n"
36150 2c 6c 6f 63 6b 50 61 74 68 2c 6f 73 47 65 74 70  ,lockPath,osGetp
36160 69 64 28 30 29 29 29 3b 0a 20 20 72 65 74 75 72  id(0)));.  retur
36170 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  n 0;.}../*.** Cr
36180 65 61 74 65 20 61 20 6e 65 77 20 56 46 53 20 66  eate a new VFS f
36190 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 28  ile descriptor (
361a0 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79  stored in memory
361b0 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
361c0 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  * sqlite3_malloc
361d0 29 20 61 6e 64 20 6f 70 65 6e 20 74 68 65 20 66  ) and open the f
361e0 69 6c 65 20 6e 61 6d 65 64 20 22 70 61 74 68 22  ile named "path"
361f0 20 69 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73   in the file des
36200 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  criptor..**.** T
36210 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73  he caller is res
36220 70 6f 6e 73 69 62 6c 65 20 6e 6f 74 20 6f 6e 6c  ponsible not onl
36230 79 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20 74 68  y for closing th
36240 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
36250 72 0a 2a 2a 20 62 75 74 20 61 6c 73 6f 20 66 6f  r.** but also fo
36260 72 20 66 72 65 65 69 6e 67 20 74 68 65 20 6d 65  r freeing the me
36270 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
36280 77 69 74 68 20 74 68 65 20 66 69 6c 65 20 64 65  with the file de
36290 73 63 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73 74 61  scriptor..*/.sta
362a0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65  tic int proxyCre
362b0 61 74 65 55 6e 69 78 46 69 6c 65 28 0a 20 20 20  ateUnixFile(.   
362c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74   const char *pat
362d0 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 70 61 74  h,        /* pat
362e0 68 20 66 6f 72 20 74 68 65 20 6e 65 77 20 75 6e  h for the new un
362f0 69 78 46 69 6c 65 20 2a 2f 0a 20 20 20 20 75 6e  ixFile */.    un
36300 69 78 46 69 6c 65 20 2a 2a 70 70 46 69 6c 65 2c  ixFile **ppFile,
36310 20 20 20 20 20 20 20 2f 2a 20 75 6e 69 78 46 69         /* unixFi
36320 6c 65 20 63 72 65 61 74 65 64 20 61 6e 64 20 72  le created and r
36330 65 74 75 72 6e 65 64 20 62 79 20 72 65 66 20 2a  eturned by ref *
36340 2f 0a 20 20 20 20 69 6e 74 20 69 73 6c 6f 63 6b  /.    int islock
36350 66 69 6c 65 20 20 20 20 20 20 20 20 20 20 20 2f  file           /
36360 2a 20 69 66 20 6e 6f 6e 20 7a 65 72 6f 20 6d 69  * if non zero mi
36370 73 73 69 6e 67 20 64 69 72 73 20 77 69 6c 6c 20  ssing dirs will 
36380 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 29 20  be created */.) 
36390 7b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b  {.  int fd = -1;
363a0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65  .  unixFile *pNe
363b0 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  w;.  int rc = SQ
363c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6f  LITE_OK;.  int o
363d0 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57  penFlags = O_RDW
363e0 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20 20 73  R | O_CREAT;.  s
363f0 71 6c 69 74 65 33 5f 76 66 73 20 64 75 6d 6d 79  qlite3_vfs dummy
36400 56 66 73 3b 0a 20 20 69 6e 74 20 74 65 72 72 6e  Vfs;.  int terrn
36410 6f 20 3d 20 30 3b 0a 20 20 55 6e 69 78 55 6e 75  o = 0;.  UnixUnu
36420 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d  sedFd *pUnused =
36430 20 4e 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 31 2e 20   NULL;..  /* 1. 
36440 66 69 72 73 74 20 74 72 79 20 74 6f 20 6f 70 65  first try to ope
36450 6e 2f 63 72 65 61 74 65 20 74 68 65 20 66 69 6c  n/create the fil
36460 65 0a 20 20 2a 2a 20 32 2e 20 69 66 20 74 68 61  e.  ** 2. if tha
36470 74 20 66 61 69 6c 73 2c 20 61 6e 64 20 74 68 69  t fails, and thi
36480 73 20 69 73 20 61 20 6c 6f 63 6b 20 66 69 6c 65  s is a lock file
36490 20 28 6e 6f 74 2d 63 6f 6e 63 68 29 2c 20 74 72   (not-conch), tr
364a0 79 20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20  y creating.  ** 
364b0 74 68 65 20 70 61 72 65 6e 74 20 64 69 72 65 63  the parent direc
364c0 74 6f 72 69 65 73 20 61 6e 64 20 74 68 65 6e 20  tories and then 
364d0 74 72 79 20 61 67 61 69 6e 2e 0a 20 20 2a 2a 20  try again..  ** 
364e0 33 2e 20 69 66 20 74 68 61 74 20 66 61 69 6c 73  3. if that fails
364f0 2c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 74 68  , try to open th
36500 65 20 66 69 6c 65 20 72 65 61 64 2d 6f 6e 6c 79  e file read-only
36510 0a 20 20 2a 2a 20 6f 74 68 65 72 77 69 73 65 20  .  ** otherwise 
36520 72 65 74 75 72 6e 20 42 55 53 59 20 28 69 66 20  return BUSY (if 
36530 6c 6f 63 6b 20 66 69 6c 65 29 20 6f 72 20 43 41  lock file) or CA
36540 4e 54 4f 50 45 4e 20 66 6f 72 20 74 68 65 20 63  NTOPEN for the c
36550 6f 6e 63 68 20 66 69 6c 65 0a 20 20 2a 2f 0a 20  onch file.  */. 
36560 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e 64 52   pUnused = findR
36570 65 75 73 61 62 6c 65 46 64 28 70 61 74 68 2c 20  eusableFd(path, 
36580 6f 70 65 6e 46 6c 61 67 73 29 3b 0a 20 20 69 66  openFlags);.  if
36590 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20  ( pUnused ){.   
365a0 20 66 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66   fd = pUnused->f
365b0 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
365c0 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69 74 65  pUnused = sqlite
365d0 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 69 7a 65 6f  3_malloc64(sizeo
365e0 66 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20  f(*pUnused));.  
365f0 20 20 69 66 28 20 21 70 55 6e 75 73 65 64 20 29    if( !pUnused )
36600 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
36610 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
36620 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c   }.  }.  if( fd<
36630 30 20 29 7b 0a 20 20 20 20 66 64 20 3d 20 72 6f  0 ){.    fd = ro
36640 62 75 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20  bust_open(path, 
36650 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20  openFlags, 0);. 
36660 20 20 20 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e     terrno = errn
36670 6f 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20  o;.    if( fd<0 
36680 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54  && errno==ENOENT
36690 20 26 26 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29   && islockfile )
366a0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 72 6f 78  {.      if( prox
366b0 79 43 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28  yCreateLockPath(
366c0 70 61 74 68 29 20 3d 3d 20 53 51 4c 49 54 45 5f  path) == SQLITE_
366d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 66 64  OK ){.        fd
366e0 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70   = robust_open(p
366f0 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20  ath, openFlags, 
36700 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
36710 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30  }.  }.  if( fd<0
36720 20 29 7b 0a 20 20 20 20 6f 70 65 6e 46 6c 61 67   ){.    openFlag
36730 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20  s = O_RDONLY;.  
36740 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
36750 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61  en(path, openFla
36760 67 73 2c 20 30 29 3b 0a 20 20 20 20 74 65 72 72  gs, 0);.    terr
36770 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a  no = errno;.  }.
36780 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
36790 20 20 69 66 28 20 69 73 6c 6f 63 6b 66 69 6c 65    if( islockfile
367a0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
367b0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
367c0 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 20 28    }.    switch (
367d0 74 65 72 72 6e 6f 29 20 7b 0a 20 20 20 20 20 20  terrno) {.      
367e0 63 61 73 65 20 45 41 43 43 45 53 3a 0a 20 20 20  case EACCES:.   
367f0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
36800 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20 63  TE_PERM;.      c
36810 61 73 65 20 45 49 4f 3a 20 0a 20 20 20 20 20 20  ase EIO: .      
36820 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
36830 49 4f 45 52 52 5f 4c 4f 43 4b 3b 20 2f 2a 20 65  IOERR_LOCK; /* e
36840 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73  ven though it is
36850 20 74 68 65 20 63 6f 6e 63 68 20 2a 2f 0a 20 20   the conch */.  
36860 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
36870 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
36880 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
36890 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
368a0 20 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c   pNew = (unixFil
368b0 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e *)sqlite3_mall
368c0 6f 63 36 34 28 73 69 7a 65 6f 66 28 2a 70 4e 65  oc64(sizeof(*pNe
368d0 77 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  w));.  if( pNew=
368e0 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20  =NULL ){.    rc 
368f0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
36900 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 63 72 65      goto end_cre
36910 61 74 65 5f 70 72 6f 78 79 3b 0a 20 20 7d 0a 20  ate_proxy;.  }. 
36920 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c   memset(pNew, 0,
36930 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65   sizeof(unixFile
36940 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 65 6e  ));.  pNew->open
36950 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67  Flags = openFlag
36960 73 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 75 6d  s;.  memset(&dum
36970 6d 79 56 66 73 2c 20 30 2c 20 73 69 7a 65 6f 66  myVfs, 0, sizeof
36980 28 64 75 6d 6d 79 56 66 73 29 29 3b 0a 20 20 64  (dummyVfs));.  d
36990 75 6d 6d 79 56 66 73 2e 70 41 70 70 44 61 74 61  ummyVfs.pAppData
369a0 20 3d 20 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c   = (void*)&autol
369b0 6f 63 6b 49 6f 46 69 6e 64 65 72 3b 0a 20 20 64  ockIoFinder;.  d
369c0 75 6d 6d 79 56 66 73 2e 7a 4e 61 6d 65 20 3d 20  ummyVfs.zName = 
369d0 22 64 75 6d 6d 79 22 3b 0a 20 20 70 55 6e 75 73  "dummy";.  pUnus
369e0 65 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 70  ed->fd = fd;.  p
369f0 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20  Unused->flags = 
36a00 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 70 4e 65  openFlags;.  pNe
36a10 77 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 55 6e  w->pUnused = pUn
36a20 75 73 65 64 3b 0a 20 20 0a 20 20 72 63 20 3d 20  used;.  .  rc = 
36a30 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 26  fillInUnixFile(&
36a40 64 75 6d 6d 79 56 66 73 2c 20 66 64 2c 20 28 73  dummyVfs, fd, (s
36a50 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 4e 65  qlite3_file*)pNe
36a60 77 2c 20 70 61 74 68 2c 20 30 29 3b 0a 20 20 69  w, path, 0);.  i
36a70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
36a80 20 29 7b 0a 20 20 20 20 2a 70 70 46 69 6c 65 20   ){.    *ppFile 
36a90 3d 20 70 4e 65 77 3b 0a 20 20 20 20 72 65 74 75  = pNew;.    retu
36aa0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
36ab0 7d 0a 65 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f  }.end_create_pro
36ac0 78 79 3a 20 20 20 20 0a 20 20 72 6f 62 75 73 74  xy:    .  robust
36ad0 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 66 64 2c  _close(pNew, fd,
36ae0 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 73 71   __LINE__);.  sq
36af0 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29  lite3_free(pNew)
36b00 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
36b10 28 70 55 6e 75 73 65 64 29 3b 0a 20 20 72 65 74  (pUnused);.  ret
36b20 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65  urn rc;.}..#ifde
36b30 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
36b40 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70   simulate multip
36b50 6c 65 20 68 6f 73 74 73 20 62 79 20 63 72 65 61  le hosts by crea
36b60 74 69 6e 67 20 75 6e 69 71 75 65 20 68 6f 73 74  ting unique host
36b70 69 64 20 66 69 6c 65 20 70 61 74 68 73 20 2a 2f  id file paths */
36b80 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 68 6f 73  .int sqlite3_hos
36b90 74 69 64 5f 6e 75 6d 20 3d 20 30 3b 0a 23 65 6e  tid_num = 0;.#en
36ba0 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 50 52 4f  dif..#define PRO
36bb0 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 20 20 20  XY_HOSTIDLEN    
36bc0 31 36 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69 6c  16  /* conch fil
36bd0 65 20 68 6f 73 74 20 69 64 20 6c 65 6e 67 74 68  e host id length
36be0 20 2a 2f 0a 0a 23 69 66 64 65 66 20 48 41 56 45   */..#ifdef HAVE
36bf0 5f 47 45 54 48 4f 53 54 55 55 49 44 0a 2f 2a 20  _GETHOSTUUID./* 
36c00 4e 6f 74 20 61 6c 77 61 79 73 20 64 65 66 69 6e  Not always defin
36c10 65 64 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ed in the header
36c20 73 20 61 73 20 69 74 20 6f 75 67 68 74 20 74 6f  s as it ought to
36c30 20 62 65 20 2a 2f 0a 65 78 74 65 72 6e 20 69 6e   be */.extern in
36c40 74 20 67 65 74 68 6f 73 74 75 75 69 64 28 75 75  t gethostuuid(uu
36c50 69 64 5f 74 20 69 64 2c 20 63 6f 6e 73 74 20 73  id_t id, const s
36c60 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 2a  truct timespec *
36c70 77 61 69 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f  wait);.#endif../
36c80 2a 20 67 65 74 20 74 68 65 20 68 6f 73 74 20 49  * get the host I
36c90 44 20 76 69 61 20 67 65 74 68 6f 73 74 75 75 69  D via gethostuui
36ca0 64 28 29 2c 20 70 48 6f 73 74 49 44 20 6d 75 73  d(), pHostID mus
36cb0 74 20 70 6f 69 6e 74 20 74 6f 20 50 52 4f 58 59  t point to PROXY
36cc0 5f 48 4f 53 54 49 44 4c 45 4e 20 0a 2a 2a 20 62  _HOSTIDLEN .** b
36cd0 79 74 65 73 20 6f 66 20 77 72 69 74 61 62 6c 65  ytes of writable
36ce0 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
36cf0 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74 48  ic int proxyGetH
36d00 6f 73 74 49 44 28 75 6e 73 69 67 6e 65 64 20 63  ostID(unsigned c
36d10 68 61 72 20 2a 70 48 6f 73 74 49 44 2c 20 69 6e  har *pHostID, in
36d20 74 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 61 73  t *pError){.  as
36d30 73 65 72 74 28 50 52 4f 58 59 5f 48 4f 53 54 49  sert(PROXY_HOSTI
36d40 44 4c 45 4e 20 3d 3d 20 73 69 7a 65 6f 66 28 75  DLEN == sizeof(u
36d50 75 69 64 5f 74 29 29 3b 0a 20 20 6d 65 6d 73 65  uid_t));.  memse
36d60 74 28 70 48 6f 73 74 49 44 2c 20 30 2c 20 50 52  t(pHostID, 0, PR
36d70 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a  OXY_HOSTIDLEN);.
36d80 23 69 66 64 65 66 20 48 41 56 45 5f 47 45 54 48  #ifdef HAVE_GETH
36d90 4f 53 54 55 55 49 44 0a 20 20 7b 0a 20 20 20 20  OSTUUID.  {.    
36da0 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20  struct timespec 
36db0 74 69 6d 65 6f 75 74 20 3d 20 7b 31 2c 20 30 7d  timeout = {1, 0}
36dc0 3b 20 2f 2a 20 31 20 73 65 63 20 74 69 6d 65 6f  ; /* 1 sec timeo
36dd0 75 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65  ut */.    if( ge
36de0 74 68 6f 73 74 75 75 69 64 28 70 48 6f 73 74 49  thostuuid(pHostI
36df0 44 2c 20 26 74 69 6d 65 6f 75 74 29 20 29 7b 0a  D, &timeout) ){.
36e00 20 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20        int err = 
36e10 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28  errno;.      if(
36e20 20 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20   pError ){.     
36e30 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 72 72     *pError = err
36e40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
36e50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
36e60 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ERR;.    }.  }.#
36e70 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41  else.  UNUSED_PA
36e80 52 41 4d 45 54 45 52 28 70 45 72 72 6f 72 29 3b  RAMETER(pError);
36e90 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
36ea0 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20  QLITE_TEST.  /* 
36eb0 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c  simulate multipl
36ec0 65 20 68 6f 73 74 73 20 62 79 20 63 72 65 61 74  e hosts by creat
36ed0 69 6e 67 20 75 6e 69 71 75 65 20 68 6f 73 74 69  ing unique hosti
36ee0 64 20 66 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a  d file paths */.
36ef0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 68 6f    if( sqlite3_ho
36f00 73 74 69 64 5f 6e 75 6d 20 21 3d 20 30 29 7b 0a  stid_num != 0){.
36f10 20 20 20 20 70 48 6f 73 74 49 44 5b 30 5d 20 3d      pHostID[0] =
36f20 20 28 63 68 61 72 29 28 70 48 6f 73 74 49 44 5b   (char)(pHostID[
36f30 30 5d 20 2b 20 28 63 68 61 72 29 28 73 71 6c 69  0] + (char)(sqli
36f40 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 26  te3_hostid_num &
36f50 20 30 78 46 46 29 29 3b 0a 20 20 7d 0a 23 65 6e   0xFF));.  }.#en
36f60 64 69 66 0a 20 20 0a 20 20 72 65 74 75 72 6e 20  dif.  .  return 
36f70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
36f80 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   The conch file 
36f90 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 68 65 61  contains the hea
36fa0 64 65 72 2c 20 68 6f 73 74 20 69 64 20 61 6e 64  der, host id and
36fb0 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 0a   lock file path.
36fc0 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f 58   */.#define PROX
36fd0 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 20 32  Y_CONCHVERSION 2
36fe0 20 20 20 2f 2a 20 31 2d 62 79 74 65 20 68 65 61     /* 1-byte hea
36ff0 64 65 72 2c 20 31 36 2d 62 79 74 65 20 68 6f 73  der, 16-byte hos
37000 74 20 69 64 2c 20 70 61 74 68 20 2a 2f 0a 23 64  t id, path */.#d
37010 65 66 69 6e 65 20 50 52 4f 58 59 5f 48 45 41 44  efine PROXY_HEAD
37020 45 52 4c 45 4e 20 20 20 20 31 20 20 20 2f 2a 20  ERLEN    1   /* 
37030 63 6f 6e 63 68 20 66 69 6c 65 20 68 65 61 64 65  conch file heade
37040 72 20 6c 65 6e 67 74 68 20 2a 2f 0a 23 64 65 66  r length */.#def
37050 69 6e 65 20 50 52 4f 58 59 5f 50 41 54 48 49 4e  ine PROXY_PATHIN
37060 44 45 58 20 20 20 20 28 50 52 4f 58 59 5f 48 45  DEX    (PROXY_HE
37070 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f  ADERLEN+PROXY_HO
37080 53 54 49 44 4c 45 4e 29 0a 23 64 65 66 69 6e 65  STIDLEN).#define
37090 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c   PROXY_MAXCONCHL
370a0 45 4e 20 20 28 50 52 4f 58 59 5f 48 45 41 44 45  EN  (PROXY_HEADE
370b0 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49  RLEN+PROXY_HOSTI
370c0 44 4c 45 4e 2b 4d 41 58 50 41 54 48 4c 45 4e 29  DLEN+MAXPATHLEN)
370d0 0a 0a 2f 2a 20 0a 2a 2a 20 54 61 6b 65 73 20 61  ../* .** Takes a
370e0 6e 20 6f 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c  n open conch fil
370f0 65 2c 20 63 6f 70 69 65 73 20 74 68 65 20 63 6f  e, copies the co
37100 6e 74 65 6e 74 73 20 74 6f 20 61 20 6e 65 77 20  ntents to a new 
37110 70 61 74 68 20 61 6e 64 20 74 68 65 6e 20 6d 6f  path and then mo
37120 76 65 73 20 0a 2a 2a 20 69 74 20 62 61 63 6b 2e  ves .** it back.
37130 20 20 54 68 65 20 6e 65 77 6c 79 20 63 72 65 61    The newly crea
37140 74 65 64 20 66 69 6c 65 27 73 20 66 69 6c 65 20  ted file's file 
37150 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 73  descriptor is as
37160 73 69 67 6e 65 64 20 74 6f 20 74 68 65 0a 2a 2a  signed to the.**
37170 20 63 6f 6e 63 68 20 66 69 6c 65 20 73 74 72 75   conch file stru
37180 63 74 75 72 65 20 61 6e 64 20 66 69 6e 61 6c 6c  cture and finall
37190 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 63  y the original c
371a0 6f 6e 63 68 20 66 69 6c 65 20 64 65 73 63 72 69  onch file descri
371b0 70 74 6f 72 20 69 73 20 0a 2a 2a 20 63 6c 6f 73  ptor is .** clos
371c0 65 64 2e 20 20 52 65 74 75 72 6e 73 20 7a 65 72  ed.  Returns zer
371d0 6f 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e  o if successful.
371e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
371f0 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f  roxyBreakConchLo
37200 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ck(unixFile *pFi
37210 6c 65 2c 20 75 75 69 64 5f 74 20 6d 79 48 6f 73  le, uuid_t myHos
37220 74 49 44 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63  tID){.  proxyLoc
37230 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
37240 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e  x = (proxyLockin
37250 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65  gContext *)pFile
37260 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
37270 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63  ; .  unixFile *c
37280 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d  onchFile = pCtx-
37290 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 63 68  >conchFile;.  ch
372a0 61 72 20 74 50 61 74 68 5b 4d 41 58 50 41 54 48  ar tPath[MAXPATH
372b0 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20 62 75 66  LEN];.  char buf
372c0 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c  [PROXY_MAXCONCHL
372d0 45 4e 5d 3b 0a 20 20 63 68 61 72 20 2a 63 50 61  EN];.  char *cPa
372e0 74 68 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68  th = pCtx->conch
372f0 46 69 6c 65 50 61 74 68 3b 0a 20 20 73 69 7a 65  FilePath;.  size
37300 5f 74 20 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a  _t readLen = 0;.
37310 20 20 73 69 7a 65 5f 74 20 70 61 74 68 4c 65 6e    size_t pathLen
37320 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 65 72 72   = 0;.  char err
37330 6d 73 67 5b 36 34 5d 20 3d 20 22 22 3b 0a 20 20  msg[64] = "";.  
37340 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 69  int fd = -1;.  i
37350 6e 74 20 72 63 20 3d 20 2d 31 3b 0a 20 20 55 4e  nt rc = -1;.  UN
37360 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6d  USED_PARAMETER(m
37370 79 48 6f 73 74 49 44 29 3b 0a 0a 20 20 2f 2a 20  yHostID);..  /* 
37380 63 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 74  create a new pat
37390 68 20 62 79 20 72 65 70 6c 61 63 65 20 74 68 65  h by replace the
373a0 20 74 72 61 69 6c 69 6e 67 20 27 2d 63 6f 6e 63   trailing '-conc
373b0 68 27 20 77 69 74 68 20 27 2d 62 72 65 61 6b 27  h' with '-break'
373c0 20 2a 2f 0a 20 20 70 61 74 68 4c 65 6e 20 3d 20   */.  pathLen = 
373d0 73 74 72 6c 63 70 79 28 74 50 61 74 68 2c 20 63  strlcpy(tPath, c
373e0 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e  Path, MAXPATHLEN
373f0 29 3b 0a 20 20 69 66 28 20 70 61 74 68 4c 65 6e  );.  if( pathLen
37400 3e 4d 41 58 50 41 54 48 4c 45 4e 20 7c 7c 20 70  >MAXPATHLEN || p
37410 61 74 68 4c 65 6e 3c 36 20 7c 7c 20 0a 20 20 20  athLen<6 || .   
37420 20 20 28 73 74 72 6c 63 70 79 28 26 74 50 61 74    (strlcpy(&tPat
37430 68 5b 70 61 74 68 4c 65 6e 2d 35 5d 2c 20 22 62  h[pathLen-5], "b
37440 72 65 61 6b 22 2c 20 36 29 20 21 3d 20 35 29 20  reak", 6) != 5) 
37450 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
37460 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65  nprintf(sizeof(e
37470 72 72 6d 73 67 29 2c 65 72 72 6d 73 67 2c 22 70  rrmsg),errmsg,"p
37480 61 74 68 20 65 72 72 6f 72 20 28 6c 65 6e 20 25  ath error (len %
37490 64 29 22 2c 28 69 6e 74 29 70 61 74 68 4c 65 6e  d)",(int)pathLen
374a0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  );.    goto end_
374b0 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  breaklock;.  }. 
374c0 20 2f 2a 20 72 65 61 64 20 74 68 65 20 63 6f 6e   /* read the con
374d0 63 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ch content */.  
374e0 72 65 61 64 4c 65 6e 20 3d 20 6f 73 50 72 65 61  readLen = osPrea
374f0 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  d(conchFile->h, 
37500 62 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f  buf, PROXY_MAXCO
37510 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 69 66  NCHLEN, 0);.  if
37520 28 20 72 65 61 64 4c 65 6e 3c 50 52 4f 58 59 5f  ( readLen<PROXY_
37530 50 41 54 48 49 4e 44 45 58 20 29 7b 0a 20 20 20  PATHINDEX ){.   
37540 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
37550 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29  f(sizeof(errmsg)
37560 2c 65 72 72 6d 73 67 2c 22 72 65 61 64 20 65 72  ,errmsg,"read er
37570 72 6f 72 20 28 6c 65 6e 20 25 64 29 22 2c 28 69  ror (len %d)",(i
37580 6e 74 29 72 65 61 64 4c 65 6e 29 3b 0a 20 20 20  nt)readLen);.   
37590 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c   goto end_breakl
375a0 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20 77 72  ock;.  }.  /* wr
375b0 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68  ite it out to th
375c0 65 20 74 65 6d 70 6f 72 61 72 79 20 62 72 65 61  e temporary brea
375d0 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 66 64 20 3d  k file */.  fd =
375e0 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 74 50 61   robust_open(tPa
375f0 74 68 2c 20 28 4f 5f 52 44 57 52 7c 4f 5f 43 52  th, (O_RDWR|O_CR
37600 45 41 54 7c 4f 5f 45 58 43 4c 29 2c 20 30 29 3b  EAT|O_EXCL), 0);
37610 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20  .  if( fd<0 ){. 
37620 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
37630 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73  ntf(sizeof(errms
37640 67 29 2c 20 65 72 72 6d 73 67 2c 20 22 63 72 65  g), errmsg, "cre
37650 61 74 65 20 66 61 69 6c 65 64 20 28 25 64 29 22  ate failed (%d)"
37660 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f  , errno);.    go
37670 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b  to end_breaklock
37680 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 50 77  ;.  }.  if( osPw
37690 72 69 74 65 28 66 64 2c 20 62 75 66 2c 20 72 65  rite(fd, buf, re
376a0 61 64 4c 65 6e 2c 20 30 29 20 21 3d 20 28 73 73  adLen, 0) != (ss
376b0 69 7a 65 5f 74 29 72 65 61 64 4c 65 6e 20 29 7b  ize_t)readLen ){
376c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
376d0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72  rintf(sizeof(err
376e0 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22 77  msg), errmsg, "w
376f0 72 69 74 65 20 66 61 69 6c 65 64 20 28 25 64 29  rite failed (%d)
37700 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67  ", errno);.    g
37710 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63  oto end_breakloc
37720 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 6e  k;.  }.  if( ren
37730 61 6d 65 28 74 50 61 74 68 2c 20 63 50 61 74 68  ame(tPath, cPath
37740 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
37750 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
37760 28 65 72 72 6d 73 67 29 2c 20 65 72 72 6d 73 67  (errmsg), errmsg
37770 2c 20 22 72 65 6e 61 6d 65 20 66 61 69 6c 65 64  , "rename failed
37780 20 28 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a   (%d)", errno);.
37790 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65      goto end_bre
377a0 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 63  aklock;.  }.  rc
377b0 20 3d 20 30 3b 0a 20 20 66 70 72 69 6e 74 66 28   = 0;.  fprintf(
377c0 73 74 64 65 72 72 2c 20 22 62 72 6f 6b 65 20 73  stderr, "broke s
377d0 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 5c  tale lock on %s\
377e0 6e 22 2c 20 63 50 61 74 68 29 3b 0a 20 20 72 6f  n", cPath);.  ro
377f0 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65  bust_close(pFile
37800 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  , conchFile->h, 
37810 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 63 6f 6e  __LINE__);.  con
37820 63 68 46 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a  chFile->h = fd;.
37830 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65    conchFile->ope
37840 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20  nFlags = O_RDWR 
37850 7c 20 4f 5f 43 52 45 41 54 3b 0a 0a 65 6e 64 5f  | O_CREAT;..end_
37860 62 72 65 61 6b 6c 6f 63 6b 3a 0a 20 20 69 66 28  breaklock:.  if(
37870 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 66   rc ){.    if( f
37880 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 73  d>=0 ){.      os
37890 55 6e 6c 69 6e 6b 28 74 50 61 74 68 29 3b 0a 20  Unlink(tPath);. 
378a0 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73       robust_clos
378b0 65 28 70 46 69 6c 65 2c 20 66 64 2c 20 5f 5f 4c  e(pFile, fd, __L
378c0 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20  INE__);.    }.  
378d0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
378e0 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 62 72 65  , "failed to bre
378f0 61 6b 20 73 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e  ak stale lock on
37900 20 25 73 2c 20 25 73 5c 6e 22 2c 20 63 50 61 74   %s, %s\n", cPat
37910 68 2c 20 65 72 72 6d 73 67 29 3b 0a 20 20 7d 0a  h, errmsg);.  }.
37920 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
37930 2f 2a 20 54 61 6b 65 20 74 68 65 20 72 65 71 75  /* Take the requ
37940 65 73 74 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68  ested lock on th
37950 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 61 6e 64  e conch file and
37960 20 62 72 65 61 6b 20 61 20 73 74 61 6c 65 20 6c   break a stale l
37970 6f 63 6b 20 69 66 20 74 68 65 20 0a 2a 2a 20 68  ock if the .** h
37980 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73 2e 0a  ost id matches..
37990 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
379a0 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69  oxyConchLock(uni
379b0 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 75  xFile *pFile, uu
379c0 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 2c 20 69  id_t myHostID, i
379d0 6e 74 20 6c 6f 63 6b 54 79 70 65 29 7b 0a 20 20  nt lockType){.  
379e0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
379f0 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f  ext *pCtx = (pro
37a00 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
37a10 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
37a20 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75 6e 69  gContext; .  uni
37a30 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65  xFile *conchFile
37a40 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69   = pCtx->conchFi
37a50 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  le;.  int rc = S
37a60 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
37a70 6e 54 72 69 65 73 20 3d 20 30 3b 0a 20 20 73 74  nTries = 0;.  st
37a80 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 63 6f  ruct timespec co
37a90 6e 63 68 4d 6f 64 54 69 6d 65 3b 0a 20 20 0a 20  nchModTime;.  . 
37aa0 20 6d 65 6d 73 65 74 28 26 63 6f 6e 63 68 4d 6f   memset(&conchMo
37ab0 64 54 69 6d 65 2c 20 30 2c 20 73 69 7a 65 6f 66  dTime, 0, sizeof
37ac0 28 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 29 29 3b  (conchModTime));
37ad0 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d  .  do {.    rc =
37ae0 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74   conchFile->pMet
37af0 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69  hod->xLock((sqli
37b00 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46  te3_file*)conchF
37b10 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a  ile, lockType);.
37b20 20 20 20 20 6e 54 72 69 65 73 20 2b 2b 3b 0a 20      nTries ++;. 
37b30 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
37b40 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
37b50 2f 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 66  /* If the lock f
37b60 61 69 6c 65 64 20 28 62 75 73 79 29 3a 0a 20 20  ailed (busy):.  
37b70 20 20 20 20 20 2a 20 31 73 74 20 74 72 79 3a 20       * 1st try: 
37b80 67 65 74 20 74 68 65 20 6d 6f 64 20 74 69 6d 65  get the mod time
37b90 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 2c 20 77   of the conch, w
37ba0 61 69 74 20 30 2e 35 73 20 61 6e 64 20 74 72 79  ait 0.5s and try
37bb0 20 61 67 61 69 6e 2e 20 0a 20 20 20 20 20 20 20   again. .       
37bc0 2a 20 32 6e 64 20 74 72 79 3a 20 66 61 69 6c 20  * 2nd try: fail 
37bd0 69 66 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20  if the mod time 
37be0 63 68 61 6e 67 65 64 20 6f 72 20 68 6f 73 74 20  changed or host 
37bf0 69 64 20 69 73 20 64 69 66 66 65 72 65 6e 74 2c  id is different,
37c00 20 77 61 69 74 20 0a 20 20 20 20 20 20 20 2a 20   wait .       * 
37c10 20 20 20 20 20 20 20 20 20 20 31 30 20 73 65 63            10 sec
37c20 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 0a 20   and try again. 
37c30 20 20 20 20 20 20 2a 20 33 72 64 20 74 72 79 3a        * 3rd try:
37c40 20 62 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20   break the lock 
37c50 75 6e 6c 65 73 73 20 74 68 65 20 6d 6f 64 20 74  unless the mod t
37c60 69 6d 65 20 68 61 73 20 63 68 61 6e 67 65 64 2e  ime has changed.
37c70 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  .       */.     
37c80 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
37c90 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46 73  ;.      if( osFs
37ca0 74 61 74 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  tat(conchFile->h
37cb0 2c 20 26 62 75 66 29 20 29 7b 0a 20 20 20 20 20  , &buf) ){.     
37cc0 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
37cd0 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b  o(pFile, errno);
37ce0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
37cf0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
37d00 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
37d10 20 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72 69   .      if( nTri
37d20 65 73 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  es==1 ){.       
37d30 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 20 3d 20   conchModTime = 
37d40 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63  buf.st_mtimespec
37d50 3b 0a 20 20 20 20 20 20 20 20 75 73 6c 65 65 70  ;.        usleep
37d60 28 35 30 30 30 30 30 29 3b 20 2f 2a 20 77 61 69  (500000); /* wai
37d70 74 20 30 2e 35 20 73 65 63 20 61 6e 64 20 74 72  t 0.5 sec and tr
37d80 79 20 74 68 65 20 6c 6f 63 6b 20 61 67 61 69 6e  y the lock again
37d90 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  */.        conti
37da0 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 7d 0a 0a  nue;  .      }..
37db0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 54        assert( nT
37dc0 72 69 65 73 3e 31 20 29 3b 0a 20 20 20 20 20 20  ries>1 );.      
37dd0 69 66 28 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65  if( conchModTime
37de0 2e 74 76 5f 73 65 63 20 21 3d 20 62 75 66 2e 73  .tv_sec != buf.s
37df0 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f 73  t_mtimespec.tv_s
37e00 65 63 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  ec || .         
37e10 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76 5f  conchModTime.tv_
37e20 6e 73 65 63 20 21 3d 20 62 75 66 2e 73 74 5f 6d  nsec != buf.st_m
37e30 74 69 6d 65 73 70 65 63 2e 74 76 5f 6e 73 65 63  timespec.tv_nsec
37e40 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
37e50 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
37e60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20        }.      . 
37e70 20 20 20 20 20 69 66 28 20 6e 54 72 69 65 73 3d       if( nTries=
37e80 3d 32 20 29 7b 20 20 0a 20 20 20 20 20 20 20 20  =2 ){  .        
37e90 63 68 61 72 20 74 42 75 66 5b 50 52 4f 58 59 5f  char tBuf[PROXY_
37ea0 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20  MAXCONCHLEN];.  
37eb0 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20        int len = 
37ec0 6f 73 50 72 65 61 64 28 63 6f 6e 63 68 46 69 6c  osPread(conchFil
37ed0 65 2d 3e 68 2c 20 74 42 75 66 2c 20 50 52 4f 58  e->h, tBuf, PROX
37ee0 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 2c 20 30  Y_MAXCONCHLEN, 0
37ef0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c  );.        if( l
37f00 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  en<0 ){.        
37f10 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
37f20 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a  (pFile, errno);.
37f30 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
37f40 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
37f50 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  CK;.        }.  
37f60 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e 50 52        if( len>PR
37f70 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20 26 26  OXY_PATHINDEX &&
37f80 20 74 42 75 66 5b 30 5d 3d 3d 28 63 68 61 72 29   tBuf[0]==(char)
37f90 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49  PROXY_CONCHVERSI
37fa0 4f 4e 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ON){.          /
37fb0 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b 20 74 68  * don't break th
37fc0 65 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 68 6f  e lock if the ho
37fd0 73 74 20 69 64 20 64 6f 65 73 6e 27 74 20 6d 61  st id doesn't ma
37fe0 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  tch */.         
37ff0 20 69 66 28 20 30 21 3d 6d 65 6d 63 6d 70 28 26   if( 0!=memcmp(&
38000 74 42 75 66 5b 50 52 4f 58 59 5f 48 45 41 44 45  tBuf[PROXY_HEADE
38010 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c  RLEN], myHostID,
38020 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e   PROXY_HOSTIDLEN
38030 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
38040 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
38050 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  USY;.          }
38060 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
38070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 6f 6e            /* don
38080 27 74 20 62 72 65 61 6b 20 74 68 65 20 6c 6f 63  't break the loc
38090 6b 20 6f 6e 20 73 68 6f 72 74 20 72 65 61 64 20  k on short read 
380a0 6f 72 20 61 20 76 65 72 73 69 6f 6e 20 6d 69 73  or a version mis
380b0 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20  match */.       
380c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
380d0 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d  _BUSY;.        }
380e0 0a 20 20 20 20 20 20 20 20 75 73 6c 65 65 70 28  .        usleep(
380f0 31 30 30 30 30 30 30 30 29 3b 20 2f 2a 20 77 61  10000000); /* wa
38100 69 74 20 31 30 20 73 65 63 20 61 6e 64 20 74 72  it 10 sec and tr
38110 79 20 74 68 65 20 6c 6f 63 6b 20 61 67 61 69 6e  y the lock again
38120 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   */.        cont
38130 69 6e 75 65 3b 20 0a 20 20 20 20 20 20 7d 0a 20  inue; .      }. 
38140 20 20 20 20 20 0a 20 20 20 20 20 20 61 73 73 65       .      asse
38150 72 74 28 20 6e 54 72 69 65 73 3d 3d 33 20 29 3b  rt( nTries==3 );
38160 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70 72  .      if( 0==pr
38170 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63  oxyBreakConchLoc
38180 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49  k(pFile, myHostI
38190 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  D) ){.        rc
381a0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
381b0 20 20 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79        if( lockTy
381c0 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
381d0 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  CK ){.          
381e0 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  rc = conchFile->
381f0 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28  pMethod->xLock((
38200 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
38210 6e 63 68 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  nchFile, SHARED_
38220 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d  LOCK);.        }
38230 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 72 63  .        if( !rc
38240 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
38250 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d   = conchFile->pM
38260 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71  ethod->xLock((sq
38270 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63  lite3_file*)conc
38280 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29  hFile, lockType)
38290 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
382a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 77 68    }.    }.  } wh
382b0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
382c0 42 55 53 59 20 26 26 20 6e 54 72 69 65 73 3c 33  BUSY && nTries<3
382d0 20 29 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20   );.  .  return 
382e0 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 73 20  rc;.}../* Takes 
382f0 74 68 65 20 63 6f 6e 63 68 20 62 79 20 74 61 6b  the conch by tak
38300 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ing a shared loc
38310 6b 20 61 6e 64 20 72 65 61 64 20 74 68 65 20 63  k and read the c
38320 6f 6e 74 65 6e 74 73 20 63 6f 6e 63 68 2c 20 69  ontents conch, i
38330 66 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 69  f .** lockPath i
38340 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 20  s non-NULL, the 
38350 68 6f 73 74 20 49 44 20 61 6e 64 20 6c 6f 63 6b  host ID and lock
38360 20 66 69 6c 65 20 70 61 74 68 20 6d 75 73 74 20   file path must 
38370 6d 61 74 63 68 2e 20 20 41 20 4e 55 4c 4c 20 0a  match.  A NULL .
38380 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 6d 65 61 6e  ** lockPath mean
38390 73 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 50  s that the lockP
383a0 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63 68  ath in the conch
383b0 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 73   file will be us
383c0 65 64 20 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f  ed if the .** ho
383d0 73 74 20 49 44 73 20 6d 61 74 63 68 2c 20 6f 72  st IDs match, or
383e0 20 61 20 6e 65 77 20 6c 6f 63 6b 20 70 61 74 68   a new lock path
383f0 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74   will be generat
38400 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
38410 20 0a 2a 2a 20 61 6e 64 20 77 72 69 74 74 65 6e   .** and written
38420 20 74 6f 20 74 68 65 20 63 6f 6e 63 68 20 66 69   to the conch fi
38430 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
38440 74 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68  t proxyTakeConch
38450 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
38460 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  ){.  proxyLockin
38470 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
38480 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
38490 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c  ntext *)pFile->l
384a0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a  ockingContext; .
384b0 20 20 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 63    .  if( pCtx->c
384c0 6f 6e 63 68 48 65 6c 64 21 3d 30 20 29 7b 0a 20  onchHeld!=0 ){. 
384d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
384e0 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
384f0 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63    unixFile *conc
38500 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f  hFile = pCtx->co
38510 6e 63 68 46 69 6c 65 3b 0a 20 20 20 20 75 75 69  nchFile;.    uui
38520 64 5f 74 20 6d 79 48 6f 73 74 49 44 3b 0a 20 20  d_t myHostID;.  
38530 20 20 69 6e 74 20 70 45 72 72 6f 72 20 3d 20 30    int pError = 0
38540 3b 0a 20 20 20 20 63 68 61 72 20 72 65 61 64 42  ;.    char readB
38550 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43  uf[PROXY_MAXCONC
38560 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20  HLEN];.    char 
38570 6c 6f 63 6b 50 61 74 68 5b 4d 41 58 50 41 54 48  lockPath[MAXPATH
38580 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a  LEN];.    char *
38590 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20 4e  tempLockPath = N
385a0 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 63 20  ULL;.    int rc 
385b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
385c0 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6e 63 68   int createCo