/ Hex Artifact Content
Login

Artifact 27a7ead71bfca5d90ad965f2ac46b37b63f07189:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e 64 61 72  f../*.** standar
0b40: 64 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 2e  d include files.
0b50: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .*/.#include <sy
0b60: 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c  s/types.h>.#incl
0b70: 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e  ude <sys/stat.h>
0b80: 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c  .#include <fcntl
0b90: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e  .h>.#include <un
0ba0: 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  istd.h>.#include
0bb0: 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75   <time.h>.#inclu
0bc0: 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a  de <sys/time.h>.
0bd0: 23 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e  #include <errno.
0be0: 68 3e 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  h>.#if !defined(
0bf0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
0c00: 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   || SQLITE_MAX_M
0c10: 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 69 6e 63  MAP_SIZE>0.# inc
0c20: 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e 2e 68  lude <sys/mman.h
0c30: 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  >.#endif..#if SQ
0c40: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
0c50: 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c  ING_STYLE.# incl
0c60: 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68  ude <sys/ioctl.h
0c70: 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73  >.# include <sys
0c80: 2f 66 69 6c 65 2e 68 3e 0a 23 20 69 6e 63 6c 75  /file.h>.# inclu
0c90: 64 65 20 3c 73 79 73 2f 70 61 72 61 6d 2e 68 3e  de <sys/param.h>
0ca0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
0cb0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
0cc0: 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 64  _STYLE */..#if d
0cd0: 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
0ce0: 29 20 26 26 20 28 28 5f 5f 4d 41 43 5f 4f 53 5f  ) && ((__MAC_OS_
0cf0: 58 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45  X_VERSION_MIN_RE
0d00: 51 55 49 52 45 44 20 3e 20 31 30 35 30 29 20 7c  QUIRED > 1050) |
0d10: 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  | \.            
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
0d30: 5f 5f 49 50 48 4f 4e 45 5f 4f 53 5f 56 45 52 53  __IPHONE_OS_VERS
0d40: 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44  ION_MIN_REQUIRED
0d50: 20 3e 20 32 30 30 30 29 29 0a 23 20 20 69 66 20   > 2000)).#  if 
0d60: 28 21 64 65 66 69 6e 65 64 28 54 41 52 47 45 54  (!defined(TARGET
0d70: 5f 4f 53 5f 45 4d 42 45 44 44 45 44 29 20 7c 7c  _OS_EMBEDDED) ||
0d80: 20 28 54 41 52 47 45 54 5f 4f 53 5f 45 4d 42 45   (TARGET_OS_EMBE
0d90: 44 44 45 44 3d 3d 30 29 29 20 5c 0a 20 20 20 20  DDED==0)) \.    
0da0: 20 20 20 26 26 20 28 21 64 65 66 69 6e 65 64 28     && (!defined(
0db0: 54 41 52 47 45 54 5f 49 50 48 4f 4e 45 5f 53 49  TARGET_IPHONE_SI
0dc0: 4d 55 4c 41 54 4f 52 29 20 7c 7c 20 28 54 41 52  MULATOR) || (TAR
0dd0: 47 45 54 5f 49 50 48 4f 4e 45 5f 53 49 4d 55 4c  GET_IPHONE_SIMUL
0de0: 41 54 4f 52 3d 3d 30 29 29 0a 23 20 20 20 20 64  ATOR==0)).#    d
0df0: 65 66 69 6e 65 20 48 41 56 45 5f 47 45 54 48 4f  efine HAVE_GETHO
0e00: 53 54 55 55 49 44 20 31 0a 23 20 20 65 6c 73 65  STUUID 1.#  else
0e10: 0a 23 20 20 20 20 77 61 72 6e 69 6e 67 20 22 67  .#    warning "g
0e20: 65 74 68 6f 73 74 75 75 69 64 28 29 20 69 73 20  ethostuuid() is 
0e30: 64 69 73 61 62 6c 65 64 2e 22 0a 23 20 20 65 6e  disabled.".#  en
0e40: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  dif.#endif...#if
0e50: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 23 20 69 6e   OS_VXWORKS.# in
0e60: 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c  clude <sys/ioctl
0e70: 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73  .h>.# include <s
0e80: 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20 69 6e  emaphore.h>.# in
0e90: 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e  clude <limits.h>
0ea0: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
0eb0: 57 4f 52 4b 53 20 2a 2f 0a 0a 23 69 66 20 64 65  WORKS */..#if de
0ec0: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0ed0: 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   || SQLITE_ENABL
0ee0: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
0ef0: 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d  # include <sys/m
0f00: 6f 75 6e 74 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a  ount.h>.#endif..
0f10: 23 69 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d  #ifdef HAVE_UTIM
0f20: 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 74 69  E.# include <uti
0f30: 6d 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a  me.h>.#endif../*
0f40: 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75  .** Allowed valu
0f50: 65 73 20 6f 66 20 75 6e 69 78 46 69 6c 65 2e 66  es of unixFile.f
0f60: 73 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e  sFlags.*/.#defin
0f70: 65 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53  e SQLITE_FSFLAGS
0f80: 5f 49 53 5f 4d 53 44 4f 53 20 20 20 20 20 30 78  _IS_MSDOS     0x
0f90: 31 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61  1../*.** If we a
0fa0: 72 65 20 74 6f 20 62 65 20 74 68 72 65 61 64 2d  re to be thread-
0fb0: 73 61 66 65 2c 20 69 6e 63 6c 75 64 65 20 74 68  safe, include th
0fc0: 65 20 70 74 68 72 65 61 64 73 20 68 65 61 64 65  e pthreads heade
0fd0: 72 20 61 6e 64 20 64 65 66 69 6e 65 0a 2a 2a 20  r and define.** 
0fe0: 74 68 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  the SQLITE_UNIX_
0ff0: 54 48 52 45 41 44 53 20 6d 61 63 72 6f 2e 0a 2a  THREADS macro..*
1000: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  /.#if SQLITE_THR
1010: 45 41 44 53 41 46 45 0a 23 20 69 6e 63 6c 75 64  EADSAFE.# includ
1020: 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 20  e <pthread.h>.# 
1030: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 55 4e  define SQLITE_UN
1040: 49 58 5f 54 48 52 45 41 44 53 20 31 0a 23 65 6e  IX_THREADS 1.#en
1050: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75  dif../*.** Defau
1060: 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 77  lt permissions w
1070: 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20 6e  hen creating a n
1080: 65 77 20 66 69 6c 65 0a 2a 2f 0a 23 69 66 6e 64  ew file.*/.#ifnd
1090: 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ef SQLITE_DEFAUL
10a0: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
10b0: 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  NS.# define SQLI
10c0: 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
10d0: 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 36 34 34  PERMISSIONS 0644
10e0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
10f0: 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f  efault permissio
1100: 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ns when creating
1110: 20 61 75 74 6f 20 70 72 6f 78 79 20 64 69 72 0a   auto proxy dir.
1120: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1130: 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44  E_DEFAULT_PROXYD
1140: 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 23  IR_PERMISSIONS.#
1150: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44   define SQLITE_D
1160: 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f  EFAULT_PROXYDIR_
1170: 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 37 35 35  PERMISSIONS 0755
1180: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
1190: 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64  aximum supported
11a0: 20 70 61 74 68 2d 6c 65 6e 67 74 68 2e 0a 2a 2f   path-length..*/
11b0: 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f 50 41 54  .#define MAX_PAT
11c0: 48 4e 41 4d 45 20 35 31 32 0a 0a 2f 2a 20 41 6c  HNAME 512../* Al
11d0: 77 61 79 73 20 63 61 73 74 20 74 68 65 20 67 65  ways cast the ge
11e0: 74 70 69 64 28 29 20 72 65 74 75 72 6e 20 74 79  tpid() return ty
11f0: 70 65 20 66 6f 72 20 63 6f 6d 70 61 74 69 62 69  pe for compatibi
1200: 6c 69 74 79 20 77 69 74 68 0a 2a 2a 20 6b 65 72  lity with.** ker
1210: 6e 65 6c 20 6d 6f 64 75 6c 65 73 20 69 6e 20 56  nel modules in V
1220: 78 57 6f 72 6b 73 2e 20 2a 2f 0a 23 64 65 66 69  xWorks. */.#defi
1230: 6e 65 20 6f 73 47 65 74 70 69 64 28 58 29 20 28  ne osGetpid(X) (
1240: 70 69 64 5f 74 29 67 65 74 70 69 64 28 29 0a 0a  pid_t)getpid()..
1250: 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74 20 74  /*.** Only set t
1260: 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 69 66 20  he lastErrno if 
1270: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  the error code i
1280: 73 20 61 20 72 65 61 6c 20 65 72 72 6f 72 20 61  s a real error a
1290: 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e 6f 72  nd not .** a nor
12a0: 6d 61 6c 20 65 78 70 65 63 74 65 64 20 72 65 74  mal expected ret
12b0: 75 72 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c 49  urn code of SQLI
12c0: 54 45 5f 42 55 53 59 20 6f 72 20 53 51 4c 49 54  TE_BUSY or SQLIT
12d0: 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  E_OK.*/.#define 
12e0: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 78 29  IS_LOCK_ERROR(x)
12f0: 20 20 28 28 78 20 21 3d 20 53 51 4c 49 54 45 5f    ((x != SQLITE_
1300: 4f 4b 29 20 26 26 20 28 78 20 21 3d 20 53 51 4c  OK) && (x != SQL
1310: 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f 2a 20 46  ITE_BUSY))../* F
1320: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
1330: 73 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  s */.typedef str
1340: 75 63 74 20 75 6e 69 78 53 68 6d 20 75 6e 69 78  uct unixShm unix
1350: 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Shm;            
1360: 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
1370: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
1380: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1390: 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 75 6e 69   unixShmNode uni
13a0: 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20  xShmNode;       
13b0: 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* Shared memory
13c0: 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 74 79 70   instance */.typ
13d0: 65 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78  edef struct unix
13e0: 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69 78 49 6e  InodeInfo unixIn
13f0: 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a 20 41 6e  odeInfo;   /* An
1400: 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79 70 65 64   i-node */.typed
1410: 65 66 20 73 74 72 75 63 74 20 55 6e 69 78 55 6e  ef struct UnixUn
1420: 75 73 65 64 46 64 20 55 6e 69 78 55 6e 75 73 65  usedFd UnixUnuse
1430: 64 46 64 3b 20 20 20 20 20 2f 2a 20 41 6e 20 75  dFd;     /* An u
1440: 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
1450: 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  iptor */../*.** 
1460: 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66 74 65 72  Sometimes, after
1470: 20 61 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 69   a file handle i
1480: 73 20 63 6c 6f 73 65 64 20 62 79 20 53 51 4c 69  s closed by SQLi
1490: 74 65 2c 20 74 68 65 20 66 69 6c 65 20 64 65 73  te, the file des
14a0: 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61 6e 6e 6f  criptor.** canno
14b0: 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65  t be closed imme
14c0: 64 69 61 74 65 6c 79 2e 20 49 6e 20 74 68 65 73  diately. In thes
14d0: 65 20 63 61 73 65 73 2c 20 69 6e 73 74 61 6e 63  e cases, instanc
14e0: 65 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  es of the follow
14f0: 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ing.** structure
1500: 20 61 72 65 20 75 73 65 64 20 74 6f 20 73 74 6f   are used to sto
1510: 72 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  re the file desc
1520: 72 69 70 74 6f 72 20 77 68 69 6c 65 20 77 61 69  riptor while wai
1530: 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a 20 6f  ting for an.** o
1540: 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 65 69  pportunity to ei
1550: 74 68 65 72 20 63 6c 6f 73 65 20 6f 72 20 72 65  ther close or re
1560: 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63  use it..*/.struc
1570: 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 7b  t UnixUnusedFd {
1580: 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20  .  int fd;      
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15a0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
15b0: 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 69 6e  to close */.  in
15c0: 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20  t flags;        
15d0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
15e0: 20 74 68 69 73 20 66 69 6c 65 20 64 65 73 63 72   this file descr
15f0: 69 70 74 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  iptor was opened
1600: 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69 78 55   with */.  UnixU
1610: 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 20  nusedFd *pNext; 
1620: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 75       /* Next unu
1630: 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  sed file descrip
1640: 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69 6c 65  tor on same file
1650: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.};../*.** Th
1660: 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  e unixFile struc
1670: 74 75 72 65 20 69 73 20 73 75 62 63 6c 61 73 73  ture is subclass
1680: 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65   of sqlite3_file
1690: 20 73 70 65 63 69 66 69 63 20 74 6f 20 74 68 65   specific to the
16a0: 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69 6d 70   unix.** VFS imp
16b0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a 2f  lementations..*/
16c0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
16d0: 75 6e 69 78 46 69 6c 65 20 75 6e 69 78 46 69 6c  unixFile unixFil
16e0: 65 3b 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69  e;.struct unixFi
16f0: 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  le {.  sqlite3_i
1700: 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20  o_methods const 
1710: 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41 6c  *pMethod;  /* Al
1720: 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20 65  ways the first e
1730: 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ntry */.  sqlite
1740: 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20  3_vfs *pVfs;    
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1760: 20 54 68 65 20 56 46 53 20 74 68 61 74 20 63 72   The VFS that cr
1770: 65 61 74 65 64 20 74 68 69 73 20 75 6e 69 78 46  eated this unixF
1780: 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  ile */.  unixIno
1790: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20  deInfo *pInode; 
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17b0: 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63 6b 73  Info about locks
17c0: 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a   on this inode *
17d0: 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20  /.  int h;      
17e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
1800: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
1810: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
1820: 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20  r eFileLock;    
1830: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
1840: 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65 6c 64  ype of lock held
1850: 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f 0a 20   on this fd */. 
1860: 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20   unsigned short 
1870: 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 3b 20 20  int ctrlFlags;  
1880: 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69 6f 72       /* Behavior
1890: 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58 46 49  al bits.  UNIXFI
18a0: 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20  LE_* flags */.  
18b0: 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20  int lastErrno;  
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d0: 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69 78 20      /* The unix 
18e0: 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73 74 20  errno from last 
18f0: 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 76  I/O error */.  v
1900: 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74  oid *lockingCont
1910: 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
1920: 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20 73 74     /* Locking st
1930: 79 6c 65 20 73 70 65 63 69 66 69 63 20 73 74 61  yle specific sta
1940: 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73  te */.  UnixUnus
1950: 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20  edFd *pUnused;  
1960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1970: 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55 6e 69  re-allocated Uni
1980: 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20 20 63  xUnusedFd */.  c
1990: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
19a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19b0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
19c0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  e file */.  unix
19d0: 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20 20 20  Shm *pShm;      
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f0: 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* Shared memory
1a00: 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72 6d 61   segment informa
1a10: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  tion */.  int sz
1a20: 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20  Chunk;          
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a40: 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46   Configured by F
1a50: 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20  CNTL_CHUNK_SIZE 
1a60: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  */.#if SQLITE_MA
1a70: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
1a80: 69 6e 74 20 6e 46 65 74 63 68 4f 75 74 3b 20 20  int nFetchOut;  
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1ab0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65   outstanding xFe
1ac0: 74 63 68 20 72 65 66 73 20 2a 2f 0a 20 20 73 71  tch refs */.  sq
1ad0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70  lite3_int64 mmap
1ae0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
1af0: 20 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65    /* Usable size
1b00: 20 6f 66 20 6d 61 70 70 69 6e 67 20 61 74 20 70   of mapping at p
1b10: 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73  MapRegion */.  s
1b20: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61  qlite3_int64 mma
1b30: 70 53 69 7a 65 41 63 74 75 61 6c 3b 20 20 20 20  pSizeActual;    
1b40: 20 20 20 2f 2a 20 41 63 74 75 61 6c 20 73 69 7a     /* Actual siz
1b50: 65 20 6f 66 20 6d 61 70 70 69 6e 67 20 61 74 20  e of mapping at 
1b60: 70 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20  pMapRegion */.  
1b70: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d  sqlite3_int64 mm
1b80: 61 70 53 69 7a 65 4d 61 78 3b 20 20 20 20 20 20  apSizeMax;      
1b90: 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65      /* Configure
1ba0: 64 20 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a  d FCNTL_MMAP_SIZ
1bb0: 45 20 76 61 6c 75 65 20 2a 2f 0a 20 20 76 6f 69  E value */.  voi
1bc0: 64 20 2a 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20  d *pMapRegion;  
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be0: 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65   /* Memory mappe
1bf0: 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 23 65 6e 64  d region */.#end
1c00: 69 66 0a 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e  if.#ifdef __QNXN
1c10: 54 4f 5f 5f 0a 20 20 69 6e 74 20 73 65 63 74 6f  TO__.  int secto
1c20: 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
1c30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
1c40: 76 69 63 65 20 73 65 63 74 6f 72 20 73 69 7a 65  vice sector size
1c50: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 76 69 63 65   */.  int device
1c60: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 3b  Characteristics;
1c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
1c80: 63 6f 6d 70 75 74 65 64 20 64 65 76 69 63 65 20  computed device 
1c90: 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
1ca0: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  */.#endif.#if SQ
1cb0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1cc0: 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20  ING_STYLE.  int 
1cd0: 6f 70 65 6e 46 6c 61 67 73 3b 20 20 20 20 20 20  openFlags;      
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf0: 2f 2a 20 54 68 65 20 66 6c 61 67 73 20 73 70 65  /* The flags spe
1d00: 63 69 66 69 65 64 20 61 74 20 6f 70 65 6e 28 29  cified at open()
1d10: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   */.#endif.#if S
1d20: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1d30: 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 64 65  KING_STYLE || de
1d40: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1d50: 0a 20 20 75 6e 73 69 67 6e 65 64 20 66 73 46 6c  .  unsigned fsFl
1d60: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
1d70: 20 20 20 20 20 20 20 2f 2a 20 63 61 63 68 65 64         /* cached
1d80: 20 64 65 74 61 69 6c 73 20 66 72 6f 6d 20 73 74   details from st
1d90: 61 74 66 73 28 29 20 2a 2f 0a 23 65 6e 64 69 66  atfs() */.#endif
1da0: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
1db0: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
1dc0: 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20  FileId *pId;    
1dd0: 20 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20        /* Unique 
1de0: 66 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69  file ID */.#endi
1df0: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
1e00: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 6e  DEBUG.  /* The n
1e10: 65 78 74 20 67 72 6f 75 70 20 6f 66 20 76 61 72  ext group of var
1e20: 69 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20  iables are used 
1e30: 74 6f 20 74 72 61 63 6b 20 77 68 65 74 68 65 72  to track whether
1e40: 20 6f 72 20 6e 6f 74 20 74 68 65 0a 20 20 2a 2a   or not the.  **
1e50: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1e60: 6e 74 65 72 20 69 6e 20 62 79 74 65 73 20 32 34  nter in bytes 24
1e70: 2d 32 37 20 6f 66 20 64 61 74 61 62 61 73 65 20  -27 of database 
1e80: 66 69 6c 65 73 20 61 72 65 20 75 70 64 61 74 65  files are update
1e90: 64 0a 20 20 2a 2a 20 77 68 65 6e 65 76 65 72 20  d.  ** whenever 
1ea0: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
1eb0: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
1ec0: 2e 20 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  .  An assertion 
1ed0: 66 61 75 6c 74 20 77 69 6c 6c 0a 20 20 2a 2a 20  fault will.  ** 
1ee0: 6f 63 63 75 72 20 69 66 20 61 20 66 69 6c 65 20  occur if a file 
1ef0: 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 6f  is updated witho
1f00: 75 74 20 61 6c 73 6f 20 75 70 64 61 74 69 6e 67  ut also updating
1f10: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1f20: 0a 20 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20 20  .  ** counter.  
1f30: 54 68 69 73 20 74 65 73 74 20 69 73 20 6d 61 64  This test is mad
1f40: 65 20 74 6f 20 61 76 6f 69 64 20 6e 65 77 20 70  e to avoid new p
1f50: 72 6f 62 6c 65 6d 73 20 73 69 6d 69 6c 61 72 20  roblems similar 
1f60: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6f 6e 65 20  to the.  ** one 
1f70: 64 65 73 63 72 69 62 65 64 20 62 79 20 74 69 63  described by tic
1f80: 6b 65 74 20 23 33 35 38 34 2e 20 0a 20 20 2a 2f  ket #3584. .  */
1f90: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1fa0: 20 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3b 20   transCntrChng; 
1fb0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
1fc0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1fd0: 6e 74 65 72 20 63 68 61 6e 67 65 64 20 2a 2f 0a  nter changed */.
1fe0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1ff0: 64 62 55 70 64 61 74 65 3b 20 20 20 20 20 20 20  dbUpdate;       
2000: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20   /* True if any 
2010: 70 61 72 74 20 6f 66 20 64 61 74 61 62 61 73 65  part of database
2020: 20 66 69 6c 65 20 63 68 61 6e 67 65 64 20 2a 2f   file changed */
2030: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2040: 20 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3b 20   inNormalWrite; 
2050: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 20    /* True if in 
2060: 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 6f  a normal write o
2070: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 23 65 6e  peration */..#en
2080: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
2090: 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 49 6e 20  TE_TEST.  /* In 
20a0: 74 65 73 74 20 6d 6f 64 65 2c 20 69 6e 63 72 65  test mode, incre
20b0: 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ase the size of 
20c0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 61  this structure a
20d0: 20 62 69 74 20 73 6f 20 74 68 61 74 20 0a 20 20   bit so that .  
20e0: 2a 2a 20 69 74 20 69 73 20 6c 61 72 67 65 72 20  ** it is larger 
20f0: 74 68 61 6e 20 74 68 65 20 73 74 72 75 63 74 20  than the struct 
2100: 43 72 61 73 68 46 69 6c 65 20 64 65 66 69 6e 65  CrashFile define
2110: 64 20 69 6e 20 74 65 73 74 36 2e 63 2e 0a 20 20  d in test6.c..  
2120: 2a 2f 0a 20 20 63 68 61 72 20 61 50 61 64 64 69  */.  char aPaddi
2130: 6e 67 5b 33 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d  ng[32];.#endif.}
2140: 3b 0a 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61  ;../* This varia
2150: 62 6c 65 20 68 6f 6c 64 73 20 74 68 65 20 70 72  ble holds the pr
2160: 6f 63 65 73 73 20 69 64 20 28 70 69 64 29 20 66  ocess id (pid) f
2170: 72 6f 6d 20 77 68 65 6e 20 74 68 65 20 78 52 61  rom when the xRa
2180: 6e 64 6f 6d 6e 65 73 73 28 29 0a 2a 2a 20 6d 65  ndomness().** me
2190: 74 68 6f 64 20 77 61 73 20 63 61 6c 6c 65 64 2e  thod was called.
21a0: 20 20 49 66 20 78 4f 70 65 6e 28 29 20 69 73 20    If xOpen() is 
21b0: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 20 64 69  called from a di
21c0: 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 20  fferent process 
21d0: 69 64 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e  id,.** indicatin
21e0: 67 20 74 68 61 74 20 61 20 66 6f 72 6b 28 29 20  g that a fork() 
21f0: 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 74 68  has occurred, th
2200: 65 20 50 52 4e 47 20 77 69 6c 6c 20 62 65 20 72  e PRNG will be r
2210: 65 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eset..*/.static 
2220: 70 69 64 5f 74 20 72 61 6e 64 6f 6d 6e 65 73 73  pid_t randomness
2230: 50 69 64 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  Pid = 0;../*.** 
2240: 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66  Allowed values f
2250: 6f 72 20 74 68 65 20 75 6e 69 78 46 69 6c 65 2e  or the unixFile.
2260: 63 74 72 6c 46 6c 61 67 73 20 62 69 74 6d 61 73  ctrlFlags bitmas
2270: 6b 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  k:.*/.#define UN
2280: 49 58 46 49 4c 45 5f 45 58 43 4c 20 20 20 20 20  IXFILE_EXCL     
2290: 20 20 20 30 78 30 31 20 20 20 20 20 2f 2a 20 43     0x01     /* C
22a0: 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20  onnections from 
22b0: 6f 6e 65 20 70 72 6f 63 65 73 73 20 6f 6e 6c 79  one process only
22c0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58   */.#define UNIX
22d0: 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20 20 20  FILE_RDONLY     
22e0: 20 30 78 30 32 20 20 20 20 20 2f 2a 20 43 6f 6e   0x02     /* Con
22f0: 6e 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 20  nection is read 
2300: 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20  only */.#define 
2310: 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53 54  UNIXFILE_PERSIST
2320: 5f 57 41 4c 20 30 78 30 34 20 20 20 20 20 2f 2a  _WAL 0x04     /*
2330: 20 50 65 72 73 69 73 74 65 6e 74 20 57 41 4c 20   Persistent WAL 
2340: 6d 6f 64 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20  mode */.#ifndef 
2350: 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44  SQLITE_DISABLE_D
2360: 49 52 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20  IRSYNC.# define 
2370: 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43  UNIXFILE_DIRSYNC
2380: 20 20 20 20 30 78 30 38 20 20 20 20 20 2f 2a 20      0x08     /* 
2390: 44 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 6e  Directory sync n
23a0: 65 65 64 65 64 20 2a 2f 0a 23 65 6c 73 65 0a 23  eeded */.#else.#
23b0: 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45   define UNIXFILE
23c0: 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78 30 30  _DIRSYNC    0x00
23d0: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
23e0: 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 20 20 20  UNIXFILE_PSOW   
23f0: 20 20 20 20 20 30 78 31 30 20 20 20 20 20 2f 2a       0x10     /*
2400: 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
2410: 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
2420: 45 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  E */.#define UNI
2430: 58 46 49 4c 45 5f 44 45 4c 45 54 45 20 20 20 20  XFILE_DELETE    
2440: 20 20 30 78 32 30 20 20 20 20 20 2f 2a 20 44 65    0x20     /* De
2450: 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f  lete on close */
2460: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
2470: 45 5f 55 52 49 20 20 20 20 20 20 20 20 20 30 78  E_URI         0x
2480: 34 30 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61  40     /* Filena
2490: 6d 65 20 6d 69 67 68 74 20 68 61 76 65 20 71 75  me might have qu
24a0: 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20 2a  ery parameters *
24b0: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49  /.#define UNIXFI
24c0: 4c 45 5f 4e 4f 4c 4f 43 4b 20 20 20 20 20 20 30  LE_NOLOCK      0
24d0: 78 38 30 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  x80     /* Do no
24e0: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f   file locking */
24f0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20  ../*.** Include 
2500: 63 6f 64 65 20 74 68 61 74 20 69 73 20 63 6f 6d  code that is com
2510: 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e  mon to all os_*.
2520: 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c  c files.*/.#incl
2530: 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68  ude "os_common.h
2540: 22 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  "../*.** Define 
2550: 76 61 72 69 6f 75 73 20 6d 61 63 72 6f 73 20 74  various macros t
2560: 68 61 74 20 61 72 65 20 6d 69 73 73 69 6e 67 20  hat are missing 
2570: 66 72 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d  from some system
2580: 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f  s..*/.#ifndef O_
2590: 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69  LARGEFILE.# defi
25a0: 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30  ne O_LARGEFILE 0
25b0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
25c0: 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46  QLITE_DISABLE_LF
25d0: 53 0a 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47  S.# undef O_LARG
25e0: 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f  EFILE.# define O
25f0: 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e  _LARGEFILE 0.#en
2600: 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f  dif.#ifndef O_NO
2610: 46 4f 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20  FOLLOW.# define 
2620: 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e  O_NOFOLLOW 0.#en
2630: 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49  dif.#ifndef O_BI
2640: 4e 41 52 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f  NARY.# define O_
2650: 42 49 4e 41 52 59 20 30 0a 23 65 6e 64 69 66 0a  BINARY 0.#endif.
2660: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65 61  ./*.** The threa
2670: 64 69 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76  did macro resolv
2680: 65 73 20 74 6f 20 74 68 65 20 74 68 72 65 61 64  es to the thread
2690: 2d 69 64 20 6f 72 20 74 6f 20 30 2e 20 20 55 73  -id or to 0.  Us
26a0: 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
26b0: 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  g and debugging 
26c0: 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  only..*/.#if SQL
26d0: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23  ITE_THREADSAFE.#
26e0: 64 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20  define threadid 
26f0: 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23  pthread_self().#
2700: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 74 68 72  else.#define thr
2710: 65 61 64 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a  eadid 0.#endif..
2720: 2f 2a 0a 2a 2a 20 48 41 56 45 5f 4d 52 45 4d 41  /*.** HAVE_MREMA
2730: 50 20 64 65 66 61 75 6c 74 73 20 74 6f 20 74 72  P defaults to tr
2740: 75 65 20 6f 6e 20 4c 69 6e 75 78 20 61 6e 64 20  ue on Linux and 
2750: 66 61 6c 73 65 20 65 76 65 72 79 77 68 65 72 65  false everywhere
2760: 20 65 6c 73 65 2e 0a 2a 2f 0a 23 69 66 20 21 64   else..*/.#if !d
2770: 65 66 69 6e 65 64 28 48 41 56 45 5f 4d 52 45 4d  efined(HAVE_MREM
2780: 41 50 29 0a 23 20 69 66 20 64 65 66 69 6e 65 64  AP).# if defined
2790: 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26 26 20 64  (__linux__) && d
27a0: 65 66 69 6e 65 64 28 5f 47 4e 55 5f 53 4f 55 52  efined(_GNU_SOUR
27b0: 43 45 29 0a 23 20 20 64 65 66 69 6e 65 20 48 41  CE).#  define HA
27c0: 56 45 5f 4d 52 45 4d 41 50 20 31 0a 23 20 65 6c  VE_MREMAP 1.# el
27d0: 73 65 0a 23 20 20 64 65 66 69 6e 65 20 48 41 56  se.#  define HAV
27e0: 45 5f 4d 52 45 4d 41 50 20 30 0a 23 20 65 6e 64  E_MREMAP 0.# end
27f0: 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  if.#endif../*.**
2800: 20 45 78 70 6c 69 63 69 74 6c 79 20 63 61 6c 6c   Explicitly call
2810: 20 74 68 65 20 36 34 2d 62 69 74 20 76 65 72 73   the 64-bit vers
2820: 69 6f 6e 20 6f 66 20 6c 73 65 65 6b 28 29 20 6f  ion of lseek() o
2830: 6e 20 41 6e 64 72 6f 69 64 2e 20 4f 74 68 65 72  n Android. Other
2840: 77 69 73 65 2c 20 6c 73 65 65 6b 28 29 0a 2a 2a  wise, lseek().**
2850: 20 69 73 20 74 68 65 20 33 32 2d 62 69 74 20 76   is the 32-bit v
2860: 65 72 73 69 6f 6e 2c 20 65 76 65 6e 20 69 66 20  ersion, even if 
2870: 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54  _FILE_OFFSET_BIT
2880: 53 3d 36 34 20 69 73 20 64 65 66 69 6e 65 64 2e  S=64 is defined.
2890: 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 41 4e 44  .*/.#ifdef __AND
28a0: 52 4f 49 44 5f 5f 0a 23 20 64 65 66 69 6e 65 20  ROID__.# define 
28b0: 6c 73 65 65 6b 20 6c 73 65 65 6b 36 34 0a 23 65  lseek lseek64.#e
28c0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 69 66 66  ndif../*.** Diff
28d0: 65 72 65 6e 74 20 55 6e 69 78 20 73 79 73 74 65  erent Unix syste
28e0: 6d 73 20 64 65 63 6c 61 72 65 20 6f 70 65 6e 28  ms declare open(
28f0: 29 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 77  ) in different w
2900: 61 79 73 2e 20 20 53 61 6d 65 20 75 73 65 0a 2a  ays.  Same use.*
2910: 2a 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61  * open(const cha
2920: 72 2a 2c 69 6e 74 2c 6d 6f 64 65 5f 74 29 2e 20  r*,int,mode_t). 
2930: 20 4f 74 68 65 72 73 20 75 73 65 20 6f 70 65 6e   Others use open
2940: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74  (const char*,int
2950: 2c 2e 2e 2e 29 2e 0a 2a 2a 20 54 68 65 20 64 69  ,...)..** The di
2960: 66 66 65 72 65 6e 63 65 20 69 73 20 69 6d 70 6f  fference is impo
2970: 72 74 61 6e 74 20 77 68 65 6e 20 75 73 69 6e 67  rtant when using
2980: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
2990: 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  e function..**.*
29a0: 2a 20 54 68 65 20 73 61 66 65 73 74 20 77 61 79  * The safest way
29b0: 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68   to deal with th
29c0: 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 74 6f 20  e problem is to 
29d0: 61 6c 77 61 79 73 20 75 73 65 20 74 68 69 73 20  always use this 
29e0: 77 72 61 70 70 65 72 0a 2a 2a 20 77 68 69 63 68  wrapper.** which
29f0: 20 61 6c 77 61 79 73 20 68 61 73 20 74 68 65 20   always has the 
2a00: 73 61 6d 65 20 77 65 6c 6c 2d 64 65 66 69 6e 65  same well-define
2a10: 64 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a  d interface..*/.
2a20: 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78  static int posix
2a30: 4f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  Open(const char 
2a40: 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 66 6c 61 67  *zFile, int flag
2a50: 73 2c 20 69 6e 74 20 6d 6f 64 65 29 7b 0a 20 20  s, int mode){.  
2a60: 72 65 74 75 72 6e 20 6f 70 65 6e 28 7a 46 69 6c  return open(zFil
2a70: 65 2c 20 66 6c 61 67 73 2c 20 6d 6f 64 65 29 3b  e, flags, mode);
2a80: 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72  .}../* Forward r
2a90: 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74  eference */.stat
2aa0: 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72 65 63  ic int openDirec
2ab0: 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61 72 2a  tory(const char*
2ac0: 2c 20 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20  , int*);.static 
2ad0: 69 6e 74 20 75 6e 69 78 47 65 74 70 61 67 65 73  int unixGetpages
2ae0: 69 7a 65 28 76 6f 69 64 29 3b 0a 0a 2f 2a 0a 2a  ize(void);../*.*
2af0: 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d 20 63 61  * Many system ca
2b00: 6c 6c 73 20 61 72 65 20 61 63 63 65 73 73 65 64  lls are accessed
2b10: 20 74 68 72 6f 75 67 68 20 70 6f 69 6e 74 65 72   through pointer
2b20: 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20 73 6f  -to-functions so
2b30: 20 74 68 61 74 0a 2a 2a 20 74 68 65 79 20 6d 61   that.** they ma
2b40: 79 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20  y be overridden 
2b50: 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20 66 61  at runtime to fa
2b60: 63 69 6c 69 74 61 74 65 20 66 61 75 6c 74 20 69  cilitate fault i
2b70: 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e 67 0a  njection during.
2b80: 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 73  ** testing and s
2b90: 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68 65 20  andboxing.  The 
2ba0: 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 20  following array 
2bb0: 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 73 20  holds the names 
2bc0: 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20  and pointers.** 
2bd0: 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64 65 61  to all overridea
2be0: 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ble system calls
2bf0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ..*/.static stru
2c00: 63 74 20 75 6e 69 78 5f 73 79 73 63 61 6c 6c 20  ct unix_syscall 
2c10: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
2c20: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
2c30: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2c40: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a   system call */.
2c50: 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c    sqlite3_syscal
2c60: 6c 5f 70 74 72 20 70 43 75 72 72 65 6e 74 3b 20  l_ptr pCurrent; 
2c70: 2f 2a 20 43 75 72 72 65 6e 74 20 76 61 6c 75 65  /* Current value
2c80: 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 63   of the system c
2c90: 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  all */.  sqlite3
2ca0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 44 65  _syscall_ptr pDe
2cb0: 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61 75 6c  fault; /* Defaul
2cc0: 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61 53 79  t value */.} aSy
2cd0: 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 20 20 7b 20  scall[] = {.  { 
2ce0: 22 6f 70 65 6e 22 2c 20 20 20 20 20 20 20 20 20  "open",         
2cf0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
2d00: 5f 70 74 72 29 70 6f 73 69 78 4f 70 65 6e 2c 20  _ptr)posixOpen, 
2d10: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
2d20: 73 4f 70 65 6e 20 20 20 20 20 20 28 28 69 6e 74  sOpen      ((int
2d30: 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  (*)(const char*,
2d40: 69 6e 74 2c 69 6e 74 29 29 61 53 79 73 63 61 6c  int,int))aSyscal
2d50: 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[0].pCurrent)..
2d60: 20 20 7b 20 22 63 6c 6f 73 65 22 2c 20 20 20 20    { "close",    
2d70: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
2d80: 63 61 6c 6c 5f 70 74 72 29 63 6c 6f 73 65 2c 20  call_ptr)close, 
2d90: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
2da0: 6e 65 20 6f 73 43 6c 6f 73 65 20 20 20 20 20 28  ne osClose     (
2db0: 28 69 6e 74 28 2a 29 28 69 6e 74 29 29 61 53 79  (int(*)(int))aSy
2dc0: 73 63 61 6c 6c 5b 31 5d 2e 70 43 75 72 72 65 6e  scall[1].pCurren
2dd0: 74 29 0a 0a 20 20 7b 20 22 61 63 63 65 73 73 22  t)..  { "access"
2de0: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
2df0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 61 63 63  _syscall_ptr)acc
2e00: 65 73 73 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23  ess,     0  },.#
2e10: 64 65 66 69 6e 65 20 6f 73 41 63 63 65 73 73 20  define osAccess 
2e20: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
2e30: 74 20 63 68 61 72 2a 2c 69 6e 74 29 29 61 53 79  t char*,int))aSy
2e40: 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65 6e  scall[2].pCurren
2e50: 74 29 0a 0a 20 20 7b 20 22 67 65 74 63 77 64 22  t)..  { "getcwd"
2e60: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
2e70: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 67 65 74  _syscall_ptr)get
2e80: 63 77 64 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23  cwd,     0  },.#
2e90: 64 65 66 69 6e 65 20 6f 73 47 65 74 63 77 64 20  define osGetcwd 
2ea0: 20 20 20 28 28 63 68 61 72 2a 28 2a 29 28 63 68     ((char*(*)(ch
2eb0: 61 72 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73  ar*,size_t))aSys
2ec0: 63 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74  call[3].pCurrent
2ed0: 29 0a 0a 20 20 7b 20 22 73 74 61 74 22 2c 20 20  )..  { "stat",  
2ee0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
2ef0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 73 74 61 74  syscall_ptr)stat
2f00: 2c 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  ,       0  },.#d
2f10: 65 66 69 6e 65 20 6f 73 53 74 61 74 20 20 20 20  efine osStat    
2f20: 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74    ((int(*)(const
2f30: 20 63 68 61 72 2a 2c 73 74 72 75 63 74 20 73 74   char*,struct st
2f40: 61 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 34 5d  at*))aSyscall[4]
2f50: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 2f 2a 0a 2a  .pCurrent)../*.*
2f60: 2a 20 54 68 65 20 44 4a 47 50 50 20 63 6f 6d 70  * The DJGPP comp
2f70: 69 6c 65 72 20 65 6e 76 69 72 6f 6e 6d 65 6e 74  iler environment
2f80: 20 6c 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c 69   looks mostly li
2f90: 6b 65 20 55 6e 69 78 2c 20 62 75 74 20 69 74 0a  ke Unix, but it.
2fa0: 2a 2a 20 6c 61 63 6b 73 20 74 68 65 20 66 63 6e  ** lacks the fcn
2fb0: 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  tl() system call
2fc0: 2e 20 20 53 6f 20 72 65 64 65 66 69 6e 65 20 66  .  So redefine f
2fd0: 63 6e 74 6c 28 29 20 74 6f 20 62 65 20 73 6f 6d  cntl() to be som
2fe0: 65 74 68 69 6e 67 0a 2a 2a 20 74 68 61 74 20 61  ething.** that a
2ff0: 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20  lways succeeds. 
3000: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
3010: 20 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 20 6e 6f   locking does no
3020: 74 20 6f 63 63 75 72 20 75 6e 64 65 72 0a 2a 2a  t occur under.**
3030: 20 44 4a 47 50 50 2e 20 20 42 75 74 20 69 74 20   DJGPP.  But it 
3040: 69 73 20 44 4f 53 20 2d 20 77 68 61 74 20 64 69  is DOS - what di
3050: 64 20 79 6f 75 20 65 78 70 65 63 74 3f 0a 2a 2f  d you expect?.*/
3060: 0a 23 69 66 64 65 66 20 5f 5f 44 4a 47 50 50 5f  .#ifdef __DJGPP_
3070: 5f 0a 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20  _.  { "fstat",  
3080: 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20        0,        
3090: 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23           0  },.#
30a0: 64 65 66 69 6e 65 20 6f 73 46 73 74 61 74 28 61  define osFstat(a
30b0: 2c 62 2c 63 29 20 20 20 20 30 0a 23 65 6c 73 65  ,b,c)    0.#else
30c0: 20 20 20 20 20 0a 20 20 7b 20 22 66 73 74 61 74       .  { "fstat
30d0: 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ",        (sqlit
30e0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66  e3_syscall_ptr)f
30f0: 73 74 61 74 2c 20 20 20 20 20 20 30 20 20 7d 2c  stat,      0  },
3100: 0a 23 64 65 66 69 6e 65 20 6f 73 46 73 74 61 74  .#define osFstat
3110: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e       ((int(*)(in
3120: 74 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29 29  t,struct stat*))
3130: 61 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72  aSyscall[5].pCur
3140: 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 20 20  rent).#endif..  
3150: 7b 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 20  { "ftruncate",  
3160: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3170: 6c 6c 5f 70 74 72 29 66 74 72 75 6e 63 61 74 65  ll_ptr)ftruncate
3180: 2c 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65  ,  0  },.#define
3190: 20 6f 73 46 74 72 75 6e 63 61 74 65 20 28 28 69   osFtruncate ((i
31a0: 6e 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 29  nt(*)(int,off_t)
31b0: 29 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75  )aSyscall[6].pCu
31c0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63 6e  rrent)..  { "fcn
31d0: 74 6c 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c  tl",        (sql
31e0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
31f0: 29 66 63 6e 74 6c 2c 20 20 20 20 20 20 30 20 20  )fcntl,      0  
3200: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 6e  },.#define osFcn
3210: 74 6c 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28  tl     ((int(*)(
3220: 69 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53 79  int,int,...))aSy
3230: 73 63 61 6c 6c 5b 37 5d 2e 70 43 75 72 72 65 6e  scall[7].pCurren
3240: 74 29 0a 0a 20 20 7b 20 22 72 65 61 64 22 2c 20  t)..  { "read", 
3250: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
3260: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 65 61  _syscall_ptr)rea
3270: 64 2c 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23  d,       0  },.#
3280: 64 65 66 69 6e 65 20 6f 73 52 65 61 64 20 20 20  define osRead   
3290: 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28     ((ssize_t(*)(
32a0: 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  int,void*,size_t
32b0: 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70 43  ))aSyscall[8].pC
32c0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
32d0: 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20  ined(USE_PREAD) 
32e0: 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  || SQLITE_ENABLE
32f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
3300: 20 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20 20   { "pread",     
3310: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3320: 61 6c 6c 5f 70 74 72 29 70 72 65 61 64 2c 20 20  all_ptr)pread,  
3330: 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a      0  },.#else.
3340: 20 20 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20    { "pread",    
3350: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3360: 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20  call_ptr)0,     
3370: 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69       0  },.#endi
3380: 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 72 65 61  f.#define osPrea
3390: 64 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28  d     ((ssize_t(
33a0: 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a  *)(int,void*,siz
33b0: 65 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63  e_t,off_t))aSysc
33c0: 61 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29  all[9].pCurrent)
33d0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53  ..#if defined(US
33e0: 45 5f 50 52 45 41 44 36 34 29 0a 20 20 7b 20 22  E_PREAD64).  { "
33f0: 70 72 65 61 64 36 34 22 2c 20 20 20 20 20 20 28  pread64",      (
3400: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3410: 70 74 72 29 70 72 65 61 64 36 34 2c 20 20 20 20  ptr)pread64,    
3420: 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20  0  },.#else.  { 
3430: 22 70 72 65 61 64 36 34 22 2c 20 20 20 20 20 20  "pread64",      
3440: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3450: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
3460: 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64   0  },.#endif.#d
3470: 65 66 69 6e 65 20 6f 73 50 72 65 61 64 36 34 20  efine osPread64 
3480: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
3490: 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c  nt,void*,size_t,
34a0: 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  off_t))aSyscall[
34b0: 31 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  10].pCurrent).. 
34c0: 20 7b 20 22 77 72 69 74 65 22 2c 20 20 20 20 20   { "write",     
34d0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
34e0: 61 6c 6c 5f 70 74 72 29 77 72 69 74 65 2c 20 20  all_ptr)write,  
34f0: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
3500: 65 20 6f 73 57 72 69 74 65 20 20 20 20 20 28 28  e osWrite     ((
3510: 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63  ssize_t(*)(int,c
3520: 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f  onst void*,size_
3530: 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 31 5d 2e  t))aSyscall[11].
3540: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
3550: 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
3560: 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) || SQLITE_ENAB
3570: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
3580: 0a 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20 20  .  { "pwrite",  
3590: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
35a0: 73 63 61 6c 6c 5f 70 74 72 29 70 77 72 69 74 65  scall_ptr)pwrite
35b0: 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73  ,     0  },.#els
35c0: 65 0a 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20  e.  { "pwrite", 
35d0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
35e0: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
35f0: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e         0  },.#en
3600: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 77  dif.#define osPw
3610: 72 69 74 65 20 20 20 20 28 28 73 73 69 7a 65 5f  rite    ((ssize_
3620: 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76  t(*)(int,const v
3630: 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f  oid*,size_t,off_
3640: 74 29 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20  t))\.           
3650: 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c           aSyscal
3660: 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[12].pCurrent).
3670: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
3680: 5f 50 52 45 41 44 36 34 29 0a 20 20 7b 20 22 70  _PREAD64).  { "p
3690: 77 72 69 74 65 36 34 22 2c 20 20 20 20 20 28 73  write64",     (s
36a0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
36b0: 74 72 29 70 77 72 69 74 65 36 34 2c 20 20 20 30  tr)pwrite64,   0
36c0: 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22    },.#else.  { "
36d0: 70 77 72 69 74 65 36 34 22 2c 20 20 20 20 20 28  pwrite64",     (
36e0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
36f0: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
3700: 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65  0  },.#endif.#de
3710: 66 69 6e 65 20 6f 73 50 77 72 69 74 65 36 34 20  fine osPwrite64 
3720: 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e   ((ssize_t(*)(in
3730: 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69  t,const void*,si
3740: 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a 20 20  ze_t,off_t))\.  
3750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3760: 20 20 61 53 79 73 63 61 6c 6c 5b 31 33 5d 2e 70    aSyscall[13].p
3770: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66  Current)..  { "f
3780: 63 68 6d 6f 64 22 2c 20 20 20 20 20 20 20 28 73  chmod",       (s
3790: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
37a0: 74 72 29 66 63 68 6d 6f 64 2c 20 20 20 20 20 20  tr)fchmod,      
37b0: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
37c0: 65 20 6f 73 46 63 68 6d 6f 64 20 20 20 20 28 28  e osFchmod    ((
37d0: 69 6e 74 28 2a 29 28 69 6e 74 2c 6d 6f 64 65 5f  int(*)(int,mode_
37e0: 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 34 5d 2e  t))aSyscall[14].
37f0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
3800: 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49  efined(HAVE_POSI
3810: 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20  X_FALLOCATE) && 
3820: 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f  HAVE_POSIX_FALLO
3830: 43 41 54 45 0a 20 20 7b 20 22 66 61 6c 6c 6f 63  CATE.  { "falloc
3840: 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69 74 65  ate",    (sqlite
3850: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f  3_syscall_ptr)po
3860: 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 2c 20 20  six_fallocate,  
3870: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3880: 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20 28  fallocate",    (
3890: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
38a0: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
38b0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
38c0: 66 0a 23 64 65 66 69 6e 65 20 6f 73 46 61 6c 6c  f.#define osFall
38d0: 6f 63 61 74 65 20 28 28 69 6e 74 28 2a 29 28 69  ocate ((int(*)(i
38e0: 6e 74 2c 6f 66 66 5f 74 2c 6f 66 66 5f 74 29 29  nt,off_t,off_t))
38f0: 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75  aSyscall[15].pCu
3900: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 75 6e 6c  rrent)..  { "unl
3910: 69 6e 6b 22 2c 20 20 20 20 20 20 20 28 73 71 6c  ink",       (sql
3920: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3930: 29 75 6e 6c 69 6e 6b 2c 20 20 20 20 20 20 20 20  )unlink,        
3940: 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20     0 },.#define 
3950: 6f 73 55 6e 6c 69 6e 6b 20 20 20 20 28 28 69 6e  osUnlink    ((in
3960: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
3970: 29 29 61 53 79 73 63 61 6c 6c 5b 31 36 5d 2e 70  ))aSyscall[16].p
3980: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 6f  Current)..  { "o
3990: 70 65 6e 44 69 72 65 63 74 6f 72 79 22 2c 20 20  penDirectory",  
39a0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
39b0: 6c 6c 5f 70 74 72 29 6f 70 65 6e 44 69 72 65 63  ll_ptr)openDirec
39c0: 74 6f 72 79 2c 20 20 20 20 20 20 30 20 7d 2c 0a  tory,      0 },.
39d0: 23 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e 44 69  #define osOpenDi
39e0: 72 65 63 74 6f 72 79 20 28 28 69 6e 74 28 2a 29  rectory ((int(*)
39f0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74  (const char*,int
3a00: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 37 5d 2e  *))aSyscall[17].
3a10: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3a20: 6d 6b 64 69 72 22 2c 20 20 20 20 20 20 20 20 28  mkdir",        (
3a30: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3a40: 70 74 72 29 6d 6b 64 69 72 2c 20 20 20 20 20 20  ptr)mkdir,      
3a50: 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e       0 },.#defin
3a60: 65 20 6f 73 4d 6b 64 69 72 20 20 20 20 20 28 28  e osMkdir     ((
3a70: 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  int(*)(const cha
3a80: 72 2a 2c 6d 6f 64 65 5f 74 29 29 61 53 79 73 63  r*,mode_t))aSysc
3a90: 61 6c 6c 5b 31 38 5d 2e 70 43 75 72 72 65 6e 74  all[18].pCurrent
3aa0: 29 0a 0a 20 20 7b 20 22 72 6d 64 69 72 22 2c 20  )..  { "rmdir", 
3ab0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
3ac0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 6d 64 69  syscall_ptr)rmdi
3ad0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  r,           0 }
3ae0: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52 6d 64 69  ,.#define osRmdi
3af0: 72 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63  r     ((int(*)(c
3b00: 6f 6e 73 74 20 63 68 61 72 2a 29 29 61 53 79 73  onst char*))aSys
3b10: 63 61 6c 6c 5b 31 39 5d 2e 70 43 75 72 72 65 6e  call[19].pCurren
3b20: 74 29 0a 0a 20 20 7b 20 22 66 63 68 6f 77 6e 22  t)..  { "fchown"
3b30: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
3b40: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 68  _syscall_ptr)fch
3b50: 6f 77 6e 2c 20 20 20 20 20 20 20 20 20 20 30 20  own,          0 
3b60: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 68  },.#define osFch
3b70: 6f 77 6e 20 20 20 20 28 28 69 6e 74 28 2a 29 28  own    ((int(*)(
3b80: 69 6e 74 2c 75 69 64 5f 74 2c 67 69 64 5f 74 29  int,uid_t,gid_t)
3b90: 29 61 53 79 73 63 61 6c 6c 5b 32 30 5d 2e 70 43  )aSyscall[20].pC
3ba0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 67 65  urrent)..  { "ge
3bb0: 74 65 75 69 64 22 2c 20 20 20 20 20 20 28 73 71  teuid",      (sq
3bc0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3bd0: 72 29 67 65 74 65 75 69 64 2c 20 20 20 20 20 20  r)geteuid,      
3be0: 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20     0 },.#define 
3bf0: 6f 73 47 65 74 65 75 69 64 20 20 20 28 28 75 69  osGeteuid   ((ui
3c00: 64 5f 74 28 2a 29 28 76 6f 69 64 29 29 61 53 79  d_t(*)(void))aSy
3c10: 73 63 61 6c 6c 5b 32 31 5d 2e 70 43 75 72 72 65  scall[21].pCurre
3c20: 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  nt)..#if !define
3c30: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
3c40: 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  L) || SQLITE_MAX
3c50: 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 7b  _MMAP_SIZE>0.  {
3c60: 20 22 6d 6d 61 70 22 2c 20 20 20 20 20 20 20 28   "mmap",       (
3c70: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3c80: 70 74 72 29 6d 6d 61 70 2c 20 20 20 20 20 30 20  ptr)mmap,     0 
3c90: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4d 6d 61  },.#define osMma
3ca0: 70 20 28 28 76 6f 69 64 2a 28 2a 29 28 76 6f 69  p ((void*(*)(voi
3cb0: 64 2a 2c 73 69 7a 65 5f 74 2c 69 6e 74 2c 69 6e  d*,size_t,int,in
3cc0: 74 2c 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53 79  t,int,off_t))aSy
3cd0: 73 63 61 6c 6c 5b 32 32 5d 2e 70 43 75 72 72 65  scall[22].pCurre
3ce0: 6e 74 29 0a 0a 20 20 7b 20 22 6d 75 6e 6d 61 70  nt)..  { "munmap
3cf0: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
3d00: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6d 75  3_syscall_ptr)mu
3d10: 6e 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20 30  nmap,          0
3d20: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4d 75   },.#define osMu
3d30: 6e 6d 61 70 20 28 28 76 6f 69 64 2a 28 2a 29 28  nmap ((void*(*)(
3d40: 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53  void*,size_t))aS
3d50: 79 73 63 61 6c 6c 5b 32 33 5d 2e 70 43 75 72 72  yscall[23].pCurr
3d60: 65 6e 74 29 0a 0a 23 69 66 20 48 41 56 45 5f 4d  ent)..#if HAVE_M
3d70: 52 45 4d 41 50 0a 20 20 7b 20 22 6d 72 65 6d 61  REMAP.  { "mrema
3d80: 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  p",       (sqlit
3d90: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6d  e3_syscall_ptr)m
3da0: 72 65 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20  remap,          
3db0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3dc0: 6d 72 65 6d 61 70 22 2c 20 20 20 20 20 20 20 28  mremap",       (
3dd0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3de0: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
3df0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
3e00: 0a 23 64 65 66 69 6e 65 20 6f 73 4d 72 65 6d 61  .#define osMrema
3e10: 70 20 28 28 76 6f 69 64 2a 28 2a 29 28 76 6f 69  p ((void*(*)(voi
3e20: 64 2a 2c 73 69 7a 65 5f 74 2c 73 69 7a 65 5f 74  d*,size_t,size_t
3e30: 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53 79 73 63 61  ,int,...))aSysca
3e40: 6c 6c 5b 32 34 5d 2e 70 43 75 72 72 65 6e 74 29  ll[24].pCurrent)
3e50: 0a 0a 20 20 7b 20 22 67 65 74 70 61 67 65 73 69  ..  { "getpagesi
3e60: 7a 65 22 2c 20 20 28 73 71 6c 69 74 65 33 5f 73  ze",  (sqlite3_s
3e70: 79 73 63 61 6c 6c 5f 70 74 72 29 75 6e 69 78 47  yscall_ptr)unixG
3e80: 65 74 70 61 67 65 73 69 7a 65 2c 20 30 20 7d 2c  etpagesize, 0 },
3e90: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 70 61  .#define osGetpa
3ea0: 67 65 73 69 7a 65 20 28 28 69 6e 74 28 2a 29 28  gesize ((int(*)(
3eb0: 76 6f 69 64 29 29 61 53 79 73 63 61 6c 6c 5b 32  void))aSyscall[2
3ec0: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  5].pCurrent)..  
3ed0: 7b 20 22 72 65 61 64 6c 69 6e 6b 22 2c 20 20 20  { "readlink",   
3ee0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3ef0: 6c 6c 5f 70 74 72 29 72 65 61 64 6c 69 6e 6b 2c  ll_ptr)readlink,
3f00: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65          0 },.#de
3f10: 66 69 6e 65 20 6f 73 52 65 61 64 6c 69 6e 6b 20  fine osReadlink 
3f20: 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 63 6f 6e  ((ssize_t(*)(con
3f30: 73 74 20 63 68 61 72 2a 2c 63 68 61 72 2a 2c 73  st char*,char*,s
3f40: 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  ize_t))aSyscall[
3f50: 32 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  26].pCurrent)..#
3f60: 65 6e 64 69 66 0a 0a 7d 3b 20 2f 2a 20 45 6e 64  endif..}; /* End
3f70: 20 6f 66 20 74 68 65 20 6f 76 65 72 72 69 64 65   of the override
3f80: 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c  able system call
3f90: 73 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20  s */.../*.** On 
3fa0: 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 63 61  some systems, ca
3fb0: 6c 6c 73 20 74 6f 20 66 63 68 6f 77 6e 28 29 20  lls to fchown() 
3fc0: 77 69 6c 6c 20 74 72 69 67 67 65 72 20 61 20 6d  will trigger a m
3fd0: 65 73 73 61 67 65 20 69 6e 20 61 20 73 65 63 75  essage in a secu
3fe0: 72 69 74 79 0a 2a 2a 20 6c 6f 67 20 69 66 20 74  rity.** log if t
3ff0: 68 65 79 20 63 6f 6d 65 20 66 72 6f 6d 20 6e 6f  hey come from no
4000: 6e 2d 72 6f 6f 74 20 70 72 6f 63 65 73 73 65 73  n-root processes
4010: 2e 20 20 53 6f 20 61 76 6f 69 64 20 63 61 6c 6c  .  So avoid call
4020: 69 6e 67 20 66 63 68 6f 77 6e 28 29 20 69 66 0a  ing fchown() if.
4030: 2a 2a 20 77 65 20 61 72 65 20 6e 6f 74 20 72 75  ** we are not ru
4040: 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74 2e 0a 2a  nning as root..*
4050: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62  /.static int rob
4060: 75 73 74 46 63 68 6f 77 6e 28 69 6e 74 20 66 64  ustFchown(int fd
4070: 2c 20 75 69 64 5f 74 20 75 69 64 2c 20 67 69 64  , uid_t uid, gid
4080: 5f 74 20 67 69 64 29 7b 0a 23 69 66 20 4f 53 5f  _t gid){.#if OS_
4090: 56 58 57 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e  VXWORKS.  return
40a0: 20 30 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75   0;.#else.  retu
40b0: 72 6e 20 6f 73 47 65 74 65 75 69 64 28 29 20 3f  rn osGeteuid() ?
40c0: 20 30 20 3a 20 6f 73 46 63 68 6f 77 6e 28 66 64   0 : osFchown(fd
40d0: 2c 75 69 64 2c 67 69 64 29 3b 0a 23 65 6e 64 69  ,uid,gid);.#endi
40e0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  f.}../*.** This 
40f0: 69 73 20 74 68 65 20 78 53 65 74 53 79 73 74 65  is the xSetSyste
4100: 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64 20 6f  mCall() method o
4110: 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20 66 6f  f sqlite3_vfs fo
4120: 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a 20  r all of the.** 
4130: 22 75 6e 69 78 22 20 56 46 53 65 73 2e 20 20 52  "unix" VFSes.  R
4140: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
4150: 6f 70 6f 6e 20 73 75 63 63 65 73 73 66 75 6c 6c  opon successfull
4160: 79 20 75 70 64 61 74 69 6e 67 20 74 68 65 0a 2a  y updating the.*
4170: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 70 6f  * system call po
4180: 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49 54 45  inter, or SQLITE
4190: 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74 68 65  _NOTFOUND if the
41a0: 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69 67 75  re is no configu
41b0: 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65 6d 20  rable.** system 
41c0: 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61 6d 65  call named zName
41d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
41e0: 75 6e 69 78 53 65 74 53 79 73 74 65 6d 43 61 6c  unixSetSystemCal
41f0: 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  l(.  sqlite3_vfs
4200: 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20 20 20   *pNotUsed,     
4210: 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 70 6f     /* The VFS po
4220: 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73 65 64  inter.  Not used
4230: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
4240: 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *zName,        
4250: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73      /* Name of s
4260: 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 6f 76  ystem call to ov
4270: 65 72 72 69 64 65 20 2a 2f 0a 20 20 73 71 6c 69  erride */.  sqli
4280: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
4290: 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50 6f 69  pNewFunc  /* Poi
42a0: 6e 74 65 72 20 74 6f 20 6e 65 77 20 73 79 73 74  nter to new syst
42b0: 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20 2a 2f  em call value */
42c0: 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  .){.  unsigned i
42d0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d  nt i;.  int rc =
42e0: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
42f0: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
4300: 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b  METER(pNotUsed);
4310: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
4320: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20  ){.    /* If no 
4330: 7a 4e 61 6d 65 20 69 73 20 67 69 76 65 6e 2c 20  zName is given, 
4340: 72 65 73 74 6f 72 65 20 61 6c 6c 20 73 79 73 74  restore all syst
4350: 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 69  em calls to thei
4360: 72 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a  r default.    **
4370: 20 73 65 74 74 69 6e 67 73 20 61 6e 64 20 72 65   settings and re
4380: 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a 2f  turn NULL.    */
4390: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
43a0: 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  _OK;.    for(i=0
43b0: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63  ; i<sizeof(aSysc
43c0: 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73  all)/sizeof(aSys
43d0: 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  call[0]); i++){.
43e0: 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61        if( aSysca
43f0: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 29  ll[i].pDefault )
4400: 7b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61  {.        aSysca
4410: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d  ll[i].pCurrent =
4420: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
4430: 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a 20  fault;.      }. 
4440: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
4450: 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73    /* If zName is
4460: 20 73 70 65 63 69 66 69 65 64 2c 20 6f 70 65 72   specified, oper
4470: 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68 65 20  ate on only the 
4480: 6f 6e 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a  one system call.
4490: 20 20 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64      ** specified
44a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
44b0: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
44c0: 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28  Syscall)/sizeof(
44d0: 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b  aSyscall[0]); i+
44e0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
44f0: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73  rcmp(zName, aSys
4500: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  call[i].zName)==
4510: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
4520: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
4530: 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20  fault==0 ){.    
4540: 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69        aSyscall[i
4550: 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20 61 53 79  ].pDefault = aSy
4560: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
4570: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
4580: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
4590: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  _OK;.        if(
45a0: 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20 70   pNewFunc==0 ) p
45b0: 4e 65 77 46 75 6e 63 20 3d 20 61 53 79 73 63 61  NewFunc = aSysca
45c0: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a  ll[i].pDefault;.
45d0: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
45e0: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 70  [i].pCurrent = p
45f0: 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20 20 20 20  NewFunc;.       
4600: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4610: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
4620: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4630: 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
4640: 20 6f 66 20 61 20 73 79 73 74 65 6d 20 63 61 6c   of a system cal
4650: 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  l.  Return NULL 
4660: 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20  if zName is not 
4670: 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64 20  a.** recognized 
4680: 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65  system call name
4690: 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f 20  .  NULL is also 
46a0: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
46b0: 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20 69  system call.** i
46c0: 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  s currently unde
46d0: 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  fined..*/.static
46e0: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
46f0: 5f 70 74 72 20 75 6e 69 78 47 65 74 53 79 73 74  _ptr unixGetSyst
4700: 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65  emCall(.  sqlite
4710: 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c  3_vfs *pNotUsed,
4720: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
4730: 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  Name.){.  unsign
4740: 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55  ed int i;..  UNU
4750: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e  SED_PARAMETER(pN
4760: 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f 72 28 69  otUsed);.  for(i
4770: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79  =0; i<sizeof(aSy
4780: 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53  scall)/sizeof(aS
4790: 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29  yscall[0]); i++)
47a0: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
47b0: 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c  (zName, aSyscall
47c0: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [i].zName)==0 ) 
47d0: 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b  return aSyscall[
47e0: 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d  i].pCurrent;.  }
47f0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
4800: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
4810: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72   name of the fir
4820: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 61  st system call a
4830: 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20  fter zName.  If 
4840: 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74  zName==NULL.** t
4850: 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 6e  hen return the n
4860: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  ame of the first
4870: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52   system call.  R
4880: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e  eturn NULL if zN
4890: 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61  ame.** is the la
48a0: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f  st system call o
48b0: 72 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f  r if zName is no
48c0: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  t the name of a 
48d0: 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20  valid.** system 
48e0: 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  call..*/.static 
48f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 69 78  const char *unix
4900: 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 28 73  NextSystemCall(s
4910: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c 20 63  qlite3_vfs *p, c
4920: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
4930: 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b  ){.  int i = -1;
4940: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
4950: 45 54 45 52 28 70 29 3b 0a 20 20 69 66 28 20 7a  ETER(p);.  if( z
4960: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72 28  Name ){.    for(
4970: 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
4980: 28 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b  (aSyscall)-1; i+
4990: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
49a0: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73  rcmp(zName, aSys
49b0: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  call[i].zName)==
49c0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  0 ) break;.    }
49d0: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20  .  }.  for(i++; 
49e0: 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73  i<ArraySize(aSys
49f0: 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  call); i++){.   
4a00: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
4a10: 2e 70 43 75 72 72 65 6e 74 21 3d 30 20 29 20 72  .pCurrent!=0 ) r
4a20: 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69  eturn aSyscall[i
4a30: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72  ].zName;.  }.  r
4a40: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
4a50: 2a 20 44 6f 20 6e 6f 74 20 61 63 63 65 70 74 20  * Do not accept 
4a60: 61 6e 79 20 66 69 6c 65 20 64 65 73 63 72 69 70  any file descrip
4a70: 74 6f 72 20 6c 65 73 73 20 74 68 61 6e 20 74 68  tor less than th
4a80: 69 73 20 76 61 6c 75 65 2c 20 69 6e 20 6f 72 64  is value, in ord
4a90: 65 72 20 74 6f 20 61 76 6f 69 64 0a 2a 2a 20 6f  er to avoid.** o
4aa0: 70 65 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20  pening database 
4ab0: 66 69 6c 65 20 75 73 69 6e 67 20 66 69 6c 65 20  file using file 
4ac0: 64 65 73 63 72 69 70 74 6f 72 73 20 74 68 61 74  descriptors that
4ad0: 20 61 72 65 20 63 6f 6d 6d 6f 6e 6c 79 20 75 73   are commonly us
4ae0: 65 64 20 66 6f 72 20 0a 2a 2a 20 73 74 61 6e 64  ed for .** stand
4af0: 61 72 64 20 69 6e 70 75 74 2c 20 6f 75 74 70 75  ard input, outpu
4b00: 74 2c 20 61 6e 64 20 65 72 72 6f 72 2e 0a 2a 2f  t, and error..*/
4b10: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4b20: 4d 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44 45 53  MINIMUM_FILE_DES
4b30: 43 52 49 50 54 4f 52 0a 23 20 64 65 66 69 6e 65  CRIPTOR.# define
4b40: 20 53 51 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d 5f   SQLITE_MINIMUM_
4b50: 46 49 4c 45 5f 44 45 53 43 52 49 50 54 4f 52 20  FILE_DESCRIPTOR 
4b60: 33 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  3.#endif../*.** 
4b70: 49 6e 76 6f 6b 65 20 6f 70 65 6e 28 29 2e 20 20  Invoke open().  
4b80: 44 6f 20 73 6f 20 6d 75 6c 74 69 70 6c 65 20 74  Do so multiple t
4b90: 69 6d 65 73 2c 20 75 6e 74 69 6c 20 69 74 20 65  imes, until it e
4ba0: 69 74 68 65 72 20 73 75 63 63 65 65 64 73 20 6f  ither succeeds o
4bb0: 72 0a 2a 2a 20 66 61 69 6c 73 20 66 6f 72 20 73  r.** fails for s
4bc0: 6f 6d 65 20 72 65 61 73 6f 6e 20 6f 74 68 65 72  ome reason other
4bd0: 20 74 68 61 6e 20 45 49 4e 54 52 2e 0a 2a 2a 0a   than EINTR..**.
4be0: 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 63  ** If the file c
4bf0: 72 65 61 74 69 6f 6e 20 6d 6f 64 65 20 22 6d 22  reation mode "m"
4c00: 20 69 73 20 30 20 74 68 65 6e 20 73 65 74 20 69   is 0 then set i
4c10: 74 20 74 6f 20 74 68 65 20 64 65 66 61 75 6c 74  t to the default
4c20: 20 66 6f 72 0a 2a 2a 20 53 51 4c 69 74 65 2e 20   for.** SQLite. 
4c30: 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20   The default is 
4c40: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
4c50: 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20  ILE_PERMISSIONS 
4c60: 28 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 30 36 34  (normally.** 064
4c70: 34 29 20 61 73 20 6d 6f 64 69 66 69 65 64 20 62  4) as modified b
4c80: 79 20 74 68 65 20 73 79 73 74 65 6d 20 75 6d 61  y the system uma
4c90: 73 6b 2e 20 20 49 66 20 6d 20 69 73 20 6e 6f 74  sk.  If m is not
4ca0: 20 30 2c 20 74 68 65 6e 0a 2a 2a 20 6d 61 6b 65   0, then.** make
4cb0: 20 74 68 65 20 66 69 6c 65 20 63 72 65 61 74 69   the file creati
4cc0: 6f 6e 20 6d 6f 64 65 20 62 65 20 65 78 61 63 74  on mode be exact
4cd0: 6c 79 20 6d 20 69 67 6e 6f 72 69 6e 67 20 74 68  ly m ignoring th
4ce0: 65 20 75 6d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54  e umask..**.** T
4cf0: 68 65 20 6d 20 70 61 72 61 6d 65 74 65 72 20 77  he m parameter w
4d00: 69 6c 6c 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20  ill be non-zero 
4d10: 6f 6e 6c 79 20 77 68 65 6e 20 63 72 65 61 74 69  only when creati
4d20: 6e 67 20 2d 77 61 6c 2c 20 2d 6a 6f 75 72 6e 61  ng -wal, -journa
4d30: 6c 2c 0a 2a 2a 20 61 6e 64 20 2d 73 68 6d 20 66  l,.** and -shm f
4d40: 69 6c 65 73 2e 20 20 57 65 20 77 61 6e 74 20 74  iles.  We want t
4d50: 68 6f 73 65 20 66 69 6c 65 73 20 74 6f 20 68 61  hose files to ha
4d60: 76 65 20 2a 65 78 61 63 74 6c 79 2a 20 74 68 65  ve *exactly* the
4d70: 20 73 61 6d 65 0a 2a 2a 20 70 65 72 6d 69 73 73   same.** permiss
4d80: 69 6f 6e 73 20 61 73 20 74 68 65 69 72 20 6f 72  ions as their or
4d90: 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 2c  iginal database,
4da0: 20 75 6e 61 64 75 6c 74 65 72 61 74 65 64 20 62   unadulterated b
4db0: 79 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a 20  y the umask..** 
4dc0: 49 6e 20 74 68 61 74 20 77 61 79 2c 20 69 66 20  In that way, if 
4dd0: 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
4de0: 69 73 20 2d 72 77 2d 72 77 2d 72 77 20 6f 72 20  is -rw-rw-rw or 
4df0: 2d 72 77 2d 72 77 2d 72 2d 2c 20 61 6e 64 20 61  -rw-rw-r-, and a
4e00: 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
4e10: 63 72 61 73 68 65 73 20 61 6e 64 20 6c 65 61 76  crashes and leav
4e20: 65 73 20 62 65 68 69 6e 64 20 68 6f 74 20 6a 6f  es behind hot jo
4e30: 75 72 6e 61 6c 73 2c 20 74 68 65 6e 20 61 6e 79  urnals, then any
4e40: 0a 2a 2a 20 70 72 6f 63 65 73 73 20 74 68 61 74  .** process that
4e50: 20 69 73 20 61 62 6c 65 20 74 6f 20 77 72 69 74   is able to writ
4e60: 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
4e70: 65 20 77 69 6c 6c 20 61 6c 73 6f 20 62 65 20 61  e will also be a
4e80: 62 6c 65 20 74 6f 0a 2a 2a 20 72 65 63 6f 76 65  ble to.** recove
4e90: 72 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61  r the hot journa
4ea0: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
4eb0: 74 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 63 6f  t robust_open(co
4ec0: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
4ed0: 20 66 2c 20 6d 6f 64 65 5f 74 20 6d 29 7b 0a 20   f, mode_t m){. 
4ee0: 20 69 6e 74 20 66 64 3b 0a 20 20 6d 6f 64 65 5f   int fd;.  mode_
4ef0: 74 20 6d 32 20 3d 20 6d 20 3f 20 6d 20 3a 20 53  t m2 = m ? m : S
4f00: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
4f10: 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 3b 0a  LE_PERMISSIONS;.
4f20: 20 20 77 68 69 6c 65 28 31 29 7b 0a 23 69 66 20    while(1){.#if 
4f30: 64 65 66 69 6e 65 64 28 4f 5f 43 4c 4f 45 58 45  defined(O_CLOEXE
4f40: 43 29 0a 20 20 20 20 66 64 20 3d 20 6f 73 4f 70  C).    fd = osOp
4f50: 65 6e 28 7a 2c 66 7c 4f 5f 43 4c 4f 45 58 45 43  en(z,f|O_CLOEXEC
4f60: 2c 6d 32 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  ,m2);.#else.    
4f70: 66 64 20 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66 2c  fd = osOpen(z,f,
4f80: 6d 32 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  m2);.#endif.    
4f90: 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
4fa0: 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 49 4e    if( errno==EIN
4fb0: 54 52 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  TR ) continue;. 
4fc0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4fd0: 7d 0a 20 20 20 20 69 66 28 20 66 64 3e 3d 53 51  }.    if( fd>=SQ
4fe0: 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d 5f 46 49 4c  LITE_MINIMUM_FIL
4ff0: 45 5f 44 45 53 43 52 49 50 54 4f 52 20 29 20 62  E_DESCRIPTOR ) b
5000: 72 65 61 6b 3b 0a 20 20 20 20 6f 73 43 6c 6f 73  reak;.    osClos
5010: 65 28 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  e(fd);.    sqlit
5020: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41  e3_log(SQLITE_WA
5030: 52 4e 49 4e 47 2c 20 0a 20 20 20 20 20 20 20 20  RNING, .        
5040: 20 20 20 20 20 20 20 20 22 61 74 74 65 6d 70 74          "attempt
5050: 20 74 6f 20 6f 70 65 6e 20 5c 22 25 73 5c 22 20   to open \"%s\" 
5060: 61 73 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  as file descript
5070: 6f 72 20 25 64 22 2c 20 7a 2c 20 66 64 29 3b 0a  or %d", z, fd);.
5080: 20 20 20 20 66 64 20 3d 20 2d 31 3b 0a 20 20 20      fd = -1;.   
5090: 20 69 66 28 20 6f 73 4f 70 65 6e 28 22 2f 64 65   if( osOpen("/de
50a0: 76 2f 6e 75 6c 6c 22 2c 20 66 2c 20 6d 29 3c 30  v/null", f, m)<0
50b0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
50c0: 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20  if( fd>=0 ){.   
50d0: 20 69 66 28 20 6d 21 3d 30 20 29 7b 0a 20 20 20   if( m!=0 ){.   
50e0: 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73     struct stat s
50f0: 74 61 74 62 75 66 3b 0a 20 20 20 20 20 20 69 66  tatbuf;.      if
5100: 28 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73  ( osFstat(fd, &s
5110: 74 61 74 62 75 66 29 3d 3d 30 20 0a 20 20 20 20  tatbuf)==0 .    
5120: 20 20 20 26 26 20 73 74 61 74 62 75 66 2e 73 74     && statbuf.st
5130: 5f 73 69 7a 65 3d 3d 30 0a 20 20 20 20 20 20 20  _size==0.       
5140: 26 26 20 28 73 74 61 74 62 75 66 2e 73 74 5f 6d  && (statbuf.st_m
5150: 6f 64 65 26 30 37 37 37 29 21 3d 6d 20 0a 20 20  ode&0777)!=m .  
5160: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 6f      ){.        o
5170: 73 46 63 68 6d 6f 64 28 66 64 2c 20 6d 29 3b 0a  sFchmod(fd, m);.
5180: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
5190: 66 20 64 65 66 69 6e 65 64 28 46 44 5f 43 4c 4f  f defined(FD_CLO
51a0: 45 58 45 43 29 20 26 26 20 28 21 64 65 66 69 6e  EXEC) && (!defin
51b0: 65 64 28 4f 5f 43 4c 4f 45 58 45 43 29 20 7c 7c  ed(O_CLOEXEC) ||
51c0: 20 4f 5f 43 4c 4f 45 58 45 43 3d 3d 30 29 0a 20   O_CLOEXEC==0). 
51d0: 20 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46     osFcntl(fd, F
51e0: 5f 53 45 54 46 44 2c 20 6f 73 46 63 6e 74 6c 28  _SETFD, osFcntl(
51f0: 66 64 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20  fd, F_GETFD, 0) 
5200: 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23  | FD_CLOEXEC);.#
5210: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75  endif.  }.  retu
5220: 72 6e 20 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn fd;.}../*.** 
5230: 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 73  Helper functions
5240: 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20 72   to obtain and r
5250: 65 6c 69 6e 71 75 69 73 68 20 74 68 65 20 67 6c  elinquish the gl
5260: 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a  obal mutex. The.
5270: 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20  ** global mutex 
5280: 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 74 65  is used to prote
5290: 63 74 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65  ct the unixInode
52a0: 49 6e 66 6f 20 61 6e 64 0a 2a 2a 20 76 78 77 6f  Info and.** vxwo
52b0: 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74  rksFileId object
52c0: 73 20 75 73 65 64 20 62 79 20 74 68 69 73 20 66  s used by this f
52d0: 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63  ile, all of whic
52e0: 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20 73 68 61  h may be .** sha
52f0: 72 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20  red by multiple 
5300: 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46  threads..**.** F
5310: 75 6e 63 74 69 6f 6e 20 75 6e 69 78 4d 75 74 65  unction unixMute
5320: 78 48 65 6c 64 28 29 20 69 73 20 75 73 65 64 20  xHeld() is used 
5330: 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74  to assert() that
5340: 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65   the global mute
5350: 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77 68  x .** is held wh
5360: 65 6e 20 72 65 71 75 69 72 65 64 2e 20 54 68 69  en required. Thi
5370: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
5380: 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20  ly used as part 
5390: 6f 66 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20  of assert() .** 
53a0: 73 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e  statements. e.g.
53b0: 0a 2a 2a 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74  .**.**   unixEnt
53c0: 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20 20  erMutex().**    
53d0: 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
53e0: 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20  exHeld() );.**  
53f0: 20 75 6e 69 78 45 6e 74 65 72 4c 65 61 76 65 28   unixEnterLeave(
5400: 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ).*/.static void
5410: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
5420: 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
5430: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c  _mutex_enter(sql
5440: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
5450: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
5460: 49 43 5f 56 46 53 31 29 29 3b 0a 7d 0a 73 74 61  IC_VFS1));.}.sta
5470: 74 69 63 20 76 6f 69 64 20 75 6e 69 78 4c 65 61  tic void unixLea
5480: 76 65 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20  veMutex(void){. 
5490: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
54a0: 65 61 76 65 28 73 71 6c 69 74 65 33 4d 75 74 65  eave(sqlite3Mute
54b0: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
54c0: 54 45 58 5f 53 54 41 54 49 43 5f 56 46 53 31 29  TEX_STATIC_VFS1)
54d0: 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  );.}.#ifdef SQLI
54e0: 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20  TE_DEBUG.static 
54f0: 69 6e 74 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  int unixMutexHel
5500: 64 28 76 6f 69 64 29 20 7b 0a 20 20 72 65 74 75  d(void) {.  retu
5510: 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  rn sqlite3_mutex
5520: 5f 68 65 6c 64 28 73 71 6c 69 74 65 33 4d 75 74  _held(sqlite3Mut
5530: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
5540: 55 54 45 58 5f 53 54 41 54 49 43 5f 56 46 53 31  UTEX_STATIC_VFS1
5550: 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23  ));.}.#endif...#
5560: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 56  ifdef SQLITE_HAV
5570: 45 5f 4f 53 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a  E_OS_TRACE./*.**
5580: 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e   Helper function
5590: 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f 75   for printing ou
55a0: 74 20 74 72 61 63 65 20 69 6e 66 6f 72 6d 61 74  t trace informat
55b0: 69 6f 6e 20 66 72 6f 6d 20 64 65 62 75 67 67 69  ion from debuggi
55c0: 6e 67 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e 20  ng.** binaries. 
55d0: 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68 65  This returns the
55e0: 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e   string represen
55f0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75  tation of the su
5600: 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65  pplied.** intege
5610: 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a  r lock-type..*/.
5620: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
5630: 72 20 2a 61 7a 46 69 6c 65 4c 6f 63 6b 28 69 6e  r *azFileLock(in
5640: 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20  t eFileLock){.  
5650: 73 77 69 74 63 68 28 20 65 46 69 6c 65 4c 6f 63  switch( eFileLoc
5660: 6b 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4e 4f  k ){.    case NO
5670: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e  _LOCK: return "N
5680: 4f 4e 45 22 3b 0a 20 20 20 20 63 61 73 65 20 53  ONE";.    case S
5690: 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75  HARED_LOCK: retu
56a0: 72 6e 20 22 53 48 41 52 45 44 22 3b 0a 20 20 20  rn "SHARED";.   
56b0: 20 63 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c   case RESERVED_L
56c0: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 52 45 53  OCK: return "RES
56d0: 45 52 56 45 44 22 3b 0a 20 20 20 20 63 61 73 65  ERVED";.    case
56e0: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72   PENDING_LOCK: r
56f0: 65 74 75 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b  eturn "PENDING";
5700: 0a 20 20 20 20 63 61 73 65 20 45 58 43 4c 55 53  .    case EXCLUS
5710: 49 56 45 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e  IVE_LOCK: return
5720: 20 22 45 58 43 4c 55 53 49 56 45 22 3b 0a 20 20   "EXCLUSIVE";.  
5730: 7d 0a 20 20 72 65 74 75 72 6e 20 22 45 52 52 4f  }.  return "ERRO
5740: 52 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  R";.}.#endif..#i
5750: 66 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  fdef SQLITE_LOCK
5760: 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69  _TRACE./*.** Pri
5770: 6e 74 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69  nt out informati
5780: 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63  on about all loc
5790: 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e  king operations.
57a0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
57b0: 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
57c0: 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20  troubleshooting 
57d0: 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68  locks on multith
57e0: 72 65 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f  readed.** platfo
57f0: 72 6d 73 2e 20 20 45 6e 61 62 6c 65 20 62 79 20  rms.  Enable by 
5800: 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 74  compiling with t
5810: 68 65 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b  he -DSQLITE_LOCK
5820: 5f 54 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e  _TRACE.** comman
5830: 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e  d-line option on
5840: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20   the compiler.  
5850: 54 68 69 73 20 63 6f 64 65 20 69 73 20 6e 6f 72  This code is nor
5860: 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20  mally.** turned 
5870: 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  off..*/.static i
5880: 6e 74 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74  nt lockTrace(int
5890: 20 66 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72   fd, int op, str
58a0: 75 63 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20  uct flock *p){. 
58b0: 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20   char *zOpName, 
58c0: 2a 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b  *zType;.  int s;
58d0: 0a 20 20 69 6e 74 20 73 61 76 65 64 45 72 72 6e  .  int savedErrn
58e0: 6f 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47  o;.  if( op==F_G
58f0: 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e  ETLK ){.    zOpN
5900: 61 6d 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20  ame = "GETLK";. 
5910: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46   }else if( op==F
5920: 5f 53 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f  _SETLK ){.    zO
5930: 70 4e 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b  pName = "SETLK";
5940: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20  .  }else{.    s 
5950: 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70  = osFcntl(fd, op
5960: 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , p);.    sqlite
5970: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63  3DebugPrintf("fc
5980: 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20 25  ntl unknown %d %
5990: 64 20 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c  d %d\n", fd, op,
59a0: 20 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   s);.    return 
59b0: 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  s;.  }.  if( p->
59c0: 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20  l_type==F_RDLCK 
59d0: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22  ){.    zType = "
59e0: 52 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20  RDLCK";.  }else 
59f0: 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  if( p->l_type==F
5a00: 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54  _WRLCK ){.    zT
5a10: 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20  ype = "WRLCK";. 
5a20: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f   }else if( p->l_
5a30: 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  type==F_UNLCK ){
5a40: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e  .    zType = "UN
5a50: 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  LCK";.  }else{. 
5a60: 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a     assert( 0 );.
5a70: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
5a80: 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b 5f  >l_whence==SEEK_
5a90: 53 45 54 20 29 3b 0a 20 20 73 20 3d 20 6f 73 46  SET );.  s = osF
5aa0: 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b  cntl(fd, op, p);
5ab0: 0a 20 20 73 61 76 65 64 45 72 72 6e 6f 20 3d 20  .  savedErrno = 
5ac0: 65 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33  errno;.  sqlite3
5ad0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e  DebugPrintf("fcn
5ae0: 74 6c 20 25 64 20 25 64 20 25 73 20 25 73 20 25  tl %d %d %s %s %
5af0: 64 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20  d %d %d %d\n",. 
5b00: 20 20 20 20 74 68 72 65 61 64 69 64 2c 20 66 64      threadid, fd
5b10: 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65  , zOpName, zType
5b20: 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72  , (int)p->l_star
5b30: 74 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e  t, (int)p->l_len
5b40: 2c 0a 20 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c  ,.     (int)p->l
5b50: 5f 70 69 64 2c 20 73 29 3b 0a 20 20 69 66 28 20  _pid, s);.  if( 
5b60: 73 3d 3d 28 2d 31 29 20 26 26 20 6f 70 3d 3d 46  s==(-1) && op==F
5b70: 5f 53 45 54 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f  _SETLK && (p->l_
5b80: 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c  type==F_RDLCK ||
5b90: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52   p->l_type==F_WR
5ba0: 4c 43 4b 29 20 29 7b 0a 20 20 20 20 73 74 72 75  LCK) ){.    stru
5bb0: 63 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20  ct flock l2;.   
5bc0: 20 6c 32 20 3d 20 2a 70 3b 0a 20 20 20 20 6f 73   l2 = *p;.    os
5bd0: 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c  Fcntl(fd, F_GETL
5be0: 4b 2c 20 26 6c 32 29 3b 0a 20 20 20 20 69 66 28  K, &l2);.    if(
5bf0: 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44   l2.l_type==F_RD
5c00: 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79  LCK ){.      zTy
5c10: 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20  pe = "RDLCK";.  
5c20: 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c    }else if( l2.l
5c30: 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  _type==F_WRLCK )
5c40: 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  {.      zType = 
5c50: 22 57 52 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c  "WRLCK";.    }el
5c60: 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65  se if( l2.l_type
5c70: 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  ==F_UNLCK ){.   
5c80: 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43     zType = "UNLC
5c90: 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  K";.    }else{. 
5ca0: 20 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29       assert( 0 )
5cb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
5cc0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
5cd0: 66 63 6e 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65  fcntl-failure-re
5ce0: 61 73 6f 6e 3a 20 25 73 20 25 64 20 25 64 20 25  ason: %s %d %d %
5cf0: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 7a 54 79  d\n",.       zTy
5d00: 70 65 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74  pe, (int)l2.l_st
5d10: 61 72 74 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c  art, (int)l2.l_l
5d20: 65 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69  en, (int)l2.l_pi
5d30: 64 29 3b 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20  d);.  }.  errno 
5d40: 3d 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20  = savedErrno;.  
5d50: 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 23 75 6e 64  return s;.}.#und
5d60: 65 66 20 6f 73 46 63 6e 74 6c 0a 23 64 65 66 69  ef osFcntl.#defi
5d70: 6e 65 20 6f 73 46 63 6e 74 6c 20 6c 6f 63 6b 54  ne osFcntl lockT
5d80: 72 61 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  race.#endif /* S
5d90: 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45  QLITE_LOCK_TRACE
5da0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79   */../*.** Retry
5db0: 20 66 74 72 75 6e 63 61 74 65 28 29 20 63 61 6c   ftruncate() cal
5dc0: 6c 73 20 74 68 61 74 20 66 61 69 6c 20 64 75 65  ls that fail due
5dd0: 20 74 6f 20 45 49 4e 54 52 0a 2a 2a 0a 2a 2a 20   to EINTR.**.** 
5de0: 41 6c 6c 20 63 61 6c 6c 73 20 74 6f 20 66 74 72  All calls to ftr
5df0: 75 6e 63 61 74 65 28 29 20 77 69 74 68 69 6e 20  uncate() within 
5e00: 74 68 69 73 20 66 69 6c 65 20 73 68 6f 75 6c 64  this file should
5e10: 20 62 65 20 6d 61 64 65 20 74 68 72 6f 75 67 68   be made through
5e20: 0a 2a 2a 20 74 68 69 73 20 77 72 61 70 70 65 72  .** this wrapper
5e30: 2e 20 20 4f 6e 20 74 68 65 20 41 6e 64 72 6f 69  .  On the Androi
5e40: 64 20 70 6c 61 74 66 6f 72 6d 2c 20 62 79 70 61  d platform, bypa
5e50: 73 73 69 6e 67 20 74 68 65 20 6c 6f 67 69 63 20  ssing the logic 
5e60: 62 65 6c 6f 77 0a 2a 2a 20 63 6f 75 6c 64 20 6c  below.** could l
5e70: 65 61 64 20 74 6f 20 61 20 63 6f 72 72 75 70 74  ead to a corrupt
5e80: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74   database..*/.st
5e90: 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f  atic int robust_
5ea0: 66 74 72 75 6e 63 61 74 65 28 69 6e 74 20 68 2c  ftruncate(int h,
5eb0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
5ec0: 7a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 23 69  z){.  int rc;.#i
5ed0: 66 64 65 66 20 5f 5f 41 4e 44 52 4f 49 44 5f 5f  fdef __ANDROID__
5ee0: 0a 20 20 2f 2a 20 4f 6e 20 41 6e 64 72 6f 69 64  .  /* On Android
5ef0: 2c 20 66 74 72 75 6e 63 61 74 65 28 29 20 61 6c  , ftruncate() al
5f00: 77 61 79 73 20 75 73 65 73 20 33 32 2d 62 69 74  ways uses 32-bit
5f10: 20 6f 66 66 73 65 74 73 2c 20 65 76 65 6e 20 69   offsets, even i
5f20: 66 20 0a 20 20 2a 2a 20 5f 46 49 4c 45 5f 4f 46  f .  ** _FILE_OF
5f30: 46 53 45 54 5f 42 49 54 53 3d 36 34 20 69 73 20  FSET_BITS=64 is 
5f40: 64 65 66 69 6e 65 64 2e 20 54 68 69 73 20 6d 65  defined. This me
5f50: 61 6e 73 20 69 74 20 69 73 20 75 6e 73 61 66 65  ans it is unsafe
5f60: 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 0a 20   to attempt to. 
5f70: 20 2a 2a 20 74 72 75 6e 63 61 74 65 20 61 20 66   ** truncate a f
5f80: 69 6c 65 20 74 6f 20 61 6e 79 20 73 69 7a 65 20  ile to any size 
5f90: 6c 61 72 67 65 72 20 74 68 61 6e 20 32 47 69 42  larger than 2GiB
5fa0: 2e 20 53 69 6c 65 6e 74 6c 79 20 69 67 6e 6f 72  . Silently ignor
5fb0: 65 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20  e any.  ** such 
5fc0: 61 74 74 65 6d 70 74 73 2e 20 20 2a 2f 0a 20 20  attempts.  */.  
5fd0: 69 66 28 20 73 7a 3e 28 73 71 6c 69 74 65 33 5f  if( sz>(sqlite3_
5fe0: 69 6e 74 36 34 29 30 78 37 46 46 46 46 46 46 46  int64)0x7FFFFFFF
5ff0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
6000: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 0a  ITE_OK;.  }else.
6010: 23 65 6e 64 69 66 0a 20 20 64 6f 7b 20 72 63 20  #endif.  do{ rc 
6020: 3d 20 6f 73 46 74 72 75 6e 63 61 74 65 28 68 2c  = osFtruncate(h,
6030: 73 7a 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c  sz); }while( rc<
6040: 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
6050: 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  R );.  return rc
6060: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
6070: 72 6f 75 74 69 6e 65 20 74 72 61 6e 73 6c 61 74  routine translat
6080: 65 73 20 61 20 73 74 61 6e 64 61 72 64 20 50 4f  es a standard PO
6090: 53 49 58 20 65 72 72 6e 6f 20 63 6f 64 65 20 69  SIX errno code i
60a0: 6e 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a  nto something.**
60b0: 20 75 73 65 66 75 6c 20 74 6f 20 74 68 65 20 63   useful to the c
60c0: 6c 69 65 6e 74 73 20 6f 66 20 74 68 65 20 73 71  lients of the sq
60d0: 6c 69 74 65 33 20 66 75 6e 63 74 69 6f 6e 73 2e  lite3 functions.
60e0: 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20    Specifically, 
60f0: 69 74 20 69 73 0a 2a 2a 20 69 6e 74 65 6e 64 65  it is.** intende
6100: 64 20 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 61  d to translate a
6110: 20 76 61 72 69 65 74 79 20 6f 66 20 22 74 72 79   variety of "try
6120: 20 61 67 61 69 6e 22 20 65 72 72 6f 72 73 20 69   again" errors i
6130: 6e 74 6f 20 53 51 4c 49 54 45 5f 42 55 53 59 0a  nto SQLITE_BUSY.
6140: 2a 2a 20 61 6e 64 20 61 20 76 61 72 69 65 74 79  ** and a variety
6150: 20 6f 66 20 22 70 6c 65 61 73 65 20 63 6c 6f 73   of "please clos
6160: 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
6170: 69 70 74 6f 72 20 4e 4f 57 22 20 65 72 72 6f 72  iptor NOW" error
6180: 73 20 69 6e 74 6f 20 0a 2a 2a 20 53 51 4c 49 54  s into .** SQLIT
6190: 45 5f 49 4f 45 52 52 0a 2a 2a 20 0a 2a 2a 20 45  E_IOERR.** .** E
61a0: 72 72 6f 72 73 20 64 75 72 69 6e 67 20 69 6e 69  rrors during ini
61b0: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 6c  tialization of l
61c0: 6f 63 6b 73 2c 20 6f 72 20 66 69 6c 65 20 73 79  ocks, or file sy
61d0: 73 74 65 6d 20 73 75 70 70 6f 72 74 20 66 6f 72  stem support for
61e0: 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 73 68 6f 75 6c   locks,.** shoul
61f0: 64 20 68 61 6e 64 6c 65 20 45 4e 4f 4c 43 4b 2c  d handle ENOLCK,
6200: 20 45 4e 4f 54 53 55 50 2c 20 45 4f 50 4e 4f 54   ENOTSUP, EOPNOT
6210: 53 55 50 50 20 73 65 70 61 72 61 74 65 6c 79 2e  SUPP separately.
6220: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
6230: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
6240: 73 69 78 45 72 72 6f 72 28 69 6e 74 20 70 6f 73  sixError(int pos
6250: 69 78 45 72 72 6f 72 2c 20 69 6e 74 20 73 71 6c  ixError, int sql
6260: 69 74 65 49 4f 45 72 72 29 20 7b 0a 20 20 61 73  iteIOErr) {.  as
6270: 73 65 72 74 28 20 28 73 71 6c 69 74 65 49 4f 45  sert( (sqliteIOE
6280: 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  rr == SQLITE_IOE
6290: 52 52 5f 4c 4f 43 4b 29 20 7c 7c 20 0a 20 20 20  RR_LOCK) || .   
62a0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f         (sqliteIO
62b0: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
62c0: 45 52 52 5f 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a  ERR_UNLOCK) || .
62d0: 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
62e0: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
62f0: 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 20 7c  _IOERR_RDLOCK) |
6300: 7c 0a 20 20 20 20 20 20 20 20 20 20 28 73 71 6c  |.          (sql
6310: 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49  iteIOErr == SQLI
6320: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
6330: 53 45 52 56 45 44 4c 4f 43 4b 29 20 29 3b 0a 20  SERVEDLOCK) );. 
6340: 20 73 77 69 74 63 68 20 28 70 6f 73 69 78 45 72   switch (posixEr
6350: 72 6f 72 29 20 7b 0a 20 20 63 61 73 65 20 45 41  ror) {.  case EA
6360: 43 43 45 53 3a 20 0a 20 20 63 61 73 65 20 45 41  CCES: .  case EA
6370: 47 41 49 4e 3a 0a 20 20 63 61 73 65 20 45 54 49  GAIN:.  case ETI
6380: 4d 45 44 4f 55 54 3a 0a 20 20 63 61 73 65 20 45  MEDOUT:.  case E
6390: 42 55 53 59 3a 0a 20 20 63 61 73 65 20 45 49 4e  BUSY:.  case EIN
63a0: 54 52 3a 0a 20 20 63 61 73 65 20 45 4e 4f 4c 43  TR:.  case ENOLC
63b0: 4b 3a 20 20 0a 20 20 20 20 2f 2a 20 72 61 6e 64  K:  .    /* rand
63c0: 6f 6d 20 4e 46 53 20 72 65 74 72 79 20 65 72 72  om NFS retry err
63d0: 6f 72 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e  or, unless durin
63e0: 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75  g file system su
63f0: 70 70 6f 72 74 20 0a 20 20 20 20 20 2a 20 69 6e  pport .     * in
6400: 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20  trospection, in 
6410: 77 68 69 63 68 20 69 74 20 61 63 74 75 61 6c 6c  which it actuall
6420: 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20  y means what it 
6430: 73 61 79 73 20 2a 2f 0a 20 20 20 20 72 65 74 75  says */.    retu
6440: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
6450: 20 20 20 20 0a 20 20 63 61 73 65 20 45 50 45 52      .  case EPER
6460: 4d 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53  M: .    return S
6470: 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20  QLITE_PERM;.    
6480: 0a 20 20 64 65 66 61 75 6c 74 3a 20 0a 20 20 20  .  default: .   
6490: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 49 4f   return sqliteIO
64a0: 45 72 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 2a  Err;.  }.}.../**
64b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
64c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
64d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
64e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
64f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
6500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
6510: 42 65 67 69 6e 20 55 6e 69 71 75 65 20 46 69 6c  Begin Unique Fil
6520: 65 20 49 44 20 55 74 69 6c 69 74 79 20 55 73 65  e ID Utility Use
6530: 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a  d By VxWorks ***
6540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
6550: 2a 2a 20 4f 6e 20 6d 6f 73 74 20 76 65 72 73 69  ** On most versi
6560: 6f 6e 73 20 6f 66 20 75 6e 69 78 2c 20 77 65 20  ons of unix, we 
6570: 63 61 6e 20 67 65 74 20 61 20 75 6e 69 71 75 65  can get a unique
6580: 20 49 44 20 66 6f 72 20 61 20 66 69 6c 65 20 62   ID for a file b
6590: 79 20 63 6f 6e 63 61 74 65 6e 61 74 69 6e 67 0a  y concatenating.
65a0: 2a 2a 20 74 68 65 20 64 65 76 69 63 65 20 6e 75  ** the device nu
65b0: 6d 62 65 72 20 61 6e 64 20 74 68 65 20 69 6e 6f  mber and the ino
65c0: 64 65 20 6e 75 6d 62 65 72 2e 20 20 42 75 74 20  de number.  But 
65d0: 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f  this does not wo
65e0: 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  rk on VxWorks..*
65f0: 2a 20 4f 6e 20 56 78 57 6f 72 6b 73 2c 20 61 20  * On VxWorks, a 
6600: 75 6e 69 71 75 65 20 66 69 6c 65 20 69 64 20 6d  unique file id m
6610: 75 73 74 20 62 65 20 62 61 73 65 64 20 6f 6e 20  ust be based on 
6620: 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69  the canonical fi
6630: 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  lename..**.** A 
6640: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e  pointer to an in
6650: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
6660: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
6670: 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 73  e can be used as
6680: 20 61 0a 2a 2a 20 75 6e 69 71 75 65 20 66 69 6c   a.** unique fil
6690: 65 20 49 44 20 69 6e 20 56 78 57 6f 72 6b 73 2e  e ID in VxWorks.
66a0: 20 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20    Each instance 
66b0: 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
66c0: 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20  e contains.** a 
66d0: 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61 6e 6f  copy of the cano
66e0: 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 20  nical filename. 
66f0: 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61   There is also a
6700: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
6710: 2e 20 20 0a 2a 2a 20 54 68 65 20 73 74 72 75 63  .  .** The struc
6720: 74 75 72 65 20 69 73 20 72 65 63 6c 61 69 6d 65  ture is reclaime
6730: 64 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  d when the numbe
6740: 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f  r of pointers to
6750: 20 69 74 20 64 72 6f 70 73 20 74 6f 0a 2a 2a 20   it drops to.** 
6760: 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  zero..**.** Ther
6770: 65 20 61 72 65 20 6e 65 76 65 72 20 76 65 72 79  e are never very
6780: 20 6d 61 6e 79 20 66 69 6c 65 73 20 6f 70 65 6e   many files open
6790: 20 61 74 20 6f 6e 65 20 74 69 6d 65 20 61 6e 64   at one time and
67a0: 20 6c 6f 6f 6b 75 70 73 20 61 72 65 20 6e 6f 74   lookups are not
67b0: 0a 2a 2a 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  .** a performanc
67c0: 65 2d 63 72 69 74 69 63 61 6c 20 70 61 74 68 2c  e-critical path,
67d0: 20 73 6f 20 69 74 20 69 73 20 73 75 66 66 69 63   so it is suffic
67e0: 69 65 6e 74 20 74 6f 20 70 75 74 20 74 68 65 73  ient to put thes
67f0: 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20  e.** structures 
6800: 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74  on a linked list
6810: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 76 78 77 6f  ..*/.struct vxwo
6820: 72 6b 73 46 69 6c 65 49 64 20 7b 0a 20 20 73 74  rksFileId {.  st
6830: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
6840: 49 64 20 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e  Id *pNext;  /* N
6850: 65 78 74 20 69 6e 20 61 20 6c 69 73 74 20 6f 66  ext in a list of
6860: 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20 20 69   them all */.  i
6870: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
6880: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6890: 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  Number of refere
68a0: 6e 63 65 73 20 74 6f 20 74 68 69 73 20 6f 6e 65  nces to this one
68b0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b   */.  int nName;
68c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68d0: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
68e0: 20 74 68 65 20 7a 43 61 6e 6f 6e 69 63 61 6c 4e   the zCanonicalN
68f0: 61 6d 65 5b 5d 20 73 74 72 69 6e 67 20 2a 2f 0a  ame[] string */.
6900: 20 20 63 68 61 72 20 2a 7a 43 61 6e 6f 6e 69 63    char *zCanonic
6910: 61 6c 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  alName;         
6920: 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c 20 66 69 6c  /* Canonical fil
6930: 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66  ename */.};..#if
6940: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 20 0a   OS_VXWORKS./* .
6950: 2a 2a 20 41 6c 6c 20 75 6e 69 71 75 65 20 66 69  ** All unique fi
6960: 6c 65 6e 61 6d 65 73 20 61 72 65 20 68 65 6c 64  lenames are held
6970: 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73   on a linked lis
6980: 74 20 68 65 61 64 65 64 20 62 79 20 74 68 69 73  t headed by this
6990: 0a 2a 2a 20 76 61 72 69 61 62 6c 65 3a 0a 2a 2f  .** variable:.*/
69a0: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 76  .static struct v
69b0: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78  xworksFileId *vx
69c0: 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20  worksFileList = 
69d0: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 70 6c 69  0;../*.** Simpli
69e0: 66 79 20 61 20 66 69 6c 65 6e 61 6d 65 20 69 6e  fy a filename in
69f0: 74 6f 20 69 74 73 20 63 61 6e 6f 6e 69 63 61 6c  to its canonical
6a00: 20 66 6f 72 6d 0a 2a 2a 20 62 79 20 6d 61 6b 69   form.** by maki
6a10: 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
6a20: 20 63 68 61 6e 67 65 73 3a 0a 2a 2a 0a 2a 2a 20   changes:.**.** 
6a30: 20 2a 20 72 65 6d 6f 76 69 6e 67 20 61 6e 79 20   * removing any 
6a40: 74 72 61 69 6c 69 6e 67 20 61 6e 64 20 64 75 70  trailing and dup
6a50: 6c 69 63 61 74 65 20 2f 0a 2a 2a 20 20 2a 20 63  licate /.**  * c
6a60: 6f 6e 76 65 72 74 20 2f 2e 2f 20 69 6e 74 6f 20  onvert /./ into 
6a70: 6a 75 73 74 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e  just /.**  * con
6a80: 76 65 72 74 20 2f 41 2f 2e 2e 2f 20 77 68 65 72  vert /A/../ wher
6a90: 65 20 41 20 69 73 20 61 6e 79 20 73 69 6d 70 6c  e A is any simpl
6aa0: 65 20 6e 61 6d 65 20 69 6e 74 6f 20 6a 75 73 74  e name into just
6ab0: 20 2f 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 73   /.**.** Changes
6ac0: 20 61 72 65 20 6d 61 64 65 20 69 6e 2d 70 6c 61   are made in-pla
6ad0: 63 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ce.  Return the 
6ae0: 6e 65 77 20 6e 61 6d 65 20 6c 65 6e 67 74 68 2e  new name length.
6af0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69  .**.** The origi
6b00: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  nal filename is 
6b10: 69 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20 20 52  in z[0..n-1].  R
6b20: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
6b30: 20 6f 66 0a 2a 2a 20 63 68 61 72 61 63 74 65 72   of.** character
6b40: 73 20 69 6e 20 74 68 65 20 73 69 6d 70 6c 69 66  s in the simplif
6b50: 69 65 64 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61  ied name..*/.sta
6b60: 74 69 63 20 69 6e 74 20 76 78 77 6f 72 6b 73 53  tic int vxworksS
6b70: 69 6d 70 6c 69 66 79 4e 61 6d 65 28 63 68 61 72  implifyName(char
6b80: 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69   *z, int n){.  i
6b90: 6e 74 20 69 2c 20 6a 3b 0a 20 20 77 68 69 6c 65  nt i, j;.  while
6ba0: 28 20 6e 3e 31 20 26 26 20 7a 5b 6e 2d 31 5d 3d  ( n>1 && z[n-1]=
6bb0: 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20  ='/' ){ n--; }. 
6bc0: 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b   for(i=j=0; i<n;
6bd0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a   i++){.    if( z
6be0: 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [i]=='/' ){.    
6bf0: 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2f    if( z[i+1]=='/
6c00: 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ' ) continue;.  
6c10: 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d      if( z[i+1]==
6c20: 27 2e 27 20 26 26 20 69 2b 32 3c 6e 20 26 26 20  '.' && i+2<n && 
6c30: 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20  z[i+2]=='/' ){. 
6c40: 20 20 20 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20         i += 1;. 
6c50: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
6c60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
6c70: 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26  f( z[i+1]=='.' &
6c80: 26 20 69 2b 33 3c 6e 20 26 26 20 7a 5b 69 2b 32  & i+3<n && z[i+2
6c90: 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b 69 2b 33 5d  ]=='.' && z[i+3]
6ca0: 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20  =='/' ){.       
6cb0: 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a   while( j>0 && z
6cc0: 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d  [j-1]!='/' ){ j-
6cd0: 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28  -; }.        if(
6ce0: 20 6a 3e 30 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20   j>0 ){ j--; }. 
6cf0: 20 20 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20         i += 2;. 
6d00: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
6d10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6d20: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d     z[j++] = z[i]
6d30: 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30  ;.  }.  z[j] = 0
6d40: 3b 0a 20 20 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a  ;.  return j;.}.
6d50: 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 75 6e  ./*.** Find a un
6d60: 69 71 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72  ique file ID for
6d70: 20 74 68 65 20 67 69 76 65 6e 20 61 62 73 6f 6c   the given absol
6d80: 75 74 65 20 70 61 74 68 6e 61 6d 65 2e 20 20 52  ute pathname.  R
6d90: 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
6da0: 65 72 20 74 6f 20 74 68 65 20 76 78 77 6f 72 6b  er to the vxwork
6db0: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20  sFileId object. 
6dc0: 20 54 68 69 73 20 70 6f 69 6e 74 65 72 20 69 73   This pointer is
6dd0: 20 74 68 65 20 75 6e 69 71 75 65 0a 2a 2a 20 66   the unique.** f
6de0: 69 6c 65 20 49 44 2e 0a 2a 2a 0a 2a 2a 20 54 68  ile ID..**.** Th
6df0: 65 20 6e 52 65 66 20 66 69 65 6c 64 20 6f 66 20  e nRef field of 
6e00: 74 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  the vxworksFileI
6e10: 64 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 63 72  d object is incr
6e20: 65 6d 65 6e 74 65 64 20 62 65 66 6f 72 65 0a 2a  emented before.*
6e30: 2a 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20  * the object is 
6e40: 72 65 74 75 72 6e 65 64 2e 20 20 41 20 6e 65 77  returned.  A new
6e50: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f   vxworksFileId o
6e60: 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64  bject is created
6e70: 0a 2a 2a 20 61 6e 64 20 61 64 64 65 64 20 74 6f  .** and added to
6e80: 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74   the global list
6e90: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
6ea0: 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79  *.** If a memory
6eb0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
6ec0: 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
6ed0: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63   NULL..*/.static
6ee0: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
6ef0: 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69  ileId *vxworksFi
6f00: 6e 64 46 69 6c 65 49 64 28 63 6f 6e 73 74 20 63  ndFileId(const c
6f10: 68 61 72 20 2a 7a 41 62 73 6f 6c 75 74 65 4e 61  har *zAbsoluteNa
6f20: 6d 65 29 7b 0a 20 20 73 74 72 75 63 74 20 76 78  me){.  struct vx
6f30: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65  worksFileId *pNe
6f40: 77 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65  w;         /* se
6f50: 61 72 63 68 20 6b 65 79 20 61 6e 64 20 6e 65 77  arch key and new
6f60: 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 73 74   file ID */.  st
6f70: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
6f80: 49 64 20 2a 70 43 61 6e 64 69 64 61 74 65 3b 20  Id *pCandidate; 
6f90: 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
6fa0: 20 6f 76 65 72 20 65 78 69 73 74 69 6e 67 20 66   over existing f
6fb0: 69 6c 65 20 49 44 73 20 2a 2f 0a 20 20 69 6e 74  ile IDs */.  int
6fc0: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
6fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6fe0: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 41   /* Length of zA
6ff0: 62 73 6f 6c 75 74 65 4e 61 6d 65 20 73 74 72 69  bsoluteName stri
7000: 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ng */..  assert(
7010: 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 5b 30   zAbsoluteName[0
7020: 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20 6e 20 3d 20  ]=='/' );.  n = 
7030: 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 41 62 73  (int)strlen(zAbs
7040: 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a 20 20 70 4e  oluteName);.  pN
7050: 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ew = sqlite3_mal
7060: 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70  loc64( sizeof(*p
7070: 4e 65 77 29 20 2b 20 28 6e 2b 31 29 20 29 3b 0a  New) + (n+1) );.
7080: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
7090: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
70a0: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
70b0: 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b   = (char*)&pNew[
70c0: 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65  1];.  memcpy(pNe
70d0: 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  w->zCanonicalNam
70e0: 65 2c 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65  e, zAbsoluteName
70f0: 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20 76 78  , n+1);.  n = vx
7100: 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d  worksSimplifyNam
7110: 65 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63  e(pNew->zCanonic
7120: 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20 20 2f  alName, n);..  /
7130: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20  * Search for an 
7140: 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20 74  existing entry t
7150: 68 61 74 20 6d 61 74 63 68 69 6e 67 20 74 68 65  hat matching the
7160: 20 63 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65 2e   canonical name.
7170: 0a 20 20 2a 2a 20 49 66 20 66 6f 75 6e 64 2c 20  .  ** If found, 
7180: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  increment the re
7190: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 61 6e  ference count an
71a0: 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
71b0: 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65  er to.  ** the e
71c0: 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44 2e  xisting file ID.
71d0: 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65  .  */.  unixEnte
71e0: 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 28  rMutex();.  for(
71f0: 70 43 61 6e 64 69 64 61 74 65 3d 76 78 77 6f 72  pCandidate=vxwor
7200: 6b 73 46 69 6c 65 4c 69 73 74 3b 20 70 43 61 6e  ksFileList; pCan
7210: 64 69 64 61 74 65 3b 20 70 43 61 6e 64 69 64 61  didate; pCandida
7220: 74 65 3d 70 43 61 6e 64 69 64 61 74 65 2d 3e 70  te=pCandidate->p
7230: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
7240: 43 61 6e 64 69 64 61 74 65 2d 3e 6e 4e 61 6d 65  Candidate->nName
7250: 3d 3d 6e 20 0a 20 20 20 20 20 26 26 20 6d 65 6d  ==n .     && mem
7260: 63 6d 70 28 70 43 61 6e 64 69 64 61 74 65 2d 3e  cmp(pCandidate->
7270: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20  zCanonicalName, 
7280: 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  pNew->zCanonical
7290: 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20 20 20  Name, n)==0.    
72a0: 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65  ){.       sqlite
72b0: 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  3_free(pNew);.  
72c0: 20 20 20 20 20 70 43 61 6e 64 69 64 61 74 65 2d       pCandidate-
72d0: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRef++;.       
72e0: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
72f0: 3b 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  ;.       return 
7300: 70 43 61 6e 64 69 64 61 74 65 3b 0a 20 20 20 20  pCandidate;.    
7310: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d  }.  }..  /* No m
7320: 61 74 63 68 20 77 61 73 20 66 6f 75 6e 64 2e 20  atch was found. 
7330: 20 57 65 20 77 69 6c 6c 20 6d 61 6b 65 20 61 20   We will make a 
7340: 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20  new file ID */. 
7350: 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b   pNew->nRef = 1;
7360: 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65 20 3d  .  pNew->nName =
7370: 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78   n;.  pNew->pNex
7380: 74 20 3d 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c  t = vxworksFileL
7390: 69 73 74 3b 0a 20 20 76 78 77 6f 72 6b 73 46 69  ist;.  vxworksFi
73a0: 6c 65 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20  leList = pNew;. 
73b0: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
73c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  );.  return pNew
73d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65  ;.}../*.** Decre
73e0: 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
73f0: 63 65 20 63 6f 75 6e 74 20 6f 6e 20 61 20 76 78  ce count on a vx
7400: 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65  worksFileId obje
7410: 63 74 2e 20 20 46 72 65 65 0a 2a 2a 20 74 68 65  ct.  Free.** the
7420: 20 6f 62 6a 65 63 74 20 77 68 65 6e 20 74 68 65   object when the
7430: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
7440: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 0a 2a   reaches zero..*
7450: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 78  /.static void vx
7460: 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65  worksReleaseFile
7470: 49 64 28 73 74 72 75 63 74 20 76 78 77 6f 72 6b  Id(struct vxwork
7480: 73 46 69 6c 65 49 64 20 2a 70 49 64 29 7b 0a 20  sFileId *pId){. 
7490: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
74a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  );.  assert( pId
74b0: 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 49  ->nRef>0 );.  pI
74c0: 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  d->nRef--;.  if(
74d0: 20 70 49 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pId->nRef==0 ){
74e0: 0a 20 20 20 20 73 74 72 75 63 74 20 76 78 77 6f  .    struct vxwo
74f0: 72 6b 73 46 69 6c 65 49 64 20 2a 2a 70 70 3b 0a  rksFileId **pp;.
7500: 20 20 20 20 66 6f 72 28 70 70 3d 26 76 78 77 6f      for(pp=&vxwo
7510: 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 2a 70 70  rksFileList; *pp
7520: 20 26 26 20 2a 70 70 21 3d 70 49 64 3b 20 70 70   && *pp!=pId; pp
7530: 20 3d 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78   = &((*pp)->pNex
7540: 74 29 29 7b 7d 0a 20 20 20 20 61 73 73 65 72 74  t)){}.    assert
7550: 28 20 2a 70 70 3d 3d 70 49 64 20 29 3b 0a 20 20  ( *pp==pId );.  
7560: 20 20 2a 70 70 20 3d 20 70 49 64 2d 3e 70 4e 65    *pp = pId->pNe
7570: 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  xt;.    sqlite3_
7580: 66 72 65 65 28 70 49 64 29 3b 0a 20 20 7d 0a 20  free(pId);.  }. 
7590: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
75a0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f  );.}.#endif /* O
75b0: 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a  S_VXWORKS */./**
75c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
75d0: 64 20 6f 66 20 55 6e 69 71 75 65 20 46 69 6c 65  d of Unique File
75e0: 20 49 44 20 55 74 69 6c 69 74 79 20 55 73 65 64   ID Utility Used
75f0: 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a   By VxWorks ****
7600: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
7610: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f  ***********/.../
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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 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 20 50 6f 73 69 78  ********** Posix
76d0: 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e   Advisory Lockin
76e0: 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
76f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
7700: 2a 0a 2a 2a 20 50 4f 53 49 58 20 61 64 76 69 73  *.** POSIX advis
7710: 6f 72 79 20 6c 6f 63 6b 73 20 61 72 65 20 62 72  ory locks are br
7720: 6f 6b 65 6e 20 62 79 20 64 65 73 69 67 6e 2e 20  oken by design. 
7730: 20 41 4e 53 49 20 53 54 44 20 31 30 30 33 2e 31   ANSI STD 1003.1
7740: 20 28 31 39 39 36 29 0a 2a 2a 20 73 65 63 74 69   (1996).** secti
7750: 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73  on 6.5.2.2 lines
7760: 20 34 38 33 20 74 68 72 6f 75 67 68 20 34 39 30   483 through 490
7770: 20 73 70 65 63 69 66 79 20 74 68 61 74 20 77 68   specify that wh
7780: 65 6e 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20  en a process.** 
7790: 73 65 74 73 20 6f 72 20 63 6c 65 61 72 73 20 61  sets or clears a
77a0: 20 6c 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65 72   lock, that oper
77b0: 61 74 69 6f 6e 20 6f 76 65 72 72 69 64 65 73 20  ation overrides 
77c0: 61 6e 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20  any prior locks 
77d0: 73 65 74 0a 2a 2a 20 62 79 20 74 68 65 20 73 61  set.** by the sa
77e0: 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 49 74 20  me process.  It 
77f0: 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69 63 69  does not explici
7800: 74 6c 79 20 73 61 79 20 73 6f 2c 20 62 75 74 20  tly say so, but 
7810: 74 68 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20  this implies.** 
7820: 74 68 61 74 20 69 74 20 6f 76 65 72 72 69 64 65  that it override
7830: 73 20 6c 6f 63 6b 73 20 73 65 74 20 62 79 20 74  s locks set by t
7840: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  he same process 
7850: 75 73 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e  using a differen
7860: 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69  t.** file descri
7870: 70 74 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72 20  ptor.  Consider 
7880: 74 68 69 73 20 74 65 73 74 20 63 61 73 65 3a 0a  this test case:.
7890: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20  **.**       int 
78a0: 66 64 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69  fd1 = open("./fi
78b0: 6c 65 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43  le1", O_RDWR|O_C
78c0: 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20  REAT, 0644);.** 
78d0: 20 20 20 20 20 20 69 6e 74 20 66 64 32 20 3d 20        int fd2 = 
78e0: 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20  open("./file2", 
78f0: 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20  O_RDWR|O_CREAT, 
7900: 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70  0644);.**.** Sup
7910: 70 6f 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64  pose ./file1 and
7920: 20 2e 2f 66 69 6c 65 32 20 61 72 65 20 72 65 61   ./file2 are rea
7930: 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 66 69 6c  lly the same fil
7940: 65 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e  e (because.** on
7950: 65 20 69 73 20 61 20 68 61 72 64 20 6f 72 20 73  e is a hard or s
7960: 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20  ymbolic link to 
7970: 74 68 65 20 6f 74 68 65 72 29 20 74 68 65 6e 20  the other) then 
7980: 69 66 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e  if you set.** an
7990: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
79a0: 6f 6e 20 66 64 31 2c 20 74 68 65 6e 20 74 72 79  on fd1, then try
79b0: 20 74 6f 20 67 65 74 20 61 6e 20 65 78 63 6c 75   to get an exclu
79c0: 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20  sive lock.** on 
79d0: 66 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20  fd2, it works.  
79e0: 49 20 77 6f 75 6c 64 20 68 61 76 65 20 65 78 70  I would have exp
79f0: 65 63 74 65 64 20 74 68 65 20 73 65 63 6f 6e 64  ected the second
7a00: 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c   lock to.** fail
7a10: 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 61 73   since there was
7a20: 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20   already a lock 
7a30: 6f 6e 20 74 68 65 20 66 69 6c 65 20 64 75 65 20  on the file due 
7a40: 74 6f 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e  to fd1..** But n
7a50: 6f 74 20 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f  ot so.  Since bo
7a60: 74 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72  th locks came fr
7a70: 6f 6d 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  om the same proc
7a80: 65 73 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f  ess, the.** seco
7a90: 6e 64 20 6f 76 65 72 72 69 64 65 73 20 74 68 65  nd overrides the
7aa0: 20 66 69 72 73 74 2c 20 65 76 65 6e 20 74 68 6f   first, even tho
7ab0: 75 67 68 20 74 68 65 79 20 77 65 72 65 20 6f 6e  ugh they were on
7ac0: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69   different.** fi
7ad0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f  le descriptors o
7ae0: 70 65 6e 65 64 20 6f 6e 20 64 69 66 66 65 72 65  pened on differe
7af0: 6e 74 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a  nt file names..*
7b00: 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73 20  *.** This means 
7b10: 74 68 61 74 20 77 65 20 63 61 6e 6e 6f 74 20 75  that we cannot u
7b20: 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 74  se POSIX locks t
7b30: 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 66 69  o synchronize fi
7b40: 6c 65 20 61 63 63 65 73 73 0a 2a 2a 20 61 6d 6f  le access.** amo
7b50: 6e 67 20 63 6f 6d 70 65 74 69 6e 67 20 74 68 72  ng competing thr
7b60: 65 61 64 73 20 6f 66 20 74 68 65 20 73 61 6d 65  eads of the same
7b70: 20 70 72 6f 63 65 73 73 2e 20 20 50 4f 53 49 58   process.  POSIX
7b80: 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77 6f 72 6b   locks will work
7b90: 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e 63   fine.** to sync
7ba0: 68 72 6f 6e 69 7a 65 20 61 63 63 65 73 73 20 66  hronize access f
7bb0: 6f 72 20 74 68 72 65 61 64 73 20 69 6e 20 73 65  or threads in se
7bc0: 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 65 73  parate processes
7bd0: 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20 74 68 72  , but not.** thr
7be0: 65 61 64 73 20 77 69 74 68 69 6e 20 74 68 65 20  eads within the 
7bf0: 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a 2a 2a  same process..**
7c00: 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75  .** To work arou
7c10: 6e 64 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c 20  nd the problem, 
7c20: 53 51 4c 69 74 65 20 68 61 73 20 74 6f 20 6d 61  SQLite has to ma
7c30: 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63 6b 73 20  nage file locks 
7c40: 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e  internally.** on
7c50: 20 69 74 73 20 6f 77 6e 2e 20 20 57 68 65 6e 65   its own.  Whene
7c60: 76 65 72 20 61 20 6e 65 77 20 64 61 74 61 62 61  ver a new databa
7c70: 73 65 20 69 73 20 6f 70 65 6e 65 64 2c 20 77 65  se is opened, we
7c80: 20 68 61 76 65 20 74 6f 20 66 69 6e 64 20 74 68   have to find th
7c90: 65 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 69 6e  e.** specific in
7ca0: 6f 64 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ode of the datab
7cb0: 61 73 65 20 66 69 6c 65 20 28 74 68 65 20 69 6e  ase file (the in
7cc0: 6f 64 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65  ode is determine
7cd0: 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 5f 64  d by the.** st_d
7ce0: 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f 20 66 69  ev and st_ino fi
7cf0: 65 6c 64 73 20 6f 66 20 74 68 65 20 73 74 61 74  elds of the stat
7d00: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
7d10: 66 73 74 61 74 28 29 20 66 69 6c 6c 73 20 69 6e  fstat() fills in
7d20: 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63 6b 20 66  ).** and check f
7d30: 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65 61 64 79  or locks already
7d40: 20 65 78 69 73 74 69 6e 67 20 6f 6e 20 74 68 61   existing on tha
7d50: 74 20 69 6e 6f 64 65 2e 20 20 57 68 65 6e 20 6c  t inode.  When l
7d60: 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63 72 65 61  ocks are.** crea
7d70: 74 65 64 20 6f 72 20 72 65 6d 6f 76 65 64 2c 20  ted or removed, 
7d80: 77 65 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b 20  we have to look 
7d90: 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e 74 65 72  at our own inter
7da0: 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68  nal record of th
7db0: 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20 73 65  e.** locks to se
7dc0: 65 20 69 66 20 61 6e 6f 74 68 65 72 20 74 68 72  e if another thr
7dd0: 65 61 64 20 68 61 73 20 70 72 65 76 69 6f 75 73  ead has previous
7de0: 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b 20 6f 6e  ly set a lock on
7df0: 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 69 6e   that same.** in
7e00: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73 69 64  ode..**.** (Asid
7e10: 65 3a 20 54 68 65 20 75 73 65 20 6f 66 20 69 6e  e: The use of in
7e20: 6f 64 65 20 6e 75 6d 62 65 72 73 20 61 73 20 75  ode numbers as u
7e30: 6e 69 71 75 65 20 49 44 73 20 64 6f 65 73 20 6e  nique IDs does n
7e40: 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72  ot work on VxWor
7e50: 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56 78 57 6f 72  ks..** For VxWor
7e60: 6b 73 2c 20 77 65 20 68 61 76 65 20 74 6f 20 75  ks, we have to u
7e70: 73 65 20 74 68 65 20 61 6c 74 65 72 6e 61 74 69  se the alternati
7e80: 76 65 20 75 6e 69 71 75 65 20 49 44 20 73 79 73  ve unique ID sys
7e90: 74 65 6d 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  tem based on.** 
7ea0: 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61  canonical filena
7eb0: 6d 65 20 61 6e 64 20 69 6d 70 6c 65 6d 65 6e 74  me and implement
7ec0: 65 64 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  ed in the previo
7ed0: 75 73 20 64 69 76 69 73 69 6f 6e 2e 29 0a 2a 2a  us division.).**
7ee0: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f  .** The sqlite3_
7ef0: 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 66  file structure f
7f00: 6f 72 20 50 4f 53 49 58 20 69 73 20 6e 6f 20 6c  or POSIX is no l
7f10: 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e 20 69 6e  onger just an in
7f20: 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65  teger file.** de
7f30: 73 63 72 69 70 74 6f 72 2e 20 20 49 74 20 69 73  scriptor.  It is
7f40: 20 6e 6f 77 20 61 20 73 74 72 75 63 74 75 72 65   now a structure
7f50: 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
7f60: 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20  integer file.** 
7f70: 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 20 61  descriptor and a
7f80: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
7f90: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
7fa0: 63 72 69 62 65 73 20 74 68 65 20 69 6e 74 65 72  cribes the inter
7fb0: 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20  nal.** locks on 
7fc0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
7fd0: 67 20 69 6e 6f 64 65 2e 20 20 54 68 65 72 65 20  g inode.  There 
7fe0: 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 73  is one locking s
7ff0: 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20  tructure.** per 
8000: 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20 74 68 65  inode, so if the
8010: 20 73 61 6d 65 20 69 6e 6f 64 65 20 69 73 20 6f   same inode is o
8020: 70 65 6e 65 64 20 74 77 69 63 65 2c 20 62 6f 74  pened twice, bot
8030: 68 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  h unixFile struc
8040: 74 75 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20 74  tures.** point t
8050: 6f 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69  o the same locki
8060: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  ng structure.  T
8070: 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63  he locking struc
8080: 74 75 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61 20  ture keeps.** a 
8090: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
80a0: 28 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77  (so we will know
80b0: 20 77 68 65 6e 20 74 6f 20 64 65 6c 65 74 65 20   when to delete 
80c0: 69 74 29 20 61 6e 64 20 61 20 22 63 6e 74 22 0a  it) and a "cnt".
80d0: 2a 2a 20 66 69 65 6c 64 20 74 68 61 74 20 74 65  ** field that te
80e0: 6c 6c 73 20 75 73 20 69 74 73 20 69 6e 74 65 72  lls us its inter
80f0: 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73 2e  nal lock status.
8100: 20 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74    cnt==0 means t
8110: 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75 6e  he.** file is un
8120: 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d 31  locked.  cnt==-1
8130: 20 6d 65 61 6e 73 20 74 68 65 20 66 69 6c 65 20   means the file 
8140: 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65  has an exclusive
8150: 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20   lock..** cnt>0 
8160: 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72 65 20  means there are 
8170: 63 6e 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  cnt shared locks
8180: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a   on the file..**
8190: 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70 74 20  .** Any attempt 
81a0: 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63  to lock or unloc
81b0: 6b 20 61 20 66 69 6c 65 20 66 69 72 73 74 20 63  k a file first c
81c0: 68 65 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69 6e  hecks the lockin
81d0: 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20  g.** structure. 
81e0: 20 54 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73   The fcntl() sys
81f0: 74 65 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c 79  tem call is only
8200: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20   invoked to set 
8210: 61 20 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b  a .** POSIX lock
8220: 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c   if the internal
8230: 20 6c 6f 63 6b 20 73 74 72 75 63 74 75 72 65 20   lock structure 
8240: 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 65 74 77  transitions betw
8250: 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64 20  een.** a locked 
8260: 61 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20  and an unlocked 
8270: 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42 75 74  state..**.** But
8280: 20 77 61 69 74 3a 20 20 74 68 65 72 65 20 61 72   wait:  there ar
8290: 65 20 79 65 74 20 6d 6f 72 65 20 70 72 6f 62 6c  e yet more probl
82a0: 65 6d 73 20 77 69 74 68 20 50 4f 53 49 58 20 61  ems with POSIX a
82b0: 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 0a 2a  dvisory locks..*
82c0: 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f 73  *.** If you clos
82d0: 65 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  e a file descrip
82e0: 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20  tor that points 
82f0: 74 6f 20 61 20 66 69 6c 65 20 74 68 61 74 20 68  to a file that h
8300: 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c  as locks,.** all
8310: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20 66   locks on that f
8320: 69 6c 65 20 74 68 61 74 20 61 72 65 20 6f 77 6e  ile that are own
8330: 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e  ed by the curren
8340: 74 20 70 72 6f 63 65 73 73 20 61 72 65 0a 2a 2a  t process are.**
8350: 20 72 65 6c 65 61 73 65 64 2e 20 20 54 6f 20 77   released.  To w
8360: 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 20  ork around this 
8370: 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68 20 75 6e  problem, each un
8380: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
8390: 63 74 0a 2a 2a 20 6d 61 69 6e 74 61 69 6e 73 20  ct.** maintains 
83a0: 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e  a count of the n
83b0: 75 6d 62 65 72 20 6f 66 20 70 65 6e 64 69 6e 67  umber of pending
83c0: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 20 69 6e   locks on tha in
83d0: 6f 64 65 2e 0a 2a 2a 20 57 68 65 6e 20 61 6e 20  ode..** When an 
83e0: 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
83f0: 74 6f 20 63 6c 6f 73 65 20 61 6e 20 75 6e 69 78  to close an unix
8400: 46 69 6c 65 2c 20 69 66 20 74 68 65 72 65 20 61  File, if there a
8410: 72 65 0a 2a 2a 20 6f 74 68 65 72 20 75 6e 69 78  re.** other unix
8420: 46 69 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65  File open on the
8430: 20 73 61 6d 65 20 69 6e 6f 64 65 20 74 68 61 74   same inode that
8440: 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63   are holding loc
8450: 6b 73 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20  ks, the call.** 
8460: 74 6f 20 63 6c 6f 73 65 28 29 20 74 68 65 20 66  to close() the f
8470: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
8480: 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c  s deferred until
8490: 20 61 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b   all of the lock
84a0: 73 20 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20  s clear..** The 
84b0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74  unixInodeInfo st
84c0: 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 61 20  ructure keeps a 
84d0: 6c 69 73 74 20 6f 66 20 66 69 6c 65 20 64 65 73  list of file des
84e0: 63 72 69 70 74 6f 72 73 20 74 68 61 74 20 6e 65  criptors that ne
84f0: 65 64 20 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73  ed to.** be clos
8500: 65 64 20 61 6e 64 20 74 68 61 74 20 6c 69 73 74  ed and that list
8510: 20 69 73 20 77 61 6c 6b 65 64 20 28 61 6e 64 20   is walked (and 
8520: 63 6c 65 61 72 65 64 29 20 77 68 65 6e 20 74 68  cleared) when th
8530: 65 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63  e last lock.** c
8540: 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74  lears..**.** Yet
8550: 20 61 6e 6f 74 68 65 72 20 70 72 6f 62 6c 65 6d   another problem
8560: 3a 20 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20  :  LinuxThreads 
8570: 64 6f 20 6e 6f 74 20 70 6c 61 79 20 77 65 6c 6c  do not play well
8580: 20 77 69 74 68 20 70 6f 73 69 78 20 6c 6f 63 6b   with posix lock
8590: 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c  s..**.** Many ol
85a0: 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  der versions of 
85b0: 6c 69 6e 75 78 20 75 73 65 20 74 68 65 20 4c 69  linux use the Li
85c0: 6e 75 78 54 68 72 65 61 64 73 20 6c 69 62 72 61  nuxThreads libra
85d0: 72 79 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 6e  ry which is.** n
85e0: 6f 74 20 70 6f 73 69 78 20 63 6f 6d 70 6c 69 61  ot posix complia
85f0: 6e 74 2e 20 20 55 6e 64 65 72 20 4c 69 6e 75 78  nt.  Under Linux
8600: 54 68 72 65 61 64 73 2c 20 61 20 6c 6f 63 6b 20  Threads, a lock 
8610: 63 72 65 61 74 65 64 20 62 79 20 74 68 72 65 61  created by threa
8620: 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f 74 20 62 65  d.** A cannot be
8630: 20 6d 6f 64 69 66 69 65 64 20 6f 72 20 6f 76 65   modified or ove
8640: 72 72 69 64 64 65 6e 20 62 79 20 61 20 64 69 66  rridden by a dif
8650: 66 65 72 65 6e 74 20 74 68 72 65 61 64 20 42 2e  ferent thread B.
8660: 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72 65 61 64 20  .** Only thread 
8670: 41 20 63 61 6e 20 6d 6f 64 69 66 79 20 74 68 65  A can modify the
8680: 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20   lock.  Locking 
8690: 62 65 68 61 76 69 6f 72 20 69 73 20 63 6f 72 72  behavior is corr
86a0: 65 63 74 0a 2a 2a 20 69 66 20 74 68 65 20 61 70  ect.** if the ap
86b0: 70 6c 69 61 74 69 6f 6e 20 75 73 65 73 20 74 68  pliation uses th
86c0: 65 20 6e 65 77 65 72 20 4e 61 74 69 76 65 20 50  e newer Native P
86d0: 6f 73 69 78 20 54 68 72 65 61 64 20 4c 69 62 72  osix Thread Libr
86e0: 61 72 79 20 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e  ary (NPTL).** on
86f0: 20 6c 69 6e 75 78 20 2d 20 77 69 74 68 20 4e 50   linux - with NP
8700: 54 4c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65  TL a lock create
8710: 64 20 62 79 20 74 68 72 65 61 64 20 41 20 63 61  d by thread A ca
8720: 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73  n override locks
8730: 0a 2a 2a 20 69 6e 20 74 68 72 65 61 64 20 42 2e  .** in thread B.
8740: 20 20 42 75 74 20 74 68 65 72 65 20 69 73 20 6e    But there is n
8750: 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74  o way to know at
8760: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68   compile-time wh
8770: 69 63 68 0a 2a 2a 20 74 68 72 65 61 64 69 6e 67  ich.** threading
8780: 20 6c 69 62 72 61 72 79 20 69 73 20 62 65 69 6e   library is bein
8790: 67 20 75 73 65 64 2e 20 20 53 6f 20 74 68 65 72  g used.  So ther
87a0: 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b  e is no way to k
87b0: 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c  now at.** compil
87c0: 65 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f  e-time whether o
87d0: 72 20 6e 6f 74 20 74 68 72 65 61 64 20 41 20 63  r not thread A c
87e0: 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b  an override lock
87f0: 73 20 6f 6e 20 74 68 72 65 61 64 20 42 2e 0a 2a  s on thread B..*
8800: 2a 20 4f 6e 65 20 68 61 73 20 74 6f 20 64 6f 20  * One has to do 
8810: 61 20 72 75 6e 2d 74 69 6d 65 20 63 68 65 63 6b  a run-time check
8820: 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65   to discover the
8830: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65   behavior of the
8840: 0a 2a 2a 20 63 75 72 72 65 6e 74 20 70 72 6f 63  .** current proc
8850: 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74  ess..**.** SQLit
8860: 65 20 75 73 65 64 20 74 6f 20 73 75 70 70 6f 72  e used to suppor
8870: 74 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2e 20  t LinuxThreads. 
8880: 20 42 75 74 20 73 75 70 70 6f 72 74 20 66 6f 72   But support for
8890: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 0a 2a 2a   LinuxThreads.**
88a0: 20 77 61 73 20 64 72 6f 70 70 65 64 20 62 65 67   was dropped beg
88b0: 69 6e 6e 69 6e 67 20 77 69 74 68 20 76 65 72 73  inning with vers
88c0: 69 6f 6e 20 33 2e 37 2e 30 2e 20 20 53 51 4c 69  ion 3.7.0.  SQLi
88d0: 74 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 77 6f  te will still wo
88e0: 72 6b 20 77 69 74 68 0a 2a 2a 20 4c 69 6e 75 78  rk with.** Linux
88f0: 54 68 72 65 61 64 73 20 70 72 6f 76 69 64 65 64  Threads provided
8900: 20 74 68 61 74 20 28 31 29 20 74 68 65 72 65 20   that (1) there 
8910: 69 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20  is no more than 
8920: 6f 6e 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  one connection .
8930: 2a 2a 20 70 65 72 20 64 61 74 61 62 61 73 65 20  ** per database 
8940: 66 69 6c 65 20 69 6e 20 74 68 65 20 73 61 6d 65  file in the same
8950: 20 70 72 6f 63 65 73 73 20 61 6e 64 20 28 32 29   process and (2)
8960: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
8970: 74 69 6f 6e 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20  tions.** do not 
8980: 6d 6f 76 65 20 61 63 72 6f 73 73 20 74 68 72 65  move across thre
8990: 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  ads..*/../*.** A
89a0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
89b0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
89c0: 63 74 75 72 65 20 73 65 72 76 65 73 20 61 73 20  cture serves as 
89d0: 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20  the key used.** 
89e0: 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 72 74  to locate a part
89f0: 69 63 75 6c 61 72 20 75 6e 69 78 49 6e 6f 64 65  icular unixInode
8a00: 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  Info object..*/.
8a10: 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49  struct unixFileI
8a20: 64 20 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b  d {.  dev_t dev;
8a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a40: 20 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62    /* Device numb
8a50: 65 72 20 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57  er */.#if OS_VXW
8a60: 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 76 78  ORKS.  struct vx
8a70: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64  worksFileId *pId
8a80: 3b 20 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c  ;  /* Unique fil
8a90: 65 20 49 44 20 66 6f 72 20 76 78 77 6f 72 6b 73  e ID for vxworks
8aa0: 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 69 6e 6f  . */.#else.  ino
8ab0: 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20 20 20 20  _t ino;         
8ac0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 6f 64           /* Inod
8ad0: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 65 6e 64  e number */.#end
8ae0: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  if.};../*.** An 
8af0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
8b00: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
8b10: 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
8b20: 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a   for each open.*
8b30: 2a 20 69 6e 6f 64 65 2e 20 20 4f 72 2c 20 6f 6e  * inode.  Or, on
8b40: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2c 20 74   LinuxThreads, t
8b50: 68 65 72 65 20 69 73 20 6f 6e 65 20 6f 66 20 74  here is one of t
8b60: 68 65 73 65 20 73 74 72 75 63 74 75 72 65 73 20  hese structures 
8b70: 66 6f 72 0a 2a 2a 20 65 61 63 68 20 69 6e 6f 64  for.** each inod
8b80: 65 20 6f 70 65 6e 65 64 20 62 79 20 65 61 63 68  e opened by each
8b90: 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41   thread..**.** A
8ba0: 20 73 69 6e 67 6c 65 20 69 6e 6f 64 65 20 63 61   single inode ca
8bb0: 6e 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20  n have multiple 
8bc0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
8bd0: 2c 20 73 6f 20 65 61 63 68 20 75 6e 69 78 46 69  , so each unixFi
8be0: 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  le.** structure 
8bf0: 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
8c00: 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63  er to an instanc
8c10: 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74  e of this object
8c20: 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20 6f 62 6a   and this.** obj
8c30: 65 63 74 20 6b 65 65 70 73 20 61 20 63 6f 75 6e  ect keeps a coun
8c40: 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  t of the number 
8c50: 6f 66 20 75 6e 69 78 46 69 6c 65 20 70 6f 69 6e  of unixFile poin
8c60: 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73  ting to it..*/.s
8c70: 74 72 75 63 74 20 75 6e 69 78 49 6e 6f 64 65 49  truct unixInodeI
8c80: 6e 66 6f 20 7b 0a 20 20 73 74 72 75 63 74 20 75  nfo {.  struct u
8c90: 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64  nixFileId fileId
8ca0: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c  ;       /* The l
8cb0: 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69  ookup key */.  i
8cc0: 6e 74 20 6e 53 68 61 72 65 64 3b 20 20 20 20 20  nt nShared;     
8cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8ce0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 53 48 41 52  * Number of SHAR
8cf0: 45 44 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ED locks held */
8d00: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
8d10: 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20 20   eFileLock;     
8d20: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 48 41     /* One of SHA
8d30: 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56  RED_LOCK, RESERV
8d40: 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a  ED_LOCK etc. */.
8d50: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
8d60: 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3b 20 20 20  bProcessLock;   
8d70: 20 20 2f 2a 20 41 6e 20 65 78 63 6c 75 73 69 76    /* An exclusiv
8d80: 65 20 70 72 6f 63 65 73 73 20 6c 6f 63 6b 20 69  e process lock i
8d90: 73 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20  s held */.  int 
8da0: 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
8db0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
8dc0: 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72  umber of pointer
8dd0: 73 20 74 6f 20 74 68 69 73 20 73 74 72 75 63 74  s to this struct
8de0: 75 72 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ure */.  unixShm
8df0: 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20  Node *pShmNode; 
8e00: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72           /* Shar
8e10: 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ed memory associ
8e20: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 69  ated with this i
8e30: 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  node */.  int nL
8e40: 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ock;            
8e50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8e60: 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69  ber of outstandi
8e70: 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 2a 2f  ng file locks */
8e80: 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
8e90: 2a 70 55 6e 75 73 65 64 3b 20 20 20 20 20 20 20  *pUnused;       
8ea0: 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 66 69 6c     /* Unused fil
8eb0: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 74 6f  e descriptors to
8ec0: 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 75 6e 69 78   close */.  unix
8ed0: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 4e 65 78 74  InodeInfo *pNext
8ee0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
8ef0: 69 73 74 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49  ist of all unixI
8f00: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73  nodeInfo objects
8f10: 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49   */.  unixInodeI
8f20: 6e 66 6f 20 2a 70 50 72 65 76 3b 20 20 20 20 20  nfo *pPrev;     
8f30: 20 20 20 20 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e        /*    ....
8f40: 20 64 6f 75 62 6c 79 20 6c 69 6e 6b 65 64 20 2a   doubly linked *
8f50: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  /.#if SQLITE_ENA
8f60: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
8f70: 45 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  E.  unsigned lon
8f80: 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 42 79 74  g long sharedByt
8f90: 65 3b 20 20 2f 2a 20 66 6f 72 20 41 46 50 20 73  e;  /* for AFP s
8fa0: 69 6d 75 6c 61 74 65 64 20 73 68 61 72 65 64 20  imulated shared 
8fb0: 6c 6f 63 6b 20 2a 2f 0a 23 65 6e 64 69 66 0a 23  lock */.#endif.#
8fc0: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
8fd0: 73 65 6d 5f 74 20 2a 70 53 65 6d 3b 20 20 20 20  sem_t *pSem;    
8fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ff0: 2f 2a 20 4e 61 6d 65 64 20 50 4f 53 49 58 20 73  /* Named POSIX s
9000: 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 20 20 63 68  emaphore */.  ch
9010: 61 72 20 61 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f  ar aSemName[MAX_
9020: 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 20 20 2f 2a  PATHNAME+2];  /*
9030: 20 4e 61 6d 65 20 6f 66 20 74 68 61 74 20 73 65   Name of that se
9040: 6d 61 70 68 6f 72 65 20 2a 2f 0a 23 65 6e 64 69  maphore */.#endi
9050: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69  f.};../*.** A li
9060: 73 74 73 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49  sts of all unixI
9070: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73  nodeInfo objects
9080: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 69 78  ..*/.static unix
9090: 49 6e 6f 64 65 49 6e 66 6f 20 2a 69 6e 6f 64 65  InodeInfo *inode
90a0: 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  List = 0;../*.**
90b0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
90c0: 6e 20 2d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  n - unixLogError
90d0: 41 74 4c 69 6e 65 28 29 2c 20 69 73 20 6f 6e 6c  AtLine(), is onl
90e0: 79 20 65 76 65 72 20 63 61 6c 6c 65 64 20 76 69  y ever called vi
90f0: 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 75  a the macro.** u
9100: 6e 69 78 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a  nixLogError()..*
9110: 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6e 76 6f 6b  *.** It is invok
9120: 65 64 20 61 66 74 65 72 20 61 6e 20 65 72 72 6f  ed after an erro
9130: 72 20 6f 63 63 75 72 73 20 69 6e 20 61 6e 20 4f  r occurs in an O
9140: 53 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 65  S function and e
9150: 72 72 6e 6f 20 68 61 73 20 62 65 65 6e 0a 2a 2a  rrno has been.**
9160: 20 73 65 74 2e 20 49 74 20 6c 6f 67 73 20 61 20   set. It logs a 
9170: 6d 65 73 73 61 67 65 20 75 73 69 6e 67 20 73 71  message using sq
9180: 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74  lite3_log() cont
9190: 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65  aining the curre
91a0: 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65  nt value of.** e
91b0: 72 72 6e 6f 20 61 6e 64 2c 20 69 66 20 70 6f 73  rrno and, if pos
91c0: 73 69 62 6c 65 2c 20 74 68 65 20 68 75 6d 61 6e  sible, the human
91d0: 2d 72 65 61 64 61 62 6c 65 20 65 71 75 69 76 61  -readable equiva
91e0: 6c 65 6e 74 20 66 72 6f 6d 20 73 74 72 65 72 72  lent from strerr
91f0: 6f 72 28 29 20 6f 72 0a 2a 2a 20 73 74 72 65 72  or() or.** strer
9200: 72 6f 72 5f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  ror_r()..**.** T
9210: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
9220: 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  t passed to the 
9230: 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 20  macro should be 
9240: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74  the error code t
9250: 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72  hat.** will be r
9260: 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74  eturned to SQLit
9270: 65 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49  e (e.g. SQLITE_I
9280: 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c  OERR_DELETE, SQL
9290: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 20 0a  ITE_CANTOPEN). .
92a0: 2a 2a 20 54 68 65 20 74 77 6f 20 73 75 62 73 65  ** The two subse
92b0: 71 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20  quent arguments 
92c0: 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6e 61  should be the na
92d0: 6d 65 20 6f 66 20 74 68 65 20 4f 53 20 66 75 6e  me of the OS fun
92e0: 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61  ction that.** fa
92f0: 69 6c 65 64 20 28 65 2e 67 2e 20 22 75 6e 6c 69  iled (e.g. "unli
9300: 6e 6b 22 2c 20 22 6f 70 65 6e 22 29 20 61 6e 64  nk", "open") and
9310: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
9320: 66 69 6c 65 2d 73 79 73 74 65 6d 20 70 61 74 68  file-system path
9330: 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a  ,.** if any..*/.
9340: 23 64 65 66 69 6e 65 20 75 6e 69 78 4c 6f 67 45  #define unixLogE
9350: 72 72 6f 72 28 61 2c 62 2c 63 29 20 20 20 20 20  rror(a,b,c)     
9360: 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69  unixLogErrorAtLi
9370: 6e 65 28 61 2c 62 2c 63 2c 5f 5f 4c 49 4e 45 5f  ne(a,b,c,__LINE_
9380: 5f 29 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  _).static int un
9390: 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65  ixLogErrorAtLine
93a0: 28 0a 20 20 69 6e 74 20 65 72 72 63 6f 64 65 2c  (.  int errcode,
93b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93c0: 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 65 72      /* SQLite er
93d0: 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  ror code */.  co
93e0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c  nst char *zFunc,
93f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9400: 20 4e 61 6d 65 20 6f 66 20 4f 53 20 66 75 6e 63   Name of OS func
9410: 74 69 6f 6e 20 74 68 61 74 20 66 61 69 6c 65 64  tion that failed
9420: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
9430: 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
9440: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 70 61        /* File pa
9450: 74 68 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  th associated wi
9460: 74 68 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69 6e  th error */.  in
9470: 74 20 69 4c 69 6e 65 20 20 20 20 20 20 20 20 20  t iLine         
9480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9490: 20 53 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75 6d   Source line num
94a0: 62 65 72 20 77 68 65 72 65 20 65 72 72 6f 72 20  ber where error 
94b0: 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a 20  occurred */.){. 
94c0: 20 63 68 61 72 20 2a 7a 45 72 72 3b 20 20 20 20   char *zErr;    
94d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94e0: 20 2f 2a 20 4d 65 73 73 61 67 65 20 66 72 6f 6d   /* Message from
94f0: 20 73 74 72 65 72 72 6f 72 28 29 20 6f 72 20 65   strerror() or e
9500: 71 75 69 76 61 6c 65 6e 74 20 2a 2f 0a 20 20 69  quivalent */.  i
9510: 6e 74 20 69 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt iErrno = errn
9520: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  o;             /
9530: 2a 20 53 61 76 65 64 20 73 79 73 63 61 6c 6c 20  * Saved syscall 
9540: 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a  error number */.
9550: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
9560: 20 6e 6f 74 20 61 20 74 68 72 65 61 64 73 61 66   not a threadsaf
9570: 65 20 62 75 69 6c 64 20 28 53 51 4c 49 54 45 5f  e build (SQLITE_
9580: 54 48 52 45 41 44 53 41 46 45 3d 3d 30 29 2c 20  THREADSAFE==0), 
9590: 74 68 65 6e 20 75 73 65 0a 20 20 2a 2a 20 74 68  then use.  ** th
95a0: 65 20 73 74 72 65 72 72 6f 72 28 29 20 66 75 6e  e strerror() fun
95b0: 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20  ction to obtain 
95c0: 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  the human-readab
95d0: 6c 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  le error message
95e0: 0a 20 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74  .  ** equivalent
95f0: 20 74 6f 20 65 72 72 6e 6f 2e 20 4f 74 68 65 72   to errno. Other
9600: 77 69 73 65 2c 20 75 73 65 20 73 74 72 65 72 72  wise, use strerr
9610: 6f 72 5f 72 28 29 2e 0a 20 20 2a 2f 20 0a 23 69  or_r()..  */ .#i
9620: 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  f SQLITE_THREADS
9630: 41 46 45 20 26 26 20 64 65 66 69 6e 65 64 28 48  AFE && defined(H
9640: 41 56 45 5f 53 54 52 45 52 52 4f 52 5f 52 29 0a  AVE_STRERROR_R).
9650: 20 20 63 68 61 72 20 61 45 72 72 5b 38 30 5d 3b    char aErr[80];
9660: 0a 20 20 6d 65 6d 73 65 74 28 61 45 72 72 2c 20  .  memset(aErr, 
9670: 30 2c 20 73 69 7a 65 6f 66 28 61 45 72 72 29 29  0, sizeof(aErr))
9680: 3b 0a 20 20 7a 45 72 72 20 3d 20 61 45 72 72 3b  ;.  zErr = aErr;
9690: 0a 0a 20 20 2f 2a 20 49 66 20 53 54 52 45 52 52  ..  /* If STRERR
96a0: 4f 52 5f 52 5f 43 48 41 52 5f 50 20 28 73 65 74  OR_R_CHAR_P (set
96b0: 20 62 79 20 61 75 74 6f 63 6f 6e 66 20 73 63 72   by autoconf scr
96c0: 69 70 74 73 29 20 6f 72 20 5f 5f 55 53 45 5f 47  ipts) or __USE_G
96d0: 4e 55 20 69 73 20 64 65 66 69 6e 65 64 2c 0a 20  NU is defined,. 
96e0: 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74 20   ** assume that 
96f0: 74 68 65 20 73 79 73 74 65 6d 20 70 72 6f 76 69  the system provi
9700: 64 65 73 20 74 68 65 20 47 4e 55 20 76 65 72 73  des the GNU vers
9710: 69 6f 6e 20 6f 66 20 73 74 72 65 72 72 6f 72 5f  ion of strerror_
9720: 72 28 29 20 74 68 61 74 0a 20 20 2a 2a 20 72 65  r() that.  ** re
9730: 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
9740: 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
9750: 61 69 6e 69 6e 67 20 74 68 65 20 65 72 72 6f 72  aining the error
9760: 20 6d 65 73 73 61 67 65 2e 20 54 68 61 74 20 70   message. That p
9770: 6f 69 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 61 79  ointer .  ** may
9780: 20 70 6f 69 6e 74 20 74 6f 20 61 45 72 72 5b 5d   point to aErr[]
9790: 2c 20 6f 72 20 69 74 20 6d 61 79 20 70 6f 69 6e  , or it may poin
97a0: 74 20 74 6f 20 73 6f 6d 65 20 73 74 61 74 69 63  t to some static
97b0: 20 73 74 6f 72 61 67 65 20 73 6f 6d 65 77 68 65   storage somewhe
97c0: 72 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77  re. .  ** Otherw
97d0: 69 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74  ise, assume that
97e0: 20 74 68 65 20 73 79 73 74 65 6d 20 70 72 6f 76   the system prov
97f0: 69 64 65 73 20 74 68 65 20 50 4f 53 49 58 20 76  ides the POSIX v
9800: 65 72 73 69 6f 6e 20 6f 66 20 0a 20 20 2a 2a 20  ersion of .  ** 
9810: 73 74 72 65 72 72 6f 72 5f 72 28 29 2c 20 77 68  strerror_r(), wh
9820: 69 63 68 20 61 6c 77 61 79 73 20 77 72 69 74 65  ich always write
9830: 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  s an error messa
9840: 67 65 20 69 6e 74 6f 20 61 45 72 72 5b 5d 2e 0a  ge into aErr[]..
9850: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
9860: 20 63 6f 64 65 20 69 6e 63 6f 72 72 65 63 74 6c   code incorrectl
9870: 79 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 69  y assumes that i
9880: 74 20 69 73 20 74 68 65 20 50 4f 53 49 58 20 76  t is the POSIX v
9890: 65 72 73 69 6f 6e 20 74 68 61 74 20 69 73 0a 20  ersion that is. 
98a0: 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2c 20 74   ** available, t
98b0: 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
98c0: 20 77 69 6c 6c 20 6f 66 74 65 6e 20 62 65 20 61   will often be a
98d0: 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20  n empty string. 
98e0: 4e 6f 74 20 61 0a 20 20 2a 2a 20 68 75 67 65 20  Not a.  ** huge 
98f0: 70 72 6f 62 6c 65 6d 2e 20 49 6e 63 6f 72 72 65  problem. Incorre
9900: 63 74 6c 79 20 63 6f 6e 63 6c 75 64 69 6e 67 20  ctly concluding 
9910: 74 68 61 74 20 74 68 65 20 47 4e 55 20 76 65 72  that the GNU ver
9920: 73 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c  sion is availabl
9930: 65 20 0a 20 20 2a 2a 20 63 6f 75 6c 64 20 6c 65  e .  ** could le
9940: 61 64 20 74 6f 20 61 20 73 65 67 66 61 75 6c 74  ad to a segfault
9950: 20 74 68 6f 75 67 68 2e 0a 20 20 2a 2f 0a 23 69   though..  */.#i
9960: 66 20 64 65 66 69 6e 65 64 28 53 54 52 45 52 52  f defined(STRERR
9970: 4f 52 5f 52 5f 43 48 41 52 5f 50 29 20 7c 7c 20  OR_R_CHAR_P) || 
9980: 64 65 66 69 6e 65 64 28 5f 5f 55 53 45 5f 47 4e  defined(__USE_GN
9990: 55 29 0a 20 20 7a 45 72 72 20 3d 20 0a 23 20 65  U).  zErr = .# e
99a0: 6e 64 69 66 0a 20 20 73 74 72 65 72 72 6f 72 5f  ndif.  strerror_
99b0: 72 28 69 45 72 72 6e 6f 2c 20 61 45 72 72 2c 20  r(iErrno, aErr, 
99c0: 73 69 7a 65 6f 66 28 61 45 72 72 29 2d 31 29 3b  sizeof(aErr)-1);
99d0: 0a 0a 23 65 6c 69 66 20 53 51 4c 49 54 45 5f 54  ..#elif SQLITE_T
99e0: 48 52 45 41 44 53 41 46 45 0a 20 20 2f 2a 20 54  HREADSAFE.  /* T
99f0: 68 69 73 20 69 73 20 61 20 74 68 72 65 61 64 73  his is a threads
9a00: 61 66 65 20 62 75 69 6c 64 2c 20 62 75 74 20 73  afe build, but s
9a10: 74 72 65 72 72 6f 72 5f 72 28 29 20 69 73 20 6e  trerror_r() is n
9a20: 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 2a 2f  ot available. */
9a30: 0a 20 20 7a 45 72 72 20 3d 20 22 22 3b 0a 23 65  .  zErr = "";.#e
9a40: 6c 73 65 0a 20 20 2f 2a 20 4e 6f 6e 2d 74 68 72  lse.  /* Non-thr
9a50: 65 61 64 73 61 66 65 20 62 75 69 6c 64 2c 20 75  eadsafe build, u
9a60: 73 65 20 73 74 72 65 72 72 6f 72 28 29 2e 20 2a  se strerror(). *
9a70: 2f 0a 20 20 7a 45 72 72 20 3d 20 73 74 72 65 72  /.  zErr = strer
9a80: 72 6f 72 28 69 45 72 72 6e 6f 29 3b 0a 23 65 6e  ror(iErrno);.#en
9a90: 64 69 66 0a 0a 20 20 69 66 28 20 7a 50 61 74 68  dif..  if( zPath
9aa0: 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22 22  ==0 ) zPath = ""
9ab0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  ;.  sqlite3_log(
9ac0: 65 72 72 63 6f 64 65 2c 0a 20 20 20 20 20 20 22  errcode,.      "
9ad0: 6f 73 5f 75 6e 69 78 2e 63 3a 25 64 3a 20 28 25  os_unix.c:%d: (%
9ae0: 64 29 20 25 73 28 25 73 29 20 2d 20 25 73 22 2c  d) %s(%s) - %s",
9af0: 0a 20 20 20 20 20 20 69 4c 69 6e 65 2c 20 69 45  .      iLine, iE
9b00: 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61  rrno, zFunc, zPa
9b10: 74 68 2c 20 7a 45 72 72 0a 20 20 29 3b 0a 0a 20  th, zErr.  );.. 
9b20: 20 72 65 74 75 72 6e 20 65 72 72 63 6f 64 65 3b   return errcode;
9b30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
9b40: 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
9b50: 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75  r..**.** We assu
9b60: 6d 65 20 74 68 61 74 20 63 6c 6f 73 65 28 29 20  me that close() 
9b70: 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 77 6f  almost always wo
9b80: 72 6b 73 2c 20 73 69 6e 63 65 20 69 74 20 69 73  rks, since it is
9b90: 20 6f 6e 6c 79 20 69 6e 20 61 0a 2a 2a 20 76 65   only in a.** ve
9ba0: 72 79 20 73 69 63 6b 20 61 70 70 6c 69 63 61 74  ry sick applicat
9bb0: 69 6f 6e 20 6f 72 20 6f 6e 20 61 20 76 65 72 79  ion or on a very
9bc0: 20 73 69 63 6b 20 70 6c 61 74 66 6f 72 6d 20 74   sick platform t
9bd0: 68 61 74 20 69 74 20 6d 69 67 68 74 20 66 61 69  hat it might fai
9be0: 6c 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f 65 73  l..** If it does
9bf0: 20 66 61 69 6c 2c 20 73 69 6d 70 6c 79 20 6c 65   fail, simply le
9c00: 61 6b 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ak the file desc
9c10: 72 69 70 74 6f 72 2c 20 62 75 74 20 64 6f 20 6c  riptor, but do l
9c20: 6f 67 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72 2e  og the.** error.
9c30: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
9c40: 20 69 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20   it is not safe 
9c50: 74 6f 20 72 65 74 72 79 20 63 6c 6f 73 65 28 29  to retry close()
9c60: 20 61 66 74 65 72 20 45 49 4e 54 52 20 73 69 6e   after EINTR sin
9c70: 63 65 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64  ce the.** file d
9c80: 65 73 63 72 69 70 74 6f 72 20 6d 69 67 68 74 20  escriptor might 
9c90: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
9ca0: 6e 20 72 65 75 73 65 64 20 62 79 20 61 6e 6f 74  n reused by anot
9cb0: 68 65 72 20 74 68 72 65 61 64 2e 0a 2a 2a 20 53  her thread..** S
9cc0: 6f 20 77 65 20 64 6f 6e 27 74 20 65 76 65 6e 20  o we don't even 
9cd0: 74 72 79 20 74 6f 20 72 65 63 6f 76 65 72 20 66  try to recover f
9ce0: 72 6f 6d 20 61 6e 20 45 49 4e 54 52 2e 20 20 4a  rom an EINTR.  J
9cf0: 75 73 74 20 6c 6f 67 20 74 68 65 20 65 72 72 6f  ust log the erro
9d00: 72 0a 2a 2a 20 61 6e 64 20 6d 6f 76 65 20 6f 6e  r.** and move on
9d10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
9d20: 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 75 6e   robust_close(un
9d30: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69  ixFile *pFile, i
9d40: 6e 74 20 68 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f  nt h, int lineno
9d50: 29 7b 0a 20 20 69 66 28 20 6f 73 43 6c 6f 73 65  ){.  if( osClose
9d60: 28 68 29 20 29 7b 0a 20 20 20 20 75 6e 69 78 4c  (h) ){.    unixL
9d70: 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 53 51  ogErrorAtLine(SQ
9d80: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45  LITE_IOERR_CLOSE
9d90: 2c 20 22 63 6c 6f 73 65 22 2c 0a 20 20 20 20 20  , "close",.     
9da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9db0: 20 20 70 46 69 6c 65 20 3f 20 70 46 69 6c 65 2d    pFile ? pFile-
9dc0: 3e 7a 50 61 74 68 20 3a 20 30 2c 20 6c 69 6e 65  >zPath : 0, line
9dd0: 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  no);.  }.}../*.*
9de0: 2a 20 53 65 74 20 74 68 65 20 70 46 69 6c 65 2d  * Set the pFile-
9df0: 3e 6c 61 73 74 45 72 72 6e 6f 2e 20 20 44 6f 20  >lastErrno.  Do 
9e00: 74 68 69 73 20 69 6e 20 61 20 73 75 62 72 6f 75  this in a subrou
9e10: 74 69 6e 65 20 61 73 20 74 68 61 74 20 70 72 6f  tine as that pro
9e20: 76 69 64 65 73 0a 2a 2a 20 61 20 63 6f 6e 76 65  vides.** a conve
9e30: 6e 69 65 6e 74 20 70 6c 61 63 65 20 74 6f 20 73  nient place to s
9e40: 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 2e  et a breakpoint.
9e50: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9e60: 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 75  storeLastErrno(u
9e70: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
9e80: 69 6e 74 20 65 72 72 6f 72 29 7b 0a 20 20 70 46  int error){.  pF
9e90: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
9ea0: 20 65 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   error;.}../*.**
9eb0: 20 43 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 20   Close all file 
9ec0: 64 65 73 63 72 69 70 74 6f 72 73 20 61 63 63 75  descriptors accu
9ed0: 6d 75 61 74 65 64 20 69 6e 20 74 68 65 20 75 6e  muated in the un
9ee0: 69 78 49 6e 6f 64 65 49 6e 66 6f 2d 3e 70 55 6e  ixInodeInfo->pUn
9ef0: 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 20 0a 73  used list..*/ .s
9f00: 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65  tatic void close
9f10: 50 65 6e 64 69 6e 67 46 64 73 28 75 6e 69 78 46  PendingFds(unixF
9f20: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75  ile *pFile){.  u
9f30: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
9f40: 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
9f50: 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73  node;.  UnixUnus
9f60: 65 64 46 64 20 2a 70 3b 0a 20 20 55 6e 69 78 55  edFd *p;.  UnixU
9f70: 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 0a  nusedFd *pNext;.
9f80: 20 20 66 6f 72 28 70 3d 70 49 6e 6f 64 65 2d 3e    for(p=pInode->
9f90: 70 55 6e 75 73 65 64 3b 20 70 3b 20 70 3d 70 4e  pUnused; p; p=pN
9fa0: 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
9fb0: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  = p->pNext;.    
9fc0: 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69  robust_close(pFi
9fd0: 6c 65 2c 20 70 2d 3e 66 64 2c 20 5f 5f 4c 49 4e  le, p->fd, __LIN
9fe0: 45 5f 5f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  E__);.    sqlite
9ff0: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 20  3_free(p);.  }. 
a000: 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64   pInode->pUnused
a010: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   = 0;.}../*.** R
a020: 65 6c 65 61 73 65 20 61 20 75 6e 69 78 49 6e 6f  elease a unixIno
a030: 64 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  deInfo structure
a040: 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f   previously allo
a050: 63 61 74 65 64 20 62 79 20 66 69 6e 64 49 6e 6f  cated by findIno
a060: 64 65 49 6e 66 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20  deInfo()..**.** 
a070: 54 68 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65  The mutex entere
a080: 64 20 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78  d using the unix
a090: 45 6e 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e  EnterMutex() fun
a0a0: 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65  ction must be he
a0b0: 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20  ld.** when this 
a0c0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
a0d0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
a0e0: 69 64 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49  id releaseInodeI
a0f0: 6e 66 6f 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  nfo(unixFile *pF
a100: 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64  ile){.  unixInod
a110: 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20  eInfo *pInode = 
a120: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
a130: 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
a140: 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66  exHeld() );.  if
a150: 28 20 41 4c 57 41 59 53 28 70 49 6e 6f 64 65 29  ( ALWAYS(pInode)
a160: 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e   ){.    pInode->
a170: 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20  nRef--;.    if( 
a180: 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20  pInode->nRef==0 
a190: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
a1a0: 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64   pInode->pShmNod
a1b0: 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6c  e==0 );.      cl
a1c0: 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46  osePendingFds(pF
a1d0: 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ile);.      if( 
a1e0: 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20 29 7b  pInode->pPrev ){
a1f0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
a200: 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e   pInode->pPrev->
a210: 70 4e 65 78 74 3d 3d 70 49 6e 6f 64 65 20 29 3b  pNext==pInode );
a220: 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
a230: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
a240: 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20  pInode->pNext;. 
a250: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a260: 20 20 20 20 61 73 73 65 72 74 28 20 69 6e 6f 64      assert( inod
a270: 65 4c 69 73 74 3d 3d 70 49 6e 6f 64 65 20 29 3b  eList==pInode );
a280: 0a 20 20 20 20 20 20 20 20 69 6e 6f 64 65 4c 69  .        inodeLi
a290: 73 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65  st = pInode->pNe
a2a0: 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
a2b0: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 4e    if( pInode->pN
a2c0: 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ext ){.        a
a2d0: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70  ssert( pInode->p
a2e0: 4e 65 78 74 2d 3e 70 50 72 65 76 3d 3d 70 49 6e  Next->pPrev==pIn
a2f0: 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ode );.        p
a300: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50  Inode->pNext->pP
a310: 72 65 76 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 50  rev = pInode->pP
a320: 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rev;.      }.   
a330: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
a340: 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20  pInode);.    }. 
a350: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65   }.}../*.** Give
a360: 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  n a file descrip
a370: 74 6f 72 2c 20 6c 6f 63 61 74 65 20 74 68 65 20  tor, locate the 
a380: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
a390: 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 64 65 73  ject that.** des
a3a0: 63 72 69 62 65 73 20 74 68 61 74 20 66 69 6c 65  cribes that file
a3b0: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43 72   descriptor.  Cr
a3c0: 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69  eate a new one i
a3d0: 66 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68  f necessary.  Th
a3e0: 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75  e.** return valu
a3f0: 65 20 6d 69 67 68 74 20 62 65 20 75 6e 69 6e 69  e might be unini
a400: 74 69 61 6c 69 7a 65 64 20 69 66 20 61 6e 20 65  tialized if an e
a410: 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  rror occurs..**.
a420: 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 65 6e 74  ** The mutex ent
a430: 65 72 65 64 20 75 73 69 6e 67 20 74 68 65 20 75  ered using the u
a440: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20  nixEnterMutex() 
a450: 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  function must be
a460: 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68   held.** when th
a470: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
a480: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  alled..**.** Ret
a490: 75 72 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61  urn an appropria
a4a0: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
a4b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e  /.static int fin
a4c0: 64 49 6e 6f 64 65 49 6e 66 6f 28 0a 20 20 75 6e  dInodeInfo(.  un
a4d0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  ixFile *pFile,  
a4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a4f0: 55 6e 69 78 20 66 69 6c 65 20 77 69 74 68 20 66  Unix file with f
a500: 69 6c 65 20 64 65 73 63 20 75 73 65 64 20 69 6e  ile desc used in
a510: 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20 75 6e   the key */.  un
a520: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2a 70 70  ixInodeInfo **pp
a530: 49 6e 6f 64 65 20 20 20 20 20 20 20 20 2f 2a 20  Inode        /* 
a540: 52 65 74 75 72 6e 20 74 68 65 20 75 6e 69 78 49  Return the unixI
a550: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20  nodeInfo object 
a560: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
a570: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
a580: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
a590: 79 73 74 65 6d 20 63 61 6c 6c 20 72 65 74 75 72  ystem call retur
a5a0: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
a5b0: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fd;             
a5c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
a5d0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
a5e0: 72 20 66 6f 72 20 70 46 69 6c 65 20 2a 2f 0a 20  r for pFile */. 
a5f0: 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65   struct unixFile
a600: 49 64 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20  Id fileId;      
a610: 2f 2a 20 4c 6f 6f 6b 75 70 20 6b 65 79 20 66 6f  /* Lookup key fo
a620: 72 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  r the unixInodeI
a630: 6e 66 6f 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nfo */.  struct 
a640: 73 74 61 74 20 73 74 61 74 62 75 66 3b 20 20 20  stat statbuf;   
a650: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c          /* Low-l
a660: 65 76 65 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d  evel file inform
a670: 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 6e 69 78 49  ation */.  unixI
a680: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
a690: 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 43 61 6e   = 0;     /* Can
a6a0: 64 69 64 61 74 65 20 75 6e 69 78 49 6e 6f 64 65  didate unixInode
a6b0: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a  Info object */..
a6c0: 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75    assert( unixMu
a6d0: 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 0a 20 20  texHeld() );..  
a6e0: 2f 2a 20 47 65 74 20 6c 6f 77 2d 6c 65 76 65 6c  /* Get low-level
a6f0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
a700: 75 74 20 74 68 65 20 66 69 6c 65 20 74 68 61 74  ut the file that
a710: 20 77 65 20 63 61 6e 20 75 73 65 64 20 74 6f 0a   we can used to.
a720: 20 20 2a 2a 20 63 72 65 61 74 65 20 61 20 75 6e    ** create a un
a730: 69 71 75 65 20 6e 61 6d 65 20 66 6f 72 20 74 68  ique name for th
a740: 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66  e file..  */.  f
a750: 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20  d = pFile->h;.  
a760: 72 63 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c  rc = osFstat(fd,
a770: 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20 69 66   &statbuf);.  if
a780: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 73  ( rc!=0 ){.    s
a790: 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
a7a0: 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 23 69 66  ile, errno);.#if
a7b0: 20 64 65 66 69 6e 65 64 28 45 4f 56 45 52 46 4c   defined(EOVERFL
a7c0: 4f 57 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  OW) && defined(S
a7d0: 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46  QLITE_DISABLE_LF
a7e0: 53 29 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65  S).    if( pFile
a7f0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 4f 56  ->lastErrno==EOV
a800: 45 52 46 4c 4f 57 20 29 20 72 65 74 75 72 6e 20  ERFLOW ) return 
a810: 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65  SQLITE_NOLFS;.#e
a820: 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
a830: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
a840: 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50 50 4c  }..#ifdef __APPL
a850: 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20 58  E__.  /* On OS X
a860: 20 6f 6e 20 61 6e 20 6d 73 64 6f 73 20 66 69 6c   on an msdos fil
a870: 65 73 79 73 74 65 6d 2c 20 74 68 65 20 69 6e 6f  esystem, the ino
a880: 64 65 20 6e 75 6d 62 65 72 20 69 73 20 72 65 70  de number is rep
a890: 6f 72 74 65 64 0a 20 20 2a 2a 20 69 6e 63 6f 72  orted.  ** incor
a8a0: 72 65 63 74 6c 79 20 66 6f 72 20 7a 65 72 6f 2d  rectly for zero-
a8b0: 73 69 7a 65 20 66 69 6c 65 73 2e 20 20 53 65 65  size files.  See
a8c0: 20 74 69 63 6b 65 74 20 23 33 32 36 30 2e 20 20   ticket #3260.  
a8d0: 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20 61 72 6f  To work.  ** aro
a8e0: 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  und this problem
a8f0: 20 28 77 65 20 63 6f 6e 73 69 64 65 72 20 69 74   (we consider it
a900: 20 61 20 62 75 67 20 69 6e 20 4f 53 20 58 2c 20   a bug in OS X, 
a910: 6e 6f 74 20 53 51 4c 69 74 65 29 0a 20 20 2a 2a  not SQLite).  **
a920: 20 77 65 20 61 6c 77 61 79 73 20 69 6e 63 72 65   we always incre
a930: 61 73 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a  ase the file siz
a940: 65 20 74 6f 20 31 20 62 79 20 77 72 69 74 69 6e  e to 1 by writin
a950: 67 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 0a  g a single byte.
a960: 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61 63    ** prior to ac
a970: 63 65 73 73 69 6e 67 20 74 68 65 20 69 6e 6f 64  cessing the inod
a980: 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 20 6f  e number.  The o
a990: 6e 65 20 62 79 74 65 20 77 72 69 74 74 65 6e 20  ne byte written 
a9a0: 69 73 0a 20 20 2a 2a 20 61 6e 20 41 53 43 49 49  is.  ** an ASCII
a9b0: 20 27 53 27 20 63 68 61 72 61 63 74 65 72 20 77   'S' character w
a9c0: 68 69 63 68 20 61 6c 73 6f 20 68 61 70 70 65 6e  hich also happen
a9d0: 73 20 74 6f 20 62 65 20 74 68 65 20 66 69 72 73  s to be the firs
a9e0: 74 20 62 79 74 65 0a 20 20 2a 2a 20 69 6e 20 74  t byte.  ** in t
a9f0: 68 65 20 68 65 61 64 65 72 20 6f 66 20 65 76 65  he header of eve
aa00: 72 79 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ry SQLite databa
aa10: 73 65 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79  se.  In this way
aa20: 2c 20 69 66 20 74 68 65 72 65 0a 20 20 2a 2a 20  , if there.  ** 
aa30: 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74  is a race condit
aa40: 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 6e  ion such that an
aa50: 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73  other thread has
aa60: 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74   already populat
aa70: 65 64 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73  ed.  ** the firs
aa80: 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
aa90: 74 61 62 61 73 65 2c 20 6e 6f 20 64 61 6d 61 67  tabase, no damag
aaa0: 65 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a  e is done..  */.
aab0: 20 20 69 66 28 20 73 74 61 74 62 75 66 2e 73 74    if( statbuf.st
aac0: 5f 73 69 7a 65 3d 3d 30 20 26 26 20 28 70 46 69  _size==0 && (pFi
aad0: 6c 65 2d 3e 66 73 46 6c 61 67 73 20 26 20 53 51  le->fsFlags & SQ
aae0: 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f  LITE_FSFLAGS_IS_
aaf0: 4d 53 44 4f 53 29 21 3d 30 20 29 7b 0a 20 20 20  MSDOS)!=0 ){.   
ab00: 20 64 6f 7b 20 72 63 20 3d 20 6f 73 57 72 69 74   do{ rc = osWrit
ab10: 65 28 66 64 2c 20 22 53 22 2c 20 31 29 3b 20 7d  e(fd, "S", 1); }
ab20: 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
ab30: 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20  rrno==EINTR );. 
ab40: 20 20 20 69 66 28 20 72 63 21 3d 31 20 29 7b 0a     if( rc!=1 ){.
ab50: 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
ab60: 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e  rrno(pFile, errn
ab70: 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  o);.      return
ab80: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
ab90: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6f 73     }.    rc = os
aba0: 46 73 74 61 74 28 66 64 2c 20 26 73 74 61 74 62  Fstat(fd, &statb
abb0: 75 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  uf);.    if( rc!
abc0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72  =0 ){.      stor
abd0: 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
abe0: 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20  , errno);.      
abf0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
ac00: 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ERR;.    }.  }.#
ac10: 65 6e 64 69 66 0a 0a 20 20 6d 65 6d 73 65 74 28  endif..  memset(
ac20: 26 66 69 6c 65 49 64 2c 20 30 2c 20 73 69 7a 65  &fileId, 0, size
ac30: 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20 66  of(fileId));.  f
ac40: 69 6c 65 49 64 2e 64 65 76 20 3d 20 73 74 61 74  ileId.dev = stat
ac50: 62 75 66 2e 73 74 5f 64 65 76 3b 0a 23 69 66 20  buf.st_dev;.#if 
ac60: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 66 69 6c  OS_VXWORKS.  fil
ac70: 65 49 64 2e 70 49 64 20 3d 20 70 46 69 6c 65 2d  eId.pId = pFile-
ac80: 3e 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20 66 69  >pId;.#else.  fi
ac90: 6c 65 49 64 2e 69 6e 6f 20 3d 20 73 74 61 74 62  leId.ino = statb
aca0: 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64 69  uf.st_ino;.#endi
acb0: 66 0a 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f  f.  pInode = ino
acc0: 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28  deList;.  while(
acd0: 20 70 49 6e 6f 64 65 20 26 26 20 6d 65 6d 63 6d   pInode && memcm
ace0: 70 28 26 66 69 6c 65 49 64 2c 20 26 70 49 6e 6f  p(&fileId, &pIno
acf0: 64 65 2d 3e 66 69 6c 65 49 64 2c 20 73 69 7a 65  de->fileId, size
ad00: 6f 66 28 66 69 6c 65 49 64 29 29 20 29 7b 0a 20  of(fileId)) ){. 
ad10: 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f     pInode = pIno
ad20: 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20  de->pNext;.  }. 
ad30: 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29   if( pInode==0 )
ad40: 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 73  {.    pInode = s
ad50: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
ad60: 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29   sizeof(*pInode)
ad70: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f   );.    if( pIno
ad80: 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  de==0 ){.      r
ad90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
ada0: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  EM;.    }.    me
adb0: 6d 73 65 74 28 70 49 6e 6f 64 65 2c 20 30 2c 20  mset(pInode, 0, 
adc0: 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 29  sizeof(*pInode))
add0: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 49  ;.    memcpy(&pI
ade0: 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 26 66  node->fileId, &f
adf0: 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66 69  ileId, sizeof(fi
ae00: 6c 65 49 64 29 29 3b 0a 20 20 20 20 70 49 6e 6f  leId));.    pIno
ae10: 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  de->nRef = 1;.  
ae20: 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20    pInode->pNext 
ae30: 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20  = inodeList;.   
ae40: 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20 3d   pInode->pPrev =
ae50: 20 30 3b 0a 20 20 20 20 69 66 28 20 69 6e 6f 64   0;.    if( inod
ae60: 65 4c 69 73 74 20 29 20 69 6e 6f 64 65 4c 69 73  eList ) inodeLis
ae70: 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f 64  t->pPrev = pInod
ae80: 65 3b 0a 20 20 20 20 69 6e 6f 64 65 4c 69 73 74  e;.    inodeList
ae90: 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 7d 65 6c   = pInode;.  }el
aea0: 73 65 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  se{.    pInode->
aeb0: 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70  nRef++;.  }.  *p
aec0: 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 3b  pInode = pInode;
aed0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
aee0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
aef0: 74 75 72 6e 20 54 52 55 45 20 69 66 20 70 46 69  turn TRUE if pFi
af00: 6c 65 20 68 61 73 20 62 65 65 6e 20 72 65 6e 61  le has been rena
af10: 6d 65 64 20 6f 72 20 75 6e 6c 69 6e 6b 65 64 20  med or unlinked 
af20: 73 69 6e 63 65 20 69 74 20 77 61 73 20 66 69 72  since it was fir
af30: 73 74 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73 74  st opened..*/.st
af40: 61 74 69 63 20 69 6e 74 20 66 69 6c 65 48 61 73  atic int fileHas
af50: 4d 6f 76 65 64 28 75 6e 69 78 46 69 6c 65 20 2a  Moved(unixFile *
af60: 70 46 69 6c 65 29 7b 0a 23 69 66 20 4f 53 5f 56  pFile){.#if OS_V
af70: 58 57 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e 20  XWORKS.  return 
af80: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d 30  pFile->pInode!=0
af90: 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 64 21 3d   && pFile->pId!=
afa0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 66  pFile->pInode->f
afb0: 69 6c 65 49 64 2e 70 49 64 3b 0a 23 65 6c 73 65  ileId.pId;.#else
afc0: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62  .  struct stat b
afd0: 75 66 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 69  uf;.  return pFi
afe0: 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d 30 20 26 26  le->pInode!=0 &&
aff0: 0a 20 20 20 20 20 20 28 6f 73 53 74 61 74 28 70  .      (osStat(p
b000: 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 62 75  File->zPath, &bu
b010: 66 29 21 3d 30 20 7c 7c 20 62 75 66 2e 73 74 5f  f)!=0 || buf.st_
b020: 69 6e 6f 21 3d 70 46 69 6c 65 2d 3e 70 49 6e 6f  ino!=pFile->pIno
b030: 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 29 3b  de->fileId.ino);
b040: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a  .#endif.}.../*.*
b050: 2a 20 43 68 65 63 6b 20 61 20 75 6e 69 78 46 69  * Check a unixFi
b060: 6c 65 20 74 68 61 74 20 69 73 20 61 20 64 61 74  le that is a dat
b070: 61 62 61 73 65 2e 20 20 56 65 72 69 66 79 20 74  abase.  Verify t
b080: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
b090: 0a 2a 2a 20 28 31 29 20 54 68 65 72 65 20 69 73  .** (1) There is
b0a0: 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 68 61 72   exactly one har
b0b0: 64 20 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 66 69  d link on the fi
b0c0: 6c 65 0a 2a 2a 20 28 32 29 20 54 68 65 20 66 69  le.** (2) The fi
b0d0: 6c 65 20 69 73 20 6e 6f 74 20 61 20 73 79 6d 62  le is not a symb
b0e0: 6f 6c 69 63 20 6c 69 6e 6b 0a 2a 2a 20 28 33 29  olic link.** (3)
b0f0: 20 54 68 65 20 66 69 6c 65 20 68 61 73 20 6e 6f   The file has no
b100: 74 20 62 65 65 6e 20 72 65 6e 61 6d 65 64 20 6f  t been renamed o
b110: 72 20 75 6e 6c 69 6e 6b 65 64 0a 2a 2a 0a 2a 2a  r unlinked.**.**
b120: 20 49 73 73 75 65 20 73 71 6c 69 74 65 33 5f 6c   Issue sqlite3_l
b130: 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  og(SQLITE_WARNIN
b140: 47 2c 2e 2e 2e 29 20 6d 65 73 73 61 67 65 73 20  G,...) messages 
b150: 69 66 20 61 6e 79 74 68 69 6e 67 20 69 73 20 6e  if anything is n
b160: 6f 74 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61  ot right..*/.sta
b170: 74 69 63 20 76 6f 69 64 20 76 65 72 69 66 79 44  tic void verifyD
b180: 62 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a  bFile(unixFile *
b190: 70 46 69 6c 65 29 7b 0a 20 20 73 74 72 75 63 74  pFile){.  struct
b1a0: 20 73 74 61 74 20 62 75 66 3b 0a 20 20 69 6e 74   stat buf;.  int
b1b0: 20 72 63 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73   rc;.  rc = osFs
b1c0: 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62  tat(pFile->h, &b
b1d0: 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30  uf);.  if( rc!=0
b1e0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
b1f0: 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49  log(SQLITE_WARNI
b200: 4e 47 2c 20 22 63 61 6e 6e 6f 74 20 66 73 74 61  NG, "cannot fsta
b210: 74 20 64 62 20 66 69 6c 65 20 25 73 22 2c 20 70  t db file %s", p
b220: 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
b230: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
b240: 69 66 28 20 62 75 66 2e 73 74 5f 6e 6c 69 6e 6b  if( buf.st_nlink
b250: 3d 3d 30 20 26 26 20 28 70 46 69 6c 65 2d 3e 63  ==0 && (pFile->c
b260: 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
b270: 49 4c 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29  ILE_DELETE)==0 )
b280: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
b290: 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  g(SQLITE_WARNING
b2a0: 2c 20 22 66 69 6c 65 20 75 6e 6c 69 6e 6b 65 64  , "file unlinked
b2b0: 20 77 68 69 6c 65 20 6f 70 65 6e 3a 20 25 73 22   while open: %s"
b2c0: 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
b2d0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
b2e0: 0a 20 20 69 66 28 20 62 75 66 2e 73 74 5f 6e 6c  .  if( buf.st_nl
b2f0: 69 6e 6b 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c  ink>1 ){.    sql
b300: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
b310: 57 41 52 4e 49 4e 47 2c 20 22 6d 75 6c 74 69 70  WARNING, "multip
b320: 6c 65 20 6c 69 6e 6b 73 20 74 6f 20 66 69 6c 65  le links to file
b330: 3a 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  : %s", pFile->zP
b340: 61 74 68 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ath);.    return
b350: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 69 6c 65  ;.  }.  if( file
b360: 48 61 73 4d 6f 76 65 64 28 70 46 69 6c 65 29 20  HasMoved(pFile) 
b370: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
b380: 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  og(SQLITE_WARNIN
b390: 47 2c 20 22 66 69 6c 65 20 72 65 6e 61 6d 65 64  G, "file renamed
b3a0: 20 77 68 69 6c 65 20 6f 70 65 6e 3a 20 25 73 22   while open: %s"
b3b0: 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
b3c0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
b3d0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
b3e0: 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
b3f0: 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
b400: 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
b410: 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
b420: 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
b430: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
b440: 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
b450: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73   lock is held, s
b460: 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74  et *pResOut.** t
b470: 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
b480: 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52  ue otherwise *pR
b490: 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
b4a0: 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72  zero.  The retur
b4b0: 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  n value.** is se
b4c0: 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75  t to SQLITE_OK u
b4d0: 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72  nless an I/O err
b4e0: 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
b4f0: 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a   lock checking..
b500: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
b510: 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ixCheckReservedL
b520: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
b530: 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f   *id, int *pResO
b540: 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ut){.  int rc = 
b550: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
b560: 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20   reserved = 0;. 
b570: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
b580: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
b590: 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  ;..  SimulateIOE
b5a0: 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
b5b0: 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
b5c0: 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a  ESERVEDLOCK; );.
b5d0: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
b5e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46   );.  assert( pF
b5f0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ile->eFileLock<=
b600: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
b610: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
b620: 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46  ); /* Because pF
b630: 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73  ile->pInode is s
b640: 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
b650: 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68  eads */..  /* Ch
b660: 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20  eck if a thread 
b670: 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
b680: 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63  holds such a loc
b690: 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  k */.  if( pFile
b6a0: 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ->pInode->eFileL
b6b0: 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
b6c0: 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  ){.    reserved 
b6d0: 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  = 1;.  }..  /* O
b6e0: 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20  therwise see if 
b6f0: 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
b700: 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 2a  ss holds it..  *
b710: 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 44 4a 47 50  /.#ifndef __DJGP
b720: 50 5f 5f 0a 20 20 69 66 28 20 21 72 65 73 65 72  P__.  if( !reser
b730: 76 65 64 20 26 26 20 21 70 46 69 6c 65 2d 3e 70  ved && !pFile->p
b740: 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
b750: 6f 63 6b 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ock ){.    struc
b760: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20  t flock lock;.  
b770: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
b780: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
b790: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52  lock.l_start = R
b7a0: 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20  ESERVED_BYTE;.  
b7b0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31    lock.l_len = 1
b7c0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  ;.    lock.l_typ
b7d0: 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20  e = F_WRLCK;.   
b7e0: 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 46 69   if( osFcntl(pFi
b7f0: 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20  le->h, F_GETLK, 
b800: 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20  &lock) ){.      
b810: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
b820: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
b830: 4f 43 4b 3b 0a 20 20 20 20 20 20 73 74 6f 72 65  OCK;.      store
b840: 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
b850: 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 20 65   errno);.    } e
b860: 6c 73 65 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74  lse if( lock.l_t
b870: 79 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype!=F_UNLCK ){.
b880: 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d        reserved =
b890: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   1;.    }.  }.#e
b8a0: 6e 64 69 66 0a 20 20 0a 20 20 75 6e 69 78 4c 65  ndif.  .  unixLe
b8b0: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53  aveMutex();.  OS
b8c0: 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d  TRACE(("TEST WR-
b8d0: 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 75  LOCK %d %d %d (u
b8e0: 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  nix)\n", pFile->
b8f0: 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29  h, rc, reserved)
b900: 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d  );..  *pResOut =
b910: 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74   reserved;.  ret
b920: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
b930: 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20   Attempt to set 
b940: 61 20 73 79 73 74 65 6d 2d 6c 6f 63 6b 20 6f 6e  a system-lock on
b950: 20 74 68 65 20 66 69 6c 65 20 70 46 69 6c 65 2e   the file pFile.
b960: 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a    The lock is .*
b970: 2a 20 64 65 73 63 72 69 62 65 64 20 62 79 20 70  * described by p
b980: 4c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Lock..**.** If t
b990: 68 65 20 70 46 69 6c 65 20 77 61 73 20 6f 70 65  he pFile was ope
b9a0: 6e 65 64 20 72 65 61 64 2f 77 72 69 74 65 20 66  ned read/write f
b9b0: 72 6f 6d 20 75 6e 69 78 2d 65 78 63 6c 2c 20 74  rom unix-excl, t
b9c0: 68 65 6e 20 74 68 65 20 6f 6e 6c 79 20 6c 6f 63  hen the only loc
b9d0: 6b 0a 2a 2a 20 65 76 65 72 20 6f 62 74 61 69 6e  k.** ever obtain
b9e0: 65 64 20 69 73 20 61 6e 20 65 78 63 6c 75 73 69  ed is an exclusi
b9f0: 76 65 20 6c 6f 63 6b 2c 20 61 6e 64 20 69 74 20  ve lock, and it 
ba00: 69 73 20 6f 62 74 61 69 6e 65 64 20 65 78 61 63  is obtained exac
ba10: 74 6c 79 20 6f 6e 63 65 0a 2a 2a 20 74 68 65 20  tly once.** the 
ba20: 66 69 72 73 74 20 74 69 6d 65 20 61 6e 79 20 6c  first time any l
ba30: 6f 63 6b 20 69 73 20 61 74 74 65 6d 70 74 65 64  ock is attempted
ba40: 2e 20 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e  .  All subsequen
ba50: 74 20 73 79 73 74 65 6d 20 6c 6f 63 6b 69 6e 67  t system locking
ba60: 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 62  .** operations b
ba70: 65 63 6f 6d 65 20 6e 6f 2d 6f 70 73 2e 20 20 4c  ecome no-ops.  L
ba80: 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ocking operation
ba90: 73 20 73 74 69 6c 6c 20 68 61 70 70 65 6e 20 69  s still happen i
baa0: 6e 74 65 72 6e 61 6c 6c 79 2c 0a 2a 2a 20 69 6e  nternally,.** in
bab0: 20 6f 72 64 65 72 20 74 6f 20 63 6f 6f 72 64 69   order to coordi
bac0: 6e 61 74 65 20 61 63 63 65 73 73 20 62 65 74 77  nate access betw
bad0: 65 65 6e 20 73 65 70 61 72 61 74 65 20 64 61 74  een separate dat
bae0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
baf0: 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73  s.** within this
bb00: 20 70 72 6f 63 65 73 73 2c 20 62 75 74 20 61 6c   process, but al
bb10: 6c 20 6f 66 20 74 68 61 74 20 69 73 20 68 61 6e  l of that is han
bb20: 64 6c 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 61  dled in memory a
bb30: 6e 64 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74  nd the.** operat
bb40: 69 6e 67 20 73 79 73 74 65 6d 20 64 6f 65 73 20  ing system does 
bb50: 6e 6f 74 20 70 61 72 74 69 63 69 70 61 74 65 2e  not participate.
bb60: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
bb70: 74 69 6f 6e 20 69 73 20 61 20 70 61 73 73 2d 74  tion is a pass-t
bb80: 68 72 6f 75 67 68 20 74 6f 20 66 63 6e 74 6c 28  hrough to fcntl(
bb90: 46 5f 53 45 54 4c 4b 29 20 69 66 20 70 46 69 6c  F_SETLK) if pFil
bba0: 65 20 69 73 20 75 73 69 6e 67 0a 2a 2a 20 61 6e  e is using.** an
bbb0: 79 20 56 46 53 20 6f 74 68 65 72 20 74 68 61 6e  y VFS other than
bbc0: 20 22 75 6e 69 78 2d 65 78 63 6c 22 20 6f 72 20   "unix-excl" or 
bbd0: 69 66 20 70 46 69 6c 65 20 69 73 20 6f 70 65 6e  if pFile is open
bbe0: 65 64 20 6f 6e 20 22 75 6e 69 78 2d 65 78 63 6c  ed on "unix-excl
bbf0: 22 0a 2a 2a 20 61 6e 64 20 69 73 20 72 65 61 64  ".** and is read
bc00: 2d 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72  -only..**.** Zer
bc10: 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  o is returned if
bc20: 20 74 68 65 20 63 61 6c 6c 20 63 6f 6d 70 6c 65   the call comple
bc30: 74 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  tes successfully
bc40: 2c 20 6f 72 20 2d 31 20 69 66 20 61 20 63 61 6c  , or -1 if a cal
bc50: 6c 0a 2a 2a 20 74 6f 20 66 63 6e 74 6c 28 29 20  l.** to fcntl() 
bc60: 66 61 69 6c 73 2e 20 49 6e 20 74 68 69 73 20 63  fails. In this c
bc70: 61 73 65 2c 20 65 72 72 6e 6f 20 69 73 20 73 65  ase, errno is se
bc80: 74 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 20  t appropriately 
bc90: 28 62 79 20 66 63 6e 74 6c 28 29 29 2e 0a 2a 2f  (by fcntl())..*/
bca0: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
bcb0: 46 69 6c 65 4c 6f 63 6b 28 75 6e 69 78 46 69 6c  FileLock(unixFil
bcc0: 65 20 2a 70 46 69 6c 65 2c 20 73 74 72 75 63 74  e *pFile, struct
bcd0: 20 66 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 29 7b 0a   flock *pLock){.
bce0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78    int rc;.  unix
bcf0: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
bd00: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
bd10: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69  e;.  assert( uni
bd20: 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  xMutexHeld() );.
bd30: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
bd40: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70 46  !=0 );.  if( (pF
bd50: 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
bd60: 20 28 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 7c   (UNIXFILE_EXCL|
bd70: 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 29  UNIXFILE_RDONLY)
bd80: 29 3d 3d 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c  )==UNIXFILE_EXCL
bd90: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f   ){.    if( pIno
bda0: 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
bdb0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72  ==0 ){.      str
bdc0: 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a  uct flock lock;.
bdd0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
bde0: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29  node->nLock==0 )
bdf0: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  ;.      lock.l_w
be00: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
be10: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  ;.      lock.l_s
be20: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
be30: 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  RST;.      lock.
be40: 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
be50: 49 5a 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  IZE;.      lock.
be60: 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b  l_type = F_WRLCK
be70: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6f 73 46  ;.      rc = osF
be80: 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  cntl(pFile->h, F
be90: 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a  _SETLK, &lock);.
bea0: 20 20 20 20 20 20 69 66 28 20 72 63 3c 30 20 29        if( rc<0 )
beb0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
bec0: 20 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65    pInode->bProce
bed0: 73 73 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20  ssLock = 1;.    
bee0: 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b    pInode->nLock+
bef0: 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  +;.    }else{.  
bf00: 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20      rc = 0;.    
bf10: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
bf20: 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c  c = osFcntl(pFil
bf30: 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 70  e->h, F_SETLK, p
bf40: 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Lock);.  }.  ret
bf50: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
bf60: 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77   Lock the file w
bf70: 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65  ith the lock spe
bf80: 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
bf90: 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20  ter eFileLock - 
bfa0: 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
bfb0: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
bfc0: 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
bfd0: 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
bfe0: 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
bff0: 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
c000: 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
c010: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
c020: 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
c030: 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
c040: 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
c050: 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
c060: 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
c070: 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
c080: 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
c090: 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
c0a0: 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
c0b0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
c0c0: 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
c0d0: 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
c0e0: 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
c0f0: 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
c100: 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
c110: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
c120: 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
c130: 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
c140: 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
c150: 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
c160: 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
c170: 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
c180: 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
c190: 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
c1a0: 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
c1b0: 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
c1c0: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
c1d0: 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
c1e0: 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
c1f0: 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
c200: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
c210: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
c220: 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
c230: 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65  ase a lock.  Use
c240: 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   the sqlite3OsUn
c250: 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  lock().** routin
c260: 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63  e to lower a loc
c270: 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73  king level..*/.s
c280: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f  tatic int unixLo
c290: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
c2a0: 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
c2b0: 63 6b 29 7b 0a 20 20 2f 2a 20 54 68 65 20 66 6f  ck){.  /* The fo
c2c0: 6c 6c 6f 77 69 6e 67 20 64 65 73 63 72 69 62 65  llowing describe
c2d0: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
c2e0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 61 72 69  tion of the vari
c2f0: 6f 75 73 20 6c 6f 63 6b 73 20 61 6e 64 0a 20 20  ous locks and.  
c300: 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e 73 69 74 69  ** lock transiti
c310: 6f 6e 73 20 69 6e 20 74 65 72 6d 73 20 6f 66 20  ons in terms of 
c320: 74 68 65 20 50 4f 53 49 58 20 61 64 76 69 73 6f  the POSIX adviso
c330: 72 79 20 73 68 61 72 65 64 20 61 6e 64 20 65 78  ry shared and ex
c340: 63 6c 75 73 69 76 65 0a 20 20 2a 2a 20 6c 6f 63  clusive.  ** loc
c350: 6b 20 70 72 69 6d 69 74 69 76 65 73 20 28 63 61  k primitives (ca
c360: 6c 6c 65 64 20 72 65 61 64 2d 6c 6f 63 6b 73 20  lled read-locks 
c370: 61 6e 64 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20  and write-locks 
c380: 62 65 6c 6f 77 2c 20 74 6f 20 61 76 6f 69 64 0a  below, to avoid.
c390: 20 20 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 77    ** confusion w
c3a0: 69 74 68 20 53 51 4c 69 74 65 20 6c 6f 63 6b 20  ith SQLite lock 
c3b0: 6e 61 6d 65 73 29 2e 20 54 68 65 20 61 6c 67 6f  names). The algo
c3c0: 72 69 74 68 6d 73 20 61 72 65 20 63 6f 6d 70 6c  rithms are compl
c3d0: 69 63 61 74 65 64 0a 20 20 2a 2a 20 73 6c 69 67  icated.  ** slig
c3e0: 68 74 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f  htly in order to
c3f0: 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77   be compatible w
c400: 69 74 68 20 77 69 6e 64 6f 77 73 20 73 79 73 74  ith windows syst
c410: 65 6d 73 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  ems simultaneous
c420: 6c 79 0a 20 20 2a 2a 20 61 63 63 65 73 73 69 6e  ly.  ** accessin
c430: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
c440: 61 73 65 20 66 69 6c 65 2c 20 69 6e 20 63 61 73  ase file, in cas
c450: 65 20 74 68 61 74 20 69 73 20 65 76 65 72 20 72  e that is ever r
c460: 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20  equired..  **.  
c470: 2a 2a 20 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e  ** Symbols defin
c480: 65 64 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e  ed in os.h inden
c490: 74 69 66 79 20 74 68 65 20 27 70 65 6e 64 69 6e  tify the 'pendin
c4a0: 67 20 62 79 74 65 27 20 61 6e 64 20 74 68 65 20  g byte' and the 
c4b0: 27 72 65 73 65 72 76 65 64 0a 20 20 2a 2a 20 62  'reserved.  ** b
c4c0: 79 74 65 27 2c 20 65 61 63 68 20 73 69 6e 67 6c  yte', each singl
c4d0: 65 20 62 79 74 65 73 20 61 74 20 77 65 6c 6c 20  e bytes at well 
c4e0: 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20 61  known offsets, a
c4f0: 6e 64 20 74 68 65 20 27 73 68 61 72 65 64 20 62  nd the 'shared b
c500: 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c  yte.  ** range',
c510: 20 61 20 72 61 6e 67 65 20 6f 66 20 35 31 30 20   a range of 510 
c520: 62 79 74 65 73 20 61 74 20 61 20 77 65 6c 6c 20  bytes at a well 
c530: 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20  known offset..  
c540: 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69  **.  ** To obtai
c550: 6e 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  n a SHARED lock,
c560: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20   a read-lock is 
c570: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
c580: 27 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79  'pending.  ** by
c590: 74 65 27 2e 20 20 49 66 20 74 68 69 73 20 69 73  te'.  If this is
c5a0: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20 72   successful, a r
c5b0: 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20  andom byte from 
c5c0: 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65  the 'shared byte
c5d0: 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20  .  ** range' is 
c5e0: 72 65 61 64 2d 6c 6f 63 6b 65 64 20 61 6e 64 20  read-locked and 
c5f0: 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
c600: 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 72  'pending byte' r
c610: 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2a 0a 20 20  eleased..  **.  
c620: 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79  ** A process may
c630: 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 52   only obtain a R
c640: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 66 74  ESERVED lock aft
c650: 65 72 20 69 74 20 68 61 73 20 61 20 53 48 41 52  er it has a SHAR
c660: 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20  ED lock..  ** A 
c670: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
c680: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
c690: 67 72 61 62 62 69 6e 67 20 61 20 77 72 69 74 65  grabbing a write
c6a0: 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a  -lock on the.  *
c6b0: 2a 20 27 72 65 73 65 72 76 65 64 20 62 79 74 65  * 'reserved byte
c6c0: 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  '. .  **.  ** A 
c6d0: 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79  process may only
c6e0: 20 6f 62 74 61 69 6e 20 61 20 50 45 4e 44 49 4e   obtain a PENDIN
c6f0: 47 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20  G lock after it 
c700: 68 61 73 20 6f 62 74 61 69 6e 65 64 20 61 0a 20  has obtained a. 
c710: 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e   ** SHARED lock.
c720: 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
c730: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  is implemented b
c740: 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72  y obtaining a wr
c750: 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e  ite-lock.  ** on
c760: 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79   the 'pending by
c770: 74 65 27 2e 20 54 68 69 73 20 65 6e 73 75 72 65  te'. This ensure
c780: 73 20 74 68 61 74 20 6e 6f 20 6e 65 77 20 53 48  s that no new SH
c790: 41 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62  ARED locks can b
c7a0: 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c  e.  ** obtained,
c7b0: 20 62 75 74 20 65 78 69 73 74 69 6e 67 20 53 48   but existing SH
c7c0: 41 52 45 44 20 6c 6f 63 6b 73 20 61 72 65 20 61  ARED locks are a
c7d0: 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72 73 69 73  llowed to persis
c7e0: 74 2e 20 41 20 70 72 6f 63 65 73 73 0a 20 20 2a  t. A process.  *
c7f0: 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  * does not have 
c800: 74 6f 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45  to obtain a RESE
c810: 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
c820: 20 77 61 79 20 74 6f 20 61 20 50 45 4e 44 49 4e   way to a PENDIN
c830: 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69  G lock..  ** Thi
c840: 73 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73  s property is us
c850: 65 64 20 62 79 20 74 68 65 20 61 6c 67 6f 72 69  ed by the algori
c860: 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20  thm for rolling 
c870: 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66  back a journal f
c880: 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72 20 61  ile.  ** after a
c890: 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a   crash..  **.  *
c8a0: 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  * An EXCLUSIVE l
c8b0: 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61 66  ock, obtained af
c8c0: 74 65 72 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  ter a PENDING lo
c8d0: 63 6b 20 69 73 20 68 65 6c 64 2c 20 69 73 0a 20  ck is held, is. 
c8e0: 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   ** implemented 
c8f0: 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77  by obtaining a w
c900: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
c910: 20 65 6e 74 69 72 65 20 27 73 68 61 72 65 64 20   entire 'shared 
c920: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
c930: 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65  . Since all othe
c940: 72 20 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 20  r locks require 
c950: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f  a read-lock on o
c960: 6e 65 20 6f 66 20 74 68 65 20 62 79 74 65 73 0a  ne of the bytes.
c970: 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73    ** within this
c980: 20 72 61 6e 67 65 2c 20 74 68 69 73 20 65 6e 73   range, this ens
c990: 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68  ures that no oth
c9a0: 65 72 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c  er locks are hel
c9b0: 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  d on the.  ** da
c9c0: 74 61 62 61 73 65 2e 20 0a 20 20 2a 2a 0a 20 20  tabase. .  **.  
c9d0: 2a 2a 20 54 68 65 20 72 65 61 73 6f 6e 20 61 20  ** The reason a 
c9e0: 73 69 6e 67 6c 65 20 62 79 74 65 20 63 61 6e 6e  single byte cann
c9f0: 6f 74 20 62 65 20 75 73 65 64 20 69 6e 73 74 65  ot be used inste
ca00: 61 64 20 6f 66 20 74 68 65 20 27 73 68 61 72 65  ad of the 'share
ca10: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
ca20: 65 27 20 69 73 20 74 68 61 74 20 73 6f 6d 65 20  e' is that some 
ca30: 76 65 72 73 69 6f 6e 73 20 6f 66 20 77 69 6e 64  versions of wind
ca40: 6f 77 73 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f  ows do not suppo
ca50: 72 74 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 20 42  rt read-locks. B
ca60: 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61  y.  ** locking a
ca70: 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f   random byte fro
ca80: 6d 20 61 20 72 61 6e 67 65 2c 20 63 6f 6e 63 75  m a range, concu
ca90: 72 72 65 6e 74 20 53 48 41 52 45 44 20 6c 6f 63  rrent SHARED loc
caa0: 6b 73 20 6d 61 79 20 65 78 69 73 74 0a 20 20 2a  ks may exist.  *
cab0: 2a 20 65 76 65 6e 20 69 66 20 74 68 65 20 6c 6f  * even if the lo
cac0: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 20  cking primitive 
cad0: 75 73 65 64 20 69 73 20 61 6c 77 61 79 73 20 61  used is always a
cae0: 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a   write-lock..  *
caf0: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
cb00: 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
cb10: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
cb20: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69  xFile*)id;.  uni
cb30: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
cb40: 64 65 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  de;.  struct flo
cb50: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 74  ck lock;.  int t
cb60: 45 72 72 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73  Errno = 0;..  as
cb70: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
cb80: 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
cb90: 20 20 20 25 64 20 25 73 20 77 61 73 20 25 73 28     %d %s was %s(
cba0: 25 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75  %s,%d) pid=%d (u
cbb0: 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  nix)\n", pFile->
cbc0: 68 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c  h,.      azFileL
cbd0: 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  ock(eFileLock), 
cbe0: 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  azFileLock(pFile
cbf0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20  ->eFileLock),.  
cc00: 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70      azFileLock(p
cc10: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46  File->pInode->eF
cc20: 69 6c 65 4c 6f 63 6b 29 2c 20 70 46 69 6c 65 2d  ileLock), pFile-
cc30: 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64  >pInode->nShared
cc40: 2c 0a 20 20 20 20 20 20 6f 73 47 65 74 70 69 64  ,.      osGetpid
cc50: 28 30 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  (0)));..  /* If 
cc60: 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
cc70: 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20   a lock of this 
cc80: 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73  type or more res
cc90: 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a  trictive on the.
cca0: 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64    ** unixFile, d
ccb0: 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74  o nothing. Don't
ccc0: 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63   use the end_loc
ccd0: 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73  k: exit path, as
cce0: 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d  .  ** unixEnterM
ccf0: 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65  utex() hasn't be
cd00: 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20  en called yet.. 
cd10: 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
cd20: 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c  >eFileLock>=eFil
cd30: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54  eLock ){.    OST
cd40: 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
cd50: 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79  d %s ok (already
cd60: 20 68 65 6c 64 29 20 28 75 6e 69 78 29 5c 6e 22   held) (unix)\n"
cd70: 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  , pFile->h,.    
cd80: 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f          azFileLo
cd90: 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b  ck(eFileLock)));
cda0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
cdb0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
cdc0: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c   Make sure the l
cdd0: 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20  ocking sequence 
cde0: 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2a  is correct..  **
cdf0: 20 20 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d    (1) We never m
ce00: 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65  ove from unlocke
ce10: 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69  d to anything hi
ce20: 67 68 65 72 20 74 68 61 6e 20 73 68 61 72 65 64  gher than shared
ce30: 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29   lock..  **  (2)
ce40: 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78   SQLite never ex
ce50: 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73 74  plicitly request
ce60: 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e  s a pendig lock.
ce70: 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61  .  **  (3) A sha
ce80: 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61  red lock is alwa
ce90: 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72  ys held when a r
cea0: 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72  eserve lock is r
ceb0: 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20  equested..  */. 
cec0: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
ced0: 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f  eFileLock!=NO_LO
cee0: 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d  CK || eFileLock=
cef0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
cf00: 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
cf10: 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock!=PENDING_LOC
cf20: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  K );.  assert( e
cf30: 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56  FileLock!=RESERV
cf40: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65  ED_LOCK || pFile
cf50: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ->eFileLock==SHA
cf60: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  RED_LOCK );..  /
cf70: 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69 73 20  * This mutex is 
cf80: 6e 65 65 64 65 64 20 62 65 63 61 75 73 65 20 70  needed because p
cf90: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20  File->pInode is 
cfa0: 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68  shared across th
cfb0: 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69  reads.  */.  uni
cfc0: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
cfd0: 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d   pInode = pFile-
cfe0: 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49  >pInode;..  /* I
cff0: 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73  f some thread us
d000: 69 6e 67 20 74 68 69 73 20 50 49 44 20 68 61 73  ing this PID has
d010: 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69   a lock via a di
d020: 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65  fferent unixFile
d030: 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68  *.  ** handle th
d040: 61 74 20 70 72 65 63 6c 75 64 65 73 20 74 68 65  at precludes the
d050: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c   requested lock,
d060: 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20   return BUSY..  
d070: 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d  */.  if( (pFile-
d080: 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f  >eFileLock!=pIno
d090: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26  de->eFileLock &&
d0a0: 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 49 6e   .          (pIn
d0b0: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ode->eFileLock>=
d0c0: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20  PENDING_LOCK || 
d0d0: 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
d0e0: 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20  _LOCK)).  ){.   
d0f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
d100: 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  Y;.    goto end_
d110: 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  lock;.  }..  /* 
d120: 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  If a SHARED lock
d130: 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 61   is requested, a
d140: 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75  nd some thread u
d150: 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c  sing this PID al
d160: 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61  ready.  ** has a
d170: 20 53 48 41 52 45 44 20 6f 72 20 52 45 53 45 52   SHARED or RESER
d180: 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69  VED lock, then i
d190: 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e  ncrement referen
d1a0: 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20  ce counts and.  
d1b0: 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
d1c0: 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  _OK..  */.  if( 
d1d0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
d1e0: 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20  D_LOCK && .     
d1f0: 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c   (pInode->eFileL
d200: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
d210: 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c   || pInode->eFil
d220: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
d230: 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73  LOCK) ){.    ass
d240: 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ert( eFileLock==
d250: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
d260: 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
d270: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29  ->eFileLock==0 )
d280: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
d290: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20  node->nShared>0 
d2a0: 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  );.    pFile->eF
d2b0: 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44  ileLock = SHARED
d2c0: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64  _LOCK;.    pInod
d2d0: 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20  e->nShared++;.  
d2e0: 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b    pInode->nLock+
d2f0: 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  +;.    goto end_
d300: 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a  lock;.  }...  /*
d310: 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
d320: 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65  is needed before
d330: 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41   acquiring a SHA
d340: 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66  RED lock and bef
d350: 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69  ore.  ** acquiri
d360: 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
d370: 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53  lock.  For the S
d380: 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20  HARED lock, the 
d390: 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a  PENDING will.  *
d3a0: 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20  * be released.. 
d3b0: 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e   */.  lock.l_len
d3c0: 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f   = 1L;.  lock.l_
d3d0: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
d3e0: 54 3b 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  T;.  if( eFileLo
d3f0: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
d400: 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65  .      || (eFile
d410: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
d420: 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65  LOCK && pFile->e
d430: 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47  FileLock<PENDING
d440: 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20  _LOCK).  ){.    
d450: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28 65  lock.l_type = (e
d460: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
d470: 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f  _LOCK?F_RDLCK:F_
d480: 57 52 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b  WRLCK);.    lock
d490: 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49  .l_start = PENDI
d4a0: 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 69 66 28  NG_BYTE;.    if(
d4b0: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
d4c0: 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20  ile, &lock) ){. 
d4d0: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
d4e0: 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
d4f0: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
d500: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
d510: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
d520: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
d530: 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc!=SQLITE_BUSY 
d540: 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65  ){.        store
d550: 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
d560: 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20   tErrno);.      
d570: 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  }.      goto end
d580: 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  _lock;.    }.  }
d590: 0a 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72  ...  /* If contr
d5a0: 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73 20  ol gets to this 
d5b0: 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75  point, then actu
d5c0: 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e  ally go ahead an
d5d0: 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72  d make.  ** oper
d5e0: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c  ating system cal
d5f0: 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  ls for the speci
d600: 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a  fied lock..  */.
d610: 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
d620: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
d630: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
d640: 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29  de->nShared==0 )
d650: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
d660: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
d670: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
d680: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
d690: 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67  );..    /* Now g
d6a0: 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b  et the read-lock
d6b0: 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73   */.    lock.l_s
d6c0: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
d6d0: 52 53 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  RST;.    lock.l_
d6e0: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
d6f0: 45 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46  E;.    if( unixF
d700: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
d710: 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74  lock) ){.      t
d720: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
d730: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d740: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
d750: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
d760: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
d770: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 72      }..    /* Dr
d780: 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  op the temporary
d790: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f   PENDING lock */
d7a0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  .    lock.l_star
d7b0: 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  t = PENDING_BYTE
d7c0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  ;.    lock.l_len
d7d0: 20 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e   = 1L;.    lock.
d7e0: 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
d7f0: 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69  ;.    if( unixFi
d800: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
d810: 6f 63 6b 29 20 26 26 20 72 63 3d 3d 53 51 4c 49  ock) && rc==SQLI
d820: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
d830: 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 68 61 70  * This could hap
d840: 70 65 6e 20 77 69 74 68 20 61 20 6e 65 74 77 6f  pen with a netwo
d850: 72 6b 20 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20 20  rk mount */.    
d860: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
d870: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
d880: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
d890: 3b 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  ; .    }..    if
d8a0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66  ( rc ){.      if
d8b0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc!=SQLITE_BUS
d8c0: 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f  Y ){.        sto
d8d0: 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
d8e0: 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20  e, tErrno);.    
d8f0: 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65    }.      goto e
d900: 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c  nd_lock;.    }el
d910: 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  se{.      pFile-
d920: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
d930: 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  RED_LOCK;.      
d940: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  pInode->nLock++;
d950: 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  .      pInode->n
d960: 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20  Shared = 1;.    
d970: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46  }.  }else if( eF
d980: 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
d990: 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64  VE_LOCK && pInod
d9a0: 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a  e->nShared>1 ){.
d9b0: 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72      /* We are tr
d9c0: 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c  ying for an excl
d9d0: 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61  usive lock but a
d9e0: 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 6e  nother thread in
d9f0: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 73 61 6d   this.    ** sam
da00: 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69  e process is sti
da10: 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61  ll holding a sha
da20: 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20  red lock. */.   
da30: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
da40: 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
da50: 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 77  /* The request w
da60: 61 73 20 66 6f 72 20 61 20 52 45 53 45 52 56 45  as for a RESERVE
da70: 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
da80: 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20  ock.  It is.    
da90: 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  ** assumed that 
daa0: 74 68 65 72 65 20 69 73 20 61 20 53 48 41 52 45  there is a SHARE
dab0: 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  D or greater loc
dac0: 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20  k on the file.  
dad0: 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20    ** already..  
dae0: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
daf0: 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65   0!=pFile->eFile
db00: 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 6c 6f 63 6b  Lock );.    lock
db10: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43  .l_type = F_WRLC
db20: 4b 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  K;..    assert( 
db30: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
db40: 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c  VED_LOCK || eFil
db50: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
db60: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 69 66 28  _LOCK );.    if(
db70: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45   eFileLock==RESE
db80: 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RVED_LOCK ){.   
db90: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
dba0: 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b  = RESERVED_BYTE;
dbb0: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  .      lock.l_le
dbc0: 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 7d 65 6c 73  n = 1L;.    }els
dbd0: 65 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  e{.      lock.l_
dbe0: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
dbf0: 49 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  IRST;.      lock
dc00: 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f  .l_len = SHARED_
dc10: 53 49 5a 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  SIZE;.    }..   
dc20: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
dc30: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20  k(pFile, &lock) 
dc40: 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  ){.      tErrno 
dc50: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
dc60: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
dc70: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
dc80: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
dc90: 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  RR_LOCK);.      
dca0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42  if( rc!=SQLITE_B
dcb0: 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73  USY ){.        s
dcc0: 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
dcd0: 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
dce0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
dcf0: 20 20 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54    ..#ifdef SQLIT
dd00: 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 53 65 74  E_DEBUG.  /* Set
dd10: 20 75 70 20 74 68 65 20 74 72 61 6e 73 61 63 74   up the transact
dd20: 69 6f 6e 2d 63 6f 75 6e 74 65 72 20 63 68 61 6e  ion-counter chan
dd30: 67 65 20 63 68 65 63 6b 69 6e 67 20 66 6c 61 67  ge checking flag
dd40: 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74 72 61 6e  s when.  ** tran
dd50: 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 61  sitioning from a
dd60: 20 53 48 41 52 45 44 20 74 6f 20 61 20 52 45 53   SHARED to a RES
dd70: 45 52 56 45 44 20 6c 6f 63 6b 2e 20 20 54 68 65  ERVED lock.  The
dd80: 20 63 68 61 6e 67 65 0a 20 20 2a 2a 20 66 72 6f   change.  ** fro
dd90: 6d 20 53 48 41 52 45 44 20 74 6f 20 52 45 53 45  m SHARED to RESE
dda0: 52 56 45 44 20 6d 61 72 6b 73 20 74 68 65 20 62  RVED marks the b
ddb0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 6e 6f  eginning of a no
ddc0: 72 6d 61 6c 0a 20 20 2a 2a 20 77 72 69 74 65 20  rmal.  ** write 
ddd0: 6f 70 65 72 61 74 69 6f 6e 20 28 6e 6f 74 20 61  operation (not a
dde0: 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot journal rol
ddf0: 6c 62 61 63 6b 29 2e 0a 20 20 2a 2f 0a 20 20 69  lback)..  */.  i
de00: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
de10: 0a 20 20 20 26 26 20 70 46 69 6c 65 2d 3e 65 46  .   && pFile->eF
de20: 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
de30: 4c 4f 43 4b 0a 20 20 20 26 26 20 65 46 69 6c 65  LOCK.   && eFile
de40: 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
de50: 4f 43 4b 0a 20 20 29 7b 0a 20 20 20 20 70 46 69  OCK.  ){.    pFi
de60: 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e  le->transCntrChn
de70: 67 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65  g = 0;.    pFile
de80: 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a  ->dbUpdate = 0;.
de90: 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72      pFile->inNor
dea0: 6d 61 6c 57 72 69 74 65 20 3d 20 31 3b 0a 20 20  malWrite = 1;.  
deb0: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 69 66 28  }.#endif...  if(
dec0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
ded0: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
dee0: 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
def0: 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ck;.    pInode->
df00: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
df10: 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69  eLock;.  }else i
df20: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  f( eFileLock==EX
df30: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
df40: 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
df50: 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  Lock = PENDING_L
df60: 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  OCK;.    pInode-
df70: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e  >eFileLock = PEN
df80: 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a  DING_LOCK;.  }..
df90: 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78  end_lock:.  unix
dfa0: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
dfb0: 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
dfc0: 20 20 25 64 20 25 73 20 25 73 20 28 75 6e 69 78    %d %s %s (unix
dfd0: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
dfe0: 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
dff0: 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 72 63  Lock), .      rc
e000: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f  ==SQLITE_OK ? "o
e010: 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
e020: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
e030: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 66  ./*.** Add the f
e040: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 75  ile descriptor u
e050: 73 65 64 20 62 79 20 66 69 6c 65 20 68 61 6e 64  sed by file hand
e060: 6c 65 20 70 46 69 6c 65 20 74 6f 20 74 68 65 20  le pFile to the 
e070: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
e080: 20 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a   pUnused list..*
e090: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
e0a0: 74 50 65 6e 64 69 6e 67 46 64 28 75 6e 69 78 46  tPendingFd(unixF
e0b0: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75  ile *pFile){.  u
e0c0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
e0d0: 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
e0e0: 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73  node;.  UnixUnus
e0f0: 65 64 46 64 20 2a 70 20 3d 20 70 46 69 6c 65 2d  edFd *p = pFile-
e100: 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70 2d 3e 70  >pUnused;.  p->p
e110: 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70  Next = pInode->p
e120: 55 6e 75 73 65 64 3b 0a 20 20 70 49 6e 6f 64 65  Unused;.  pInode
e130: 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 3b 0a 20  ->pUnused = p;. 
e140: 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a   pFile->h = -1;.
e150: 20 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64    pFile->pUnused
e160: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c   = 0;.}../*.** L
e170: 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
e180: 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
e190: 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
e1a0: 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
e1b0: 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
e1c0: 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
e1d0: 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
e1e0: 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
e1f0: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
e200: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
e210: 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
e220: 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
e230: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
e240: 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
e250: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
e260: 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 68  -op..** .** If h
e270: 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 69  andleNFSUnlock i
e280: 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 20  s true, then on 
e290: 64 6f 77 6e 67 72 61 64 69 6e 67 20 61 6e 20 45  downgrading an E
e2a0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 74 6f  XCLUSIVE_LOCK to
e2b0: 20 53 48 41 52 45 44 0a 2a 2a 20 74 68 65 20 62   SHARED.** the b
e2c0: 79 74 65 20 72 61 6e 67 65 20 69 73 20 64 69 76  yte range is div
e2d0: 69 64 65 64 20 69 6e 74 6f 20 32 20 70 61 72 74  ided into 2 part
e2e0: 73 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  s and the first 
e2f0: 70 61 72 74 20 69 73 20 75 6e 6c 6f 63 6b 65 64  part is unlocked
e300: 20 74 68 65 6e 0a 2a 2a 20 73 65 74 20 74 6f 20   then.** set to 
e310: 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 74 68 65  a read lock, the
e320: 6e 20 74 68 65 20 6f 74 68 65 72 20 70 61 72 74  n the other part
e330: 20 69 73 20 73 69 6d 70 6c 79 20 75 6e 6c 6f 63   is simply unloc
e340: 6b 65 64 2e 20 20 54 68 69 73 20 77 6f 72 6b 73  ked.  This works
e350: 20 0a 2a 2a 20 61 72 6f 75 6e 64 20 61 20 62 75   .** around a bu
e360: 67 20 69 6e 20 42 53 44 20 4e 46 53 20 6c 6f 63  g in BSD NFS loc
e370: 6b 64 20 28 61 6c 73 6f 20 73 65 65 6e 20 6f 6e  kd (also seen on
e380: 20 4d 61 63 4f 53 58 20 31 30 2e 33 2b 29 20 74   MacOSX 10.3+) t
e390: 68 61 74 20 66 61 69 6c 73 20 74 6f 20 0a 2a 2a  hat fails to .**
e3a0: 20 72 65 6d 6f 76 65 20 74 68 65 20 77 72 69 74   remove the writ
e3b0: 65 20 6c 6f 63 6b 20 6f 6e 20 61 20 72 65 67 69  e lock on a regi
e3c0: 6f 6e 20 77 68 65 6e 20 61 20 72 65 61 64 20 6c  on when a read l
e3d0: 6f 63 6b 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 73  ock is set..*/.s
e3e0: 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78 55  tatic int posixU
e3f0: 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
e400: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
e410: 65 4c 6f 63 6b 2c 20 69 6e 74 20 68 61 6e 64 6c  eLock, int handl
e420: 65 4e 46 53 55 6e 6c 6f 63 6b 29 7b 0a 20 20 75  eNFSUnlock){.  u
e430: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
e440: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
e450: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
e460: 2a 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63  *pInode;.  struc
e470: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20  t flock lock;.  
e480: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
e490: 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
e4a0: 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
e4b0: 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
e4c0: 64 20 77 61 73 20 25 64 28 25 64 2c 25 64 29 20  d was %d(%d,%d) 
e4d0: 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22  pid=%d (unix)\n"
e4e0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c  , pFile->h, eFil
e4f0: 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 70 46 69  eLock,.      pFi
e500: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70  le->eFileLock, p
e510: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46  File->pInode->eF
e520: 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e  ileLock, pFile->
e530: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c  pInode->nShared,
e540: 0a 20 20 20 20 20 20 6f 73 47 65 74 70 69 64 28  .      osGetpid(
e550: 30 29 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  0)));..  assert(
e560: 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52   eFileLock<=SHAR
e570: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28  ED_LOCK );.  if(
e580: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
e590: 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a  k<=eFileLock ){.
e5a0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e5b0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78  E_OK;.  }.  unix
e5c0: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
e5d0: 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
e5e0: 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74  pInode;.  assert
e5f0: 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
e600: 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46  d!=0 );.  if( pF
e610: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53  ile->eFileLock>S
e620: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
e630: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
e640: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69  ->eFileLock==pFi
e650: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b  le->eFileLock );
e660: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
e670: 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65  DEBUG.    /* Whe
e680: 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63  n reducing a loc
e690: 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74 68 65  k such that othe
e6a0: 72 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20  r processes can 
e6b0: 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61  start.    ** rea
e6c0: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
e6d0: 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61  e file again, ma
e6e0: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
e6f0: 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
e700: 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20  ion counter was 
e710: 75 70 64 61 74 65 64 20 69 66 20 61 6e 79 20 70  updated if any p
e720: 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  art of the datab
e730: 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  ase.    ** file 
e740: 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65  changed.  If the
e750: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
e760: 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61  nter is not upda
e770: 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65  ted,.    ** othe
e780: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f  r connections to
e790: 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d   the same file m
e7a0: 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65  ight not realize
e7b0: 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65   that.    ** the
e7c0: 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65   file has change
e7d0: 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68  d and hence migh
e7e0: 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c  t not know to fl
e7f0: 75 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a  ush their.    **
e800: 20 63 61 63 68 65 2e 20 20 54 68 65 20 75 73 65   cache.  The use
e810: 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63 68   of a stale cach
e820: 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61  e can lead to da
e830: 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
e840: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 46  n..    */.    pF
e850: 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
e860: 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  te = 0;.#endif..
e870: 20 20 20 20 2f 2a 20 64 6f 77 6e 67 72 61 64 69      /* downgradi
e880: 6e 67 20 74 6f 20 61 20 73 68 61 72 65 64 20 6c  ng to a shared l
e890: 6f 63 6b 20 6f 6e 20 4e 46 53 20 69 6e 76 6f 6c  ock on NFS invol
e8a0: 76 65 73 20 63 6c 65 61 72 69 6e 67 20 74 68 65  ves clearing the
e8b0: 20 77 72 69 74 65 20 6c 6f 63 6b 0a 20 20 20 20   write lock.    
e8c0: 2a 2a 20 62 65 66 6f 72 65 20 65 73 74 61 62 6c  ** before establ
e8d0: 69 73 68 69 6e 67 20 74 68 65 20 72 65 61 64 6c  ishing the readl
e8e0: 6f 63 6b 20 2d 20 74 6f 20 61 76 6f 69 64 20 61  ock - to avoid a
e8f0: 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   race condition 
e900: 77 65 20 64 6f 77 6e 67 72 61 64 65 0a 20 20 20  we downgrade.   
e910: 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 20 69 6e 20   ** the lock in 
e920: 32 20 62 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 61  2 blocks, so tha
e930: 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 61  t part of the ra
e940: 6e 67 65 20 77 69 6c 6c 20 62 65 20 63 6f 76 65  nge will be cove
e950: 72 65 64 20 62 79 20 61 20 0a 20 20 20 20 2a 2a  red by a .    **
e960: 20 77 72 69 74 65 20 6c 6f 63 6b 20 75 6e 74 69   write lock unti
e970: 6c 20 74 68 65 20 72 65 73 74 20 69 73 20 63 6f  l the rest is co
e980: 76 65 72 65 64 20 62 79 20 61 20 72 65 61 64 20  vered by a read 
e990: 6c 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20 20 31 3a  lock:.    **  1:
e9a0: 20 20 20 5b 57 57 57 57 57 5d 0a 20 20 20 20 2a     [WWWWW].    *
e9b0: 2a 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e 57 5d 0a  *  2:   [....W].
e9c0: 20 20 20 20 2a 2a 20 20 33 3a 20 20 20 5b 52 52      **  3:   [RR
e9d0: 52 52 57 5d 0a 20 20 20 20 2a 2a 20 20 34 3a 20  RRW].    **  4: 
e9e0: 20 20 5b 52 52 52 52 2e 5d 0a 20 20 20 20 2a 2f    [RRRR.].    */
e9f0: 0a 20 20 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  .    if( eFileLo
ea00: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
ea10: 29 7b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ){.#if !defined(
ea20: 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 21 53  __APPLE__) || !S
ea30: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
ea40: 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20  KING_STYLE.     
ea50: 20 28 76 6f 69 64 29 68 61 6e 64 6c 65 4e 46 53   (void)handleNFS
ea60: 55 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73  Unlock;.      as
ea70: 73 65 72 74 28 20 68 61 6e 64 6c 65 4e 46 53 55  sert( handleNFSU
ea80: 6e 6c 6f 63 6b 3d 3d 30 20 29 3b 0a 23 65 6e 64  nlock==0 );.#end
ea90: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  if.#if defined(_
eaa0: 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
eab0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
eac0: 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 69  NG_STYLE.      i
ead0: 66 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  f( handleNFSUnlo
eae0: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ck ){.        in
eaf0: 74 20 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20  t tErrno;       
eb00: 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
eb10: 20 63 6f 64 65 20 66 72 6f 6d 20 73 79 73 74 65   code from syste
eb20: 6d 20 63 61 6c 6c 20 65 72 72 6f 72 73 20 2a 2f  m call errors */
eb30: 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20 64  .        off_t d
eb40: 69 76 53 69 7a 65 20 3d 20 53 48 41 52 45 44 5f  ivSize = SHARED_
eb50: 53 49 5a 45 20 2d 20 31 3b 0a 20 20 20 20 20 20  SIZE - 1;.      
eb60: 20 20 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e    .        lock.
eb70: 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
eb80: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
eb90: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
eba0: 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ET;.        lock
ebb0: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
ebc0: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20  D_FIRST;.       
ebd0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69   lock.l_len = di
ebe0: 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  vSize;.        i
ebf0: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
ec00: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28  pFile, &lock)==(
ec10: 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -1) ){.         
ec20: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
ec30: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
ec40: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
ec50: 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 73  OCK;.          s
ec60: 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
ec70: 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
ec80: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
ec90: 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  _unlock;.       
eca0: 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e   }.        lock.
ecb0: 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
ecc0: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
ecd0: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
ece0: 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ET;.        lock
ecf0: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
ed00: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20  D_FIRST;.       
ed10: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69   lock.l_len = di
ed20: 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  vSize;.        i
ed30: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
ed40: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28  pFile, &lock)==(
ed50: 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -1) ){.         
ed60: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
ed70: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
ed80: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
ed90: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
eda0: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  , SQLITE_IOERR_R
edb0: 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  DLOCK);.        
edc0: 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
edd0: 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
ede0: 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
edf0: 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
ee00: 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rno);.          
ee10: 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  }.          goto
ee20: 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
ee30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c       }.        l
ee40: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
ee50: 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f  NLCK;.        lo
ee60: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
ee70: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20  EK_SET;.        
ee80: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
ee90: 48 41 52 45 44 5f 46 49 52 53 54 2b 64 69 76 53  HARED_FIRST+divS
eea0: 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  ize;.        loc
eeb0: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
eec0: 5f 53 49 5a 45 2d 64 69 76 53 69 7a 65 3b 0a 20  _SIZE-divSize;. 
eed0: 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46         if( unixF
eee0: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
eef0: 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20  lock)==(-1) ){. 
ef00: 20 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20           tErrno 
ef10: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
ef20: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
ef30: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  OERR_UNLOCK;.   
ef40: 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
ef50: 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
ef60: 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rno);.          
ef70: 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b  goto end_unlock;
ef80: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ef90: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a   }else.#endif /*
efa0: 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
efb0: 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
efc0: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
efd0: 4c 45 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20  LE */.      {.  
efe0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
eff0: 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20  e = F_RDLCK;.   
f000: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
f010: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
f020: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74         lock.l_st
f030: 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
f040: 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ST;.        lock
f050: 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f  .l_len = SHARED_
f060: 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 69 66  SIZE;.        if
f070: 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
f080: 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a  File, &lock) ){.
f090: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
f0a0: 74 68 65 6f 72 79 2c 20 74 68 65 20 63 61 6c 6c  theory, the call
f0b0: 20 74 6f 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b   to unixFileLock
f0c0: 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 62  () cannot fail b
f0d0: 65 63 61 75 73 65 20 61 6e 6f 74 68 65 72 0a 20  ecause another. 
f0e0: 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
f0f0: 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 61  ess is holding a
f100: 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6c  n incompatible l
f110: 6f 63 6b 2e 20 49 66 20 69 74 20 64 6f 65 73 2c  ock. If it does,
f120: 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20   this .         
f130: 20 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 74 68   ** indicates th
f140: 61 74 20 74 68 65 20 6f 74 68 65 72 20 70 72 6f  at the other pro
f150: 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c  cess is not foll
f160: 6f 77 69 6e 67 20 74 68 65 20 6c 6f 63 6b 69 6e  owing the lockin
f170: 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  g.          ** p
f180: 72 6f 74 6f 63 6f 6c 2e 20 49 66 20 74 68 69 73  rotocol. If this
f190: 20 68 61 70 70 65 6e 73 2c 20 72 65 74 75 72 6e   happens, return
f1a0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44   SQLITE_IOERR_RD
f1b0: 4c 4f 43 4b 2e 20 52 65 74 75 72 6e 69 6e 67 0a  LOCK. Returning.
f1c0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c            ** SQL
f1d0: 49 54 45 5f 42 55 53 59 20 77 6f 75 6c 64 20 63  ITE_BUSY would c
f1e0: 6f 6e 66 75 73 65 20 74 68 65 20 75 70 70 65 72  onfuse the upper
f1f0: 20 6c 61 79 65 72 20 28 69 6e 20 70 72 61 63 74   layer (in pract
f200: 69 63 65 20 69 74 20 63 61 75 73 65 73 20 0a 20  ice it causes . 
f210: 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 20 61           ** an a
f220: 73 73 65 72 74 20 74 6f 20 66 61 69 6c 29 2e 20  ssert to fail). 
f230: 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20 72 63  */ .          rc
f240: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
f250: 52 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  RDLOCK;.        
f260: 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
f270: 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a  (pFile, errno);.
f280: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
f290: 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20  nd_unlock;.     
f2a0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
f2b0: 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79   }.    lock.l_ty
f2c0: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
f2d0: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
f2e0: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
f2f0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
f300: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
f310: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c   lock.l_len = 2L
f320: 3b 20 20 61 73 73 65 72 74 28 20 50 45 4e 44 49  ;  assert( PENDI
f330: 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53 45 52  NG_BYTE+1==RESER
f340: 56 45 44 5f 42 59 54 45 20 29 3b 0a 20 20 20 20  VED_BYTE );.    
f350: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
f360: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d  (pFile, &lock)==
f370: 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64  0 ){.      pInod
f380: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
f390: 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
f3a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
f3b0: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
f3c0: 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 73 74 6f  NLOCK;.      sto
f3d0: 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
f3e0: 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20  e, errno);.     
f3f0: 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b   goto end_unlock
f400: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
f410: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f  ( eFileLock==NO_
f420: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 44  LOCK ){.    /* D
f430: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61  ecrement the sha
f440: 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72  red lock counter
f450: 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c  .  Release the l
f460: 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20  ock using an.   
f470: 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79   ** OS call only
f480: 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64   when all thread
f490: 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70  s in this same p
f4a0: 72 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c 65  rocess have rele
f4b0: 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20  ased.    ** the 
f4c0: 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lock..    */.   
f4d0: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
f4e0: 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f  --;.    if( pIno
f4f0: 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29  de->nShared==0 )
f500: 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74  {.      lock.l_t
f510: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
f520: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
f530: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
f540: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
f550: 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d  t = lock.l_len =
f560: 20 30 4c 3b 0a 20 20 20 20 20 20 69 66 28 20 75   0L;.      if( u
f570: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
f580: 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a  e, &lock)==0 ){.
f590: 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
f5a0: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
f5b0: 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  OCK;.      }else
f5c0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
f5d0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
f5e0: 43 4b 3b 0a 20 20 20 20 20 20 20 20 73 74 6f 72  CK;.        stor
f5f0: 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
f600: 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20  , errno);.      
f610: 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
f620: 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
f630: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46         pFile->eF
f640: 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
f650: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
f660: 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
f670: 6e 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20  nt the count of 
f680: 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74 20 74 68  locks against th
f690: 69 73 20 73 61 6d 65 20 66 69 6c 65 2e 20 20 57  is same file.  W
f6a0: 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  hen the.    ** c
f6b0: 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72  ount reaches zer
f6c0: 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74 68  o, close any oth
f6d0: 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  er file descript
f6e0: 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f 73 65 0a  ors whose close.
f6f0: 20 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65 72      ** was defer
f700: 72 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 6f  red because of o
f710: 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
f720: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e  ..    */.    pIn
f730: 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20  ode->nLock--;.  
f740: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
f750: 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20  ->nLock>=0 );.  
f760: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c    if( pInode->nL
f770: 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ock==0 ){.      
f780: 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28  closePendingFds(
f790: 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pFile);.    }.  
f7a0: 7d 0a 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a 20  }..end_unlock:. 
f7b0: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
f7c0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
f7d0: 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e  ITE_OK ) pFile->
f7e0: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
f7f0: 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20  eLock;.  return 
f800: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  rc;.}../*.** Low
f810: 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
f820: 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
f830: 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
f840: 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
f850: 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62  leLock.** must b
f860: 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
f870: 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
f880: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
f890: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
f8a0: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
f8b0: 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
f8c0: 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
f8d0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
f8e0: 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
f8f0: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
f900: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
f910: 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69   unixUnlock(sqli
f920: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
f930: 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 23 69  t eFileLock){.#i
f940: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
f950: 50 5f 53 49 5a 45 3e 30 0a 20 20 61 73 73 65 72  P_SIZE>0.  asser
f960: 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  t( eFileLock==SH
f970: 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 28 28 75  ARED_LOCK || ((u
f980: 6e 69 78 46 69 6c 65 20 2a 29 69 64 29 2d 3e 6e  nixFile *)id)->n
f990: 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 23  FetchOut==0 );.#
f9a0: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70  endif.  return p
f9b0: 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65  osixUnlock(id, e
f9c0: 46 69 6c 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a  FileLock, 0);.}.
f9d0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
f9e0: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 73 74 61 74  MMAP_SIZE>0.stat
f9f0: 69 63 20 69 6e 74 20 75 6e 69 78 4d 61 70 66 69  ic int unixMapfi
fa00: 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  le(unixFile *pFd
fa10: 2c 20 69 36 34 20 6e 42 79 74 65 29 3b 0a 73 74  , i64 nByte);.st
fa20: 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 55 6e  atic void unixUn
fa30: 6d 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65  mapfile(unixFile
fa40: 20 2a 70 46 64 29 3b 0a 23 65 6e 64 69 66 0a 0a   *pFd);.#endif..
fa50: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
fa60: 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 68 65  ion performs the
fa70: 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 22 63   parts of the "c
fa80: 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70 65 72 61  lose file" opera
fa90: 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20  tion .** common 
faa0: 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73  to all locking s
fab0: 63 68 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65  chemes. It close
fac0: 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
fad0: 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64  and file.** hand
fae0: 6c 65 73 2c 20 69 66 20 74 68 65 79 20 61 72 65  les, if they are
faf0: 20 76 61 6c 69 64 2c 20 61 6e 64 20 73 65 74 73   valid, and sets
fb00: 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74   all fields of t
fb10: 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73  he unixFile.** s
fb20: 74 72 75 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a  tructure to 0..*
fb30: 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e 6f 74 2a  *.** It is *not*
fb40: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 68 6f   necessary to ho
fb50: 6c 64 20 74 68 65 20 6d 75 74 65 78 20 77 68 65  ld the mutex whe
fb60: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
fb70: 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65  s called,.** eve
fb80: 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 20 20 41  n on VxWorks.  A
fb90: 20 6d 75 74 65 78 20 77 69 6c 6c 20 62 65 20 61   mutex will be a
fba0: 63 71 75 69 72 65 64 20 6f 6e 20 56 78 57 6f 72  cquired on VxWor
fbb0: 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20 76 78 77  ks by the.** vxw
fbc0: 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49  orksReleaseFileI
fbd0: 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  d() routine..*/.
fbe0: 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65  static int close
fbf0: 55 6e 69 78 46 69 6c 65 28 73 71 6c 69 74 65 33  UnixFile(sqlite3
fc00: 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e  _file *id){.  un
fc10: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
fc20: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 23  (unixFile*)id;.#
fc30: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
fc40: 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78  AP_SIZE>0.  unix
fc50: 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29  Unmapfile(pFile)
fc60: 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  ;.#endif.  if( p
fc70: 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  File->h>=0 ){.  
fc80: 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
fc90: 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  File, pFile->h, 
fca0: 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 70  __LINE__);.    p
fcb0: 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20  File->h = -1;.  
fcc0: 7d 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  }.#if OS_VXWORKS
fcd0: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49  .  if( pFile->pI
fce0: 64 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 69  d ){.    if( pFi
fcf0: 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
fd00: 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 20  UNIXFILE_DELETE 
fd10: 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e  ){.      osUnlin
fd20: 6b 28 70 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43  k(pFile->pId->zC
fd30: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20  anonicalName);. 
fd40: 20 20 20 7d 0a 20 20 20 20 76 78 77 6f 72 6b 73     }.    vxworks
fd50: 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 70 46  ReleaseFileId(pF
fd60: 69 6c 65 2d 3e 70 49 64 29 3b 0a 20 20 20 20 70  ile->pId);.    p
fd70: 46 69 6c 65 2d 3e 70 49 64 20 3d 20 30 3b 0a 20  File->pId = 0;. 
fd80: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66   }.#endif.#ifdef
fd90: 20 53 51 4c 49 54 45 5f 55 4e 4c 49 4e 4b 5f 41   SQLITE_UNLINK_A
fda0: 46 54 45 52 5f 43 4c 4f 53 45 0a 20 20 69 66 28  FTER_CLOSE.  if(
fdb0: 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
fdc0: 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c  s & UNIXFILE_DEL
fdd0: 45 54 45 20 29 7b 0a 20 20 20 20 6f 73 55 6e 6c  ETE ){.    osUnl
fde0: 69 6e 6b 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68  ink(pFile->zPath
fdf0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
fe00: 72 65 65 28 2a 28 63 68 61 72 2a 2a 29 26 70 46  ree(*(char**)&pF
fe10: 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
fe20: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3d 20   pFile->zPath = 
fe30: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
fe40: 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  OSTRACE(("CLOSE 
fe50: 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65    %-3d\n", pFile
fe60: 2d 3e 68 29 29 3b 0a 20 20 4f 70 65 6e 43 6f 75  ->h));.  OpenCou
fe70: 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73 71 6c 69  nter(-1);.  sqli
fe80: 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e  te3_free(pFile->
fe90: 70 55 6e 75 73 65 64 29 3b 0a 20 20 6d 65 6d 73  pUnused);.  mems
fea0: 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a  et(pFile, 0, siz
feb0: 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a  eof(unixFile));.
fec0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fed0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  OK;.}../*.** Clo
fee0: 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  se a file..*/.st
fef0: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 6c 6f  atic int unixClo
ff00: 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
ff10: 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  *id){.  int rc =
ff20: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
ff30: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
ff40: 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a  (unixFile *)id;.
ff50: 20 20 76 65 72 69 66 79 44 62 46 69 6c 65 28 70    verifyDbFile(p
ff60: 46 69 6c 65 29 3b 0a 20 20 75 6e 69 78 55 6e 6c  File);.  unixUnl
ff70: 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
ff80: 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  ;.  unixEnterMut
ff90: 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 75 6e 69 78  ex();..  /* unix
ffa0: 46 69 6c 65 2e 70 49 6e 6f 64 65 20 69 73 20 61  File.pInode is a
ffb0: 6c 77 61 79 73 20 76 61 6c 69 64 20 68 65 72 65  lways valid here
ffc0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 64  . Otherwise, a d
ffd0: 69 66 66 65 72 65 6e 74 20 63 6c 6f 73 65 0a 20  ifferent close. 
ffe0: 20 2a 2a 20 72 6f 75 74 69 6e 65 20 28 65 2e 67   ** routine (e.g
fff0: 2e 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 29 29  . nolockClose())
10000 20 77 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64   would be called
10010 20 69 6e 73 74 65 61 64 2e 0a 20 20 2a 2f 0a 20   instead..  */. 
10020 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
10030 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 30 20  pInode->nLock>0 
10040 7c 7c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  || pFile->pInode
10050 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
10060 30 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59  0 );.  if( ALWAY
10070 53 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 29  S(pFile->pInode)
10080 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64   && pFile->pInod
10090 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  e->nLock ){.    
100a0 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
100b0 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b  outstanding lock
100c0 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c  s, do not actual
100d0 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  ly close the fil
100e0 65 20 6a 75 73 74 0a 20 20 20 20 2a 2a 20 79 65  e just.    ** ye
100f0 74 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77  t because that w
10100 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65  ould clear those
10110 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64   locks.  Instead
10120 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20  , add the file. 
10130 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72     ** descriptor
10140 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75   to pInode->pUnu
10150 73 65 64 20 6c 69 73 74 2e 20 20 49 74 20 77 69  sed list.  It wi
10160 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61  ll be automatica
10170 6c 6c 79 20 63 6c 6f 73 65 64 20 0a 20 20 20 20  lly closed .    
10180 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74  ** when the last
10190 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64   lock is cleared
101a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 65 74  ..    */.    set
101b0 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65 29  PendingFd(pFile)
101c0 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 49  ;.  }.  releaseI
101d0 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b  nodeInfo(pFile);
101e0 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69  .  rc = closeUni
101f0 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 75 6e 69  xFile(id);.  uni
10200 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
10210 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
10220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
10230 6e 64 20 6f 66 20 74 68 65 20 70 6f 73 69 78 20  nd of the posix 
10240 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 20 69 6d  advisory lock im
10250 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
10260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
10270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
102a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
102b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
102c0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
102d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
102e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
102f0 2a 2a 2a 2a 2a 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 0a  ***************.
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 20 4e  ************** N
10330 6f 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  o-op Locking ***
10340 2a 2a 2a 2a 2a 2a 2a 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 0a  ***************.
10360 2a 2a 0a 2a 2a 20 4f 66 20 74 68 65 20 76 61 72  **.** Of the var
10370 69 6f 75 73 20 6c 6f 63 6b 69 6e 67 20 69 6d 70  ious locking imp
10380 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 61 76 61  lementations ava
10390 69 6c 61 62 6c 65 2c 20 74 68 69 73 20 69 73 20  ilable, this is 
103a0 62 79 20 66 61 72 20 74 68 65 0a 2a 2a 20 73 69  by far the.** si
103b0 6d 70 6c 65 73 74 3a 20 20 6c 6f 63 6b 69 6e 67  mplest:  locking
103c0 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 4e 6f   is ignored.  No
103d0 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
103e0 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 64 61 74   to lock the dat
103f0 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 66 6f  abase.** file fo
10400 72 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  r reading or wri
10410 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ting..**.** This
10420 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73   locking mode is
10430 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
10440 20 75 73 65 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c   use on read-onl
10450 79 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 28  y databases.** (
10460 65 78 3a 20 64 61 74 61 62 61 73 65 73 20 74 68  ex: databases th
10470 61 74 20 61 72 65 20 62 75 72 6e 65 64 20 69 6e  at are burned in
10480 74 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f 72 20 65  to CD-ROM, for e
10490 78 61 6d 70 6c 65 2e 29 20 20 49 74 20 63 61 6e  xample.)  It can
104a0 0a 2a 2a 20 61 6c 73 6f 20 62 65 20 75 73 65 64  .** also be used
104b0 20 69 66 20 74 68 65 20 61 70 70 6c 69 63 61 74   if the applicat
104c0 69 6f 6e 20 65 6d 70 6c 6f 79 73 20 73 6f 6d 65  ion employs some
104d0 20 65 78 74 65 72 6e 61 6c 20 6d 65 63 68 61 6e   external mechan
104e0 69 73 6d 20 74 6f 0a 2a 2a 20 70 72 65 76 65 6e  ism to.** preven
104f0 74 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 61  t simultaneous a
10500 63 63 65 73 73 20 6f 66 20 74 68 65 20 73 61 6d  ccess of the sam
10510 65 20 64 61 74 61 62 61 73 65 20 62 79 20 74 77  e database by tw
10520 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 64 61 74  o or more.** dat
10530 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
10540 73 2e 20 20 42 75 74 20 74 68 65 72 65 20 69 73  s.  But there is
10550 20 61 20 73 65 72 69 6f 75 73 20 72 69 73 6b 20   a serious risk 
10560 6f 66 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63  of database.** c
10570 6f 72 72 75 70 74 69 6f 6e 20 69 66 20 74 68 69  orruption if thi
10580 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69  s locking mode i
10590 73 20 75 73 65 64 20 69 6e 20 73 69 74 75 61 74  s used in situat
105a0 69 6f 6e 73 20 77 68 65 72 65 20 6d 75 6c 74 69  ions where multi
105b0 70 6c 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ple.** database 
105c0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20  connections are 
105d0 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61  accessing the sa
105e0 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  me database file
105f0 20 61 74 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20   at the same.** 
10600 74 69 6d 65 20 61 6e 64 20 6f 6e 65 20 6f 72 20  time and one or 
10610 6d 6f 72 65 20 6f 66 20 74 68 6f 73 65 20 63 6f  more of those co
10620 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 77 72  nnections are wr
10630 69 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69  iting..*/..stati
10640 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65 63  c int nolockChec
10650 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
10660 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55  lite3_file *NotU
10670 73 65 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  sed, int *pResOu
10680 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  t){.  UNUSED_PAR
10690 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
106a0 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b  .  *pResOut = 0;
106b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
106c0 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  _OK;.}.static in
106d0 74 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c  t nolockLock(sql
106e0 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73  ite3_file *NotUs
106f0 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32  ed, int NotUsed2
10700 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
10710 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
10720 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74  NotUsed2);.  ret
10730 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
10740 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f  .static int nolo
10750 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  ckUnlock(sqlite3
10760 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20  _file *NotUsed, 
10770 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20  int NotUsed2){. 
10780 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
10790 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
107a0 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed2);.  return 
107b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
107c0 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 66 69  .** Close the fi
107d0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
107e0 74 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73 71  t nolockClose(sq
107f0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
10800 7b 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65  {.  return close
10810 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a  UnixFile(id);.}.
10820 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
10830 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
10840 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c   no-op lock impl
10850 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
10860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10870 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
10880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
108a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
108b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
108c0 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
108d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
108e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
108f0 2a 2a 2a 2a 2a 2a 2a 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 0a 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 20 42 65 67 69  *********** Begi
10930 6e 20 64 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b 69  n dot-file Locki
10940 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
10950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10960 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 74 66  *.**.** The dotf
10970 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c  ile locking impl
10980 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20  ementation uses 
10990 74 68 65 20 65 78 69 73 74 65 6e 63 65 20 6f 66  the existence of
109a0 20 73 65 70 61 72 61 74 65 20 6c 6f 63 6b 0a 2a   separate lock.*
109b0 2a 20 66 69 6c 65 73 20 28 72 65 61 6c 6c 79 20  * files (really 
109c0 61 20 64 69 72 65 63 74 6f 72 79 29 20 74 6f 20  a directory) to 
109d0 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73 20 74  control access t
109e0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
109f0 20 54 68 69 73 20 77 6f 72 6b 73 0a 2a 2a 20 6f   This works.** o
10a00 6e 20 6a 75 73 74 20 61 62 6f 75 74 20 65 76 65  n just about eve
10a10 72 79 20 66 69 6c 65 73 79 73 74 65 6d 20 69 6d  ry filesystem im
10a20 61 67 69 6e 61 62 6c 65 2e 20 20 42 75 74 20 74  aginable.  But t
10a30 68 65 72 65 20 61 72 65 20 73 65 72 69 6f 75 73  here are serious
10a40 20 64 6f 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a   downsides:.**.*
10a50 2a 20 20 20 20 28 31 29 20 20 54 68 65 72 65 20  *    (1)  There 
10a60 69 73 20 7a 65 72 6f 20 63 6f 6e 63 75 72 72 65  is zero concurre
10a70 6e 63 79 2e 20 20 41 20 73 69 6e 67 6c 65 20 72  ncy.  A single r
10a80 65 61 64 65 72 20 62 6c 6f 63 6b 73 20 61 6c 6c  eader blocks all
10a90 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20   other.**       
10aa0 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72    connections fr
10ab0 6f 6d 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  om reading or wr
10ac0 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  iting the databa
10ad0 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  se..**.**    (2)
10ae0 20 20 41 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e    An application
10af0 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 20   crash or power 
10b00 6c 6f 73 73 20 63 61 6e 20 6c 65 61 76 65 20 73  loss can leave s
10b10 74 61 6c 65 20 6c 6f 63 6b 20 66 69 6c 65 73 0a  tale lock files.
10b20 2a 2a 20 20 20 20 20 20 20 20 20 73 69 74 74 69  **         sitti
10b30 6e 67 20 61 72 6f 75 6e 64 20 74 68 61 74 20 6e  ng around that n
10b40 65 65 64 20 74 6f 20 62 65 20 63 6c 65 61 72 65  eed to be cleare
10b50 64 20 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a  d manually..**.*
10b60 2a 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20  * Nevertheless, 
10b70 61 20 64 6f 74 6c 6f 63 6b 20 69 73 20 61 6e 20  a dotlock is an 
10b80 61 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b  appropriate lock
10b90 69 6e 67 20 6d 6f 64 65 20 66 6f 72 20 75 73 65  ing mode for use
10ba0 20 69 66 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20   if no.** other 
10bb0 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79  locking strategy
10bc0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a   is available..*
10bd0 2a 0a 2a 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63  *.** Dotfile loc
10be0 6b 69 6e 67 20 77 6f 72 6b 73 20 62 79 20 63 72  king works by cr
10bf0 65 61 74 69 6e 67 20 61 20 73 75 62 64 69 72 65  eating a subdire
10c00 63 74 6f 72 79 20 69 6e 20 74 68 65 20 73 61 6d  ctory in the sam
10c10 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 0a 2a  e directory as.*
10c20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  * the database a
10c30 6e 64 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  nd with the same
10c40 20 6e 61 6d 65 20 62 75 74 20 77 69 74 68 20 61   name but with a
10c50 20 22 2e 6c 6f 63 6b 22 20 65 78 74 65 6e 73 69   ".lock" extensi
10c60 6f 6e 20 61 64 64 65 64 2e 0a 2a 2a 20 54 68 65  on added..** The
10c70 20 65 78 69 73 74 65 6e 63 65 20 6f 66 20 61 20   existence of a 
10c80 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 20 69  lock directory i
10c90 6d 70 6c 69 65 73 20 61 6e 20 45 58 43 4c 55 53  mplies an EXCLUS
10ca0 49 56 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f  IVE lock.  All o
10cb0 74 68 65 72 0a 2a 2a 20 6c 6f 63 6b 20 74 79 70  ther.** lock typ
10cc0 65 73 20 28 53 48 41 52 45 44 2c 20 52 45 53 45  es (SHARED, RESE
10cd0 52 56 45 44 2c 20 50 45 4e 44 49 4e 47 29 20 61  RVED, PENDING) a
10ce0 72 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 45  re mapped into E
10cf0 58 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a  XCLUSIVE..*/../*
10d00 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 73 75 66  .** The file suf
10d10 66 69 78 20 61 64 64 65 64 20 74 6f 20 74 68 65  fix added to the
10d20 20 64 61 74 61 20 62 61 73 65 20 66 69 6c 65 6e   data base filen
10d30 61 6d 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ame in order to 
10d40 63 72 65 61 74 65 20 74 68 65 0a 2a 2a 20 6c 6f  create the.** lo
10d50 63 6b 20 64 69 72 65 63 74 6f 72 79 2e 0a 2a 2f  ck directory..*/
10d60 0a 23 64 65 66 69 6e 65 20 44 4f 54 4c 4f 43 4b  .#define DOTLOCK
10d70 5f 53 55 46 46 49 58 20 22 2e 6c 6f 63 6b 22 0a  _SUFFIX ".lock".
10d80 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
10d90 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
10da0 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
10db0 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
10dc0 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
10dd0 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
10de0 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
10df0 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
10e00 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
10e10 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
10e20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
10e30 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
10e40 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
10e50 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
10e60 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
10e70 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
10e80 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
10e90 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
10ea0 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a  k checking..**.*
10eb0 2a 20 49 6e 20 64 6f 74 66 69 6c 65 20 6c 6f 63  * In dotfile loc
10ec0 6b 69 6e 67 2c 20 65 69 74 68 65 72 20 61 20 6c  king, either a l
10ed0 6f 63 6b 20 65 78 69 73 74 73 20 6f 72 20 69 74  ock exists or it
10ee0 20 64 6f 65 73 20 6e 6f 74 2e 20 20 53 6f 20 69   does not.  So i
10ef0 6e 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 74  n this.** variat
10f00 69 6f 6e 20 6f 66 20 43 68 65 63 6b 52 65 73 65  ion of CheckRese
10f10 72 76 65 64 4c 6f 63 6b 28 29 2c 20 2a 70 52 65  rvedLock(), *pRe
10f20 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 74  sOut is set to t
10f30 72 75 65 20 69 66 20 61 6e 79 20 6c 6f 63 6b 0a  rue if any lock.
10f40 2a 2a 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ** is held on th
10f50 65 20 66 69 6c 65 20 61 6e 64 20 66 61 6c 73 65  e file and false
10f60 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
10f70 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61  unlocked..*/.sta
10f80 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43  tic int dotlockC
10f90 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
10fa0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
10fb0 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
10fc0 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
10fd0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
10fe0 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
10ff0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
11000 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
11010 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
11020 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
11030 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
11040 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20  ERVEDLOCK; );.  
11050 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
11060 20 29 3b 0a 20 20 72 65 73 65 72 76 65 64 20 3d   );.  reserved =
11070 20 6f 73 41 63 63 65 73 73 28 28 63 6f 6e 73 74   osAccess((const
11080 20 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f   char*)pFile->lo
11090 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2c 20 30 29  ckingContext, 0)
110a0 3d 3d 30 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ==0;.  OSTRACE((
110b0 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
110c0 20 25 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b 29   %d %d (dotlock)
110d0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
110e0 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20  c, reserved));. 
110f0 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
11100 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
11110 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
11120 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
11130 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
11140 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
11150 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
11160 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
11170 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
11180 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
11190 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
111a0 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
111b0 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
111c0 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
111d0 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
111e0 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
111f0 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
11200 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
11210 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
11220 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
11230 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
11240 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
11250 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
11260 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
11270 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
11280 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
11290 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
112a0 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
112b0 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
112c0 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
112d0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
112e0 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
112f0 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
11300 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
11310 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
11320 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
11330 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
11340 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
11350 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
11360 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
11370 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
11380 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
11390 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
113a0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
113b0 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
113c0 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54  XCLUSIVE.**.** T
113d0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
113e0 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
113f0 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
11400 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
11410 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
11420 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
11430 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74  level..**.** Wit
11440 68 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  h dotfile lockin
11450 67 2c 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c  g, we really onl
11460 79 20 73 75 70 70 6f 72 74 20 73 74 61 74 65 20  y support state 
11470 28 34 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a  (4): EXCLUSIVE..
11480 2a 2a 20 42 75 74 20 77 65 20 74 72 61 63 6b 20  ** But we track 
11490 74 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e  the other lockin
114a0 67 20 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61  g levels interna
114b0 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lly..*/.static i
114c0 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73  nt dotlockLock(s
114d0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
114e0 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
114f0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
11500 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
11510 29 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f  )id;.  char *zLo
11520 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a  ckFile = (char *
11530 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
11540 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 72 63  ontext;.  int rc
11550 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a   = SQLITE_OK;...
11560 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20    /* If we have 
11570 61 6e 79 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74  any lock, then t
11580 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6c 72  he lock file alr
11590 65 61 64 79 20 65 78 69 73 74 73 2e 20 20 41 6c  eady exists.  Al
115a0 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74  l we have.  ** t
115b0 6f 20 64 6f 20 69 73 20 61 64 6a 75 73 74 20 6f  o do is adjust o
115c0 75 72 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f  ur internal reco
115d0 72 64 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 6c  rd of the lock l
115e0 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  evel..  */.  if(
115f0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
11600 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20  k > NO_LOCK ){. 
11610 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
11620 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
11630 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 75  .    /* Always u
11640 70 64 61 74 65 20 74 68 65 20 74 69 6d 65 73 74  pdate the timest
11650 61 6d 70 20 6f 6e 20 74 68 65 20 6f 6c 64 20 66  amp on the old f
11660 69 6c 65 20 2a 2f 0a 23 69 66 64 65 66 20 48 41  ile */.#ifdef HA
11670 56 45 5f 55 54 49 4d 45 0a 20 20 20 20 75 74 69  VE_UTIME.    uti
11680 6d 65 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55  me(zLockFile, NU
11690 4c 4c 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 75  LL);.#else.    u
116a0 74 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c  times(zLockFile,
116b0 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20   NULL);.#endif. 
116c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
116d0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
116e0 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69   grab an exclusi
116f0 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 72 63 20  ve lock */.  rc 
11700 3d 20 6f 73 4d 6b 64 69 72 28 7a 4c 6f 63 6b 46  = osMkdir(zLockF
11710 69 6c 65 2c 20 30 37 37 37 29 3b 0a 20 20 69 66  ile, 0777);.  if
11720 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 2f 2a  ( rc<0 ){.    /*
11730 20 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f   failed to open/
11740 63 72 65 61 74 65 20 74 68 65 20 6c 6f 63 6b 20  create the lock 
11750 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20 20  directory */.   
11760 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
11770 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 45 58  rno;.    if( EEX
11780 49 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29 7b  IST == tErrno ){
11790 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
117a0 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20 65  TE_BUSY;.    } e
117b0 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  lse {.      rc =
117c0 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
117d0 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
117e0 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
117f0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
11800 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc!=SQLITE_BUSY
11810 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72   ){.        stor
11820 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
11830 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  , tErrno);.     
11840 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74   }.    }.    ret
11850 75 72 6e 20 72 63 3b 0a 20 20 7d 20 0a 20 20 0a  urn rc;.  } .  .
11860 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74    /* got it, set
11870 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65   the type and re
11880 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69  turn ok */.  pFi
11890 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
118a0 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74  eFileLock;.  ret
118b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
118c0 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
118d0 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
118e0 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
118f0 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
11900 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
11910 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
11920 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
11930 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
11940 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
11950 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
11960 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
11970 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
11980 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
11990 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
119a0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
119b0 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  no-op..**.** Whe
119c0 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  n the locking le
119d0 76 65 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c  vel reaches NO_L
119e0 4f 43 4b 2c 20 64 65 6c 65 74 65 20 74 68 65 20  OCK, delete the 
119f0 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  lock file..*/.st
11a00 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b  atic int dotlock
11a10 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
11a20 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
11a30 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
11a40 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
11a50 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63  nixFile*)id;.  c
11a60 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d  har *zLockFile =
11a70 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e   (char *)pFile->
11a80 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
11a90 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
11aa0 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
11ab0 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
11ac0 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70    %d %d was %d p
11ad0 69 64 3d 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c  id=%d (dotlock)\
11ae0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46  n", pFile->h, eF
11af0 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20  ileLock,.       
11b00 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
11b10 4c 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64 28 30  Lock, osGetpid(0
11b20 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  )));.  assert( e
11b30 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  FileLock<=SHARED
11b40 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a  _LOCK );.  .  /*
11b50 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62   no-op if possib
11b60 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  le */.  if( pFil
11b70 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46  e->eFileLock==eF
11b80 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72  ileLock ){.    r
11b90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11ba0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f 20 64 6f  .  }..  /* To do
11bb0 77 6e 67 72 61 64 65 20 74 6f 20 73 68 61 72 65  wngrade to share
11bc0 64 2c 20 73 69 6d 70 6c 79 20 75 70 64 61 74 65  d, simply update
11bd0 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 6e 6f   our internal no
11be0 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a  tion of the.  **
11bf0 20 6c 6f 63 6b 20 73 74 61 74 65 2e 20 20 4e 6f   lock state.  No
11c00 20 6e 65 65 64 20 74 6f 20 6d 65 73 73 20 77 69   need to mess wi
11c10 74 68 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  th the file on d
11c20 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  isk..  */.  if( 
11c30 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
11c40 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46  D_LOCK ){.    pF
11c50 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
11c60 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
11c70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11c80 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
11c90 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f 63 6b 20  To fully unlock 
11ca0 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 64 65  the database, de
11cb0 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66 69  lete the lock fi
11cc0 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  le */.  assert( 
11cd0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  eFileLock==NO_LO
11ce0 43 4b 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73 52  CK );.  rc = osR
11cf0 6d 64 69 72 28 7a 4c 6f 63 6b 46 69 6c 65 29 3b  mdir(zLockFile);
11d00 0a 20 20 69 66 28 20 72 63 3c 30 20 29 7b 0a 20  .  if( rc<0 ){. 
11d10 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
11d20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 74  errno;.    if( t
11d30 45 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 29 7b  Errno==ENOENT ){
11d40 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
11d50 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
11d60 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
11d70 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
11d80 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  ;.      storeLas
11d90 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
11da0 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rrno);.    }.   
11db0 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d   return rc; .  }
11dc0 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  .  pFile->eFileL
11dd0 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
11de0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11df0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  K;.}../*.** Clos
11e00 65 20 61 20 66 69 6c 65 2e 20 20 4d 61 6b 65 20  e a file.  Make 
11e10 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 20 68 61  sure the lock ha
11e20 73 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20  s been released 
11e30 62 65 66 6f 72 65 20 63 6c 6f 73 69 6e 67 2e 0a  before closing..
11e40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f  */.static int do
11e50 74 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74  tlockClose(sqlit
11e60 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20  e3_file *id) {. 
11e70 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
11e80 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
11e90 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ;.  assert( id!=
11ea0 30 20 29 3b 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e  0 );.  dotlockUn
11eb0 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
11ec0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
11ed0 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  e(pFile->locking
11ee0 43 6f 6e 74 65 78 74 29 3b 0a 20 20 72 65 74 75  Context);.  retu
11ef0 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65  rn closeUnixFile
11f00 28 69 64 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  (id);.}./*******
11f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
11f20 6f 66 20 74 68 65 20 64 6f 74 2d 66 69 6c 65 20  of the dot-file 
11f30 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
11f40 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
11f50 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
11f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11fa0 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
11fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11ff0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
12000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12010 2a 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20  *** Begin flock 
12020 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
12030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12040 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55  ********.**.** U
12050 73 65 20 74 68 65 20 66 6c 6f 63 6b 28 29 20 73  se the flock() s
12060 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64 6f  ystem call to do
12070 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a   file locking..*
12080 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63  *.** flock() loc
12090 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74  king is like dot
120a0 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6e  -file locking in
120b0 20 74 68 61 74 20 74 68 65 20 76 61 72 69 6f 75   that the variou
120c0 73 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e 20  s.** fine-grain 
120d0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 73  locking levels s
120e0 75 70 70 6f 72 74 65 64 20 62 79 20 53 51 4c 69  upported by SQLi
120f0 74 65 20 61 72 65 20 63 6f 6c 6c 61 70 73 65 64  te are collapsed
12100 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c   into.** a singl
12110 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
12120 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
12130 73 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52  s, SHARED, RESER
12140 56 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e 44  VED, and.** PEND
12150 49 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20 74 68  ING locks are th
12160 65 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20  e same thing as 
12170 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
12180 6b 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73 74  k.  SQLite.** st
12190 69 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20 79  ill works when y
121a0 6f 75 20 64 6f 20 74 68 69 73 2c 20 62 75 74 20  ou do this, but 
121b0 63 6f 6e 63 75 72 72 65 6e 63 79 20 69 73 20 72  concurrency is r
121c0 65 64 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a 20  educed since.** 
121d0 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72  only a single pr
121e0 6f 63 65 73 73 20 63 61 6e 20 62 65 20 72 65 61  ocess can be rea
121f0 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
12200 65 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a  e at a time..**.
12210 2a 2a 20 4f 6d 69 74 20 74 68 69 73 20 73 65 63  ** Omit this sec
12220 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 45  tion if SQLITE_E
12230 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
12240 59 4c 45 20 69 73 20 74 75 72 6e 65 64 20 6f 66  YLE is turned of
12250 66 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  f.*/.#if SQLITE_
12260 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
12270 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72  TYLE../*.** Retr
12280 79 20 66 6c 6f 63 6b 28 29 20 63 61 6c 6c 73 20  y flock() calls 
12290 74 68 61 74 20 66 61 69 6c 20 77 69 74 68 20 45  that fail with E
122a0 49 4e 54 52 0a 2a 2f 0a 23 69 66 64 65 66 20 45  INTR.*/.#ifdef E
122b0 49 4e 54 52 0a 73 74 61 74 69 63 20 69 6e 74 20  INTR.static int 
122c0 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 69 6e 74  robust_flock(int
122d0 20 66 64 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20   fd, int op){.  
122e0 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63  int rc;.  do{ rc
122f0 20 3d 20 66 6c 6f 63 6b 28 66 64 2c 6f 70 29 3b   = flock(fd,op);
12300 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26   }while( rc<0 &&
12310 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
12320 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12330 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 72  #else.# define r
12340 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 61 2c 62 29  obust_flock(a,b)
12350 20 66 6c 6f 63 6b 28 61 2c 62 29 0a 23 65 6e 64   flock(a,b).#end
12360 69 66 0a 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20  if.     ../*.** 
12370 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
12380 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
12390 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
123a0 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
123b0 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
123c0 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
123d0 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
123e0 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
123f0 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74  ld, set *pResOut
12400 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  .** to a non-zer
12410 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73  o value otherwis
12420 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  e *pResOut is se
12430 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20  t to zero.  The 
12440 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
12450 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
12460 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f  _OK unless an I/
12470 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  O error occurs d
12480 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b  uring lock check
12490 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
124a0 6e 74 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73  nt flockCheckRes
124b0 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
124c0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
124d0 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74  *pResOut){.  int
124e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
124f0 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20  .  int reserved 
12500 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
12510 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
12520 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d  le*)id;.  .  Sim
12530 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
12540 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
12550 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
12560 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73  OCK; );.  .  ass
12570 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
12580 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
12590 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
125a0 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
125b0 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
125c0 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
125d0 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
125e0 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  ){.    reserved 
125f0 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  = 1;.  }.  .  /*
12600 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
12610 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
12620 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a  cess holds it. *
12630 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65  /.  if( !reserve
12640 64 20 29 7b 0a 20 20 20 20 2f 2a 20 61 74 74 65  d ){.    /* atte
12650 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20 6c  mpt to get the l
12660 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c  ock */.    int l
12670 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63  rc = robust_floc
12680 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b  k(pFile->h, LOCK
12690 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a  _EX | LOCK_NB);.
126a0 20 20 20 20 69 66 28 20 21 6c 72 63 20 29 7b 0a      if( !lrc ){.
126b0 20 20 20 20 20 20 2f 2a 20 67 6f 74 20 74 68 65        /* got the
126c0 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74   lock, unlock it
126d0 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20   */.      lrc = 
126e0 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69  robust_flock(pFi
126f0 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b  le->h, LOCK_UN);
12700 0a 20 20 20 20 20 20 69 66 20 28 20 6c 72 63 20  .      if ( lrc 
12710 29 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ) {.        int 
12720 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
12730 20 20 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63          /* unloc
12740 6b 20 66 61 69 6c 65 64 20 77 69 74 68 20 61 6e  k failed with an
12750 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20   error */.      
12760 20 20 6c 72 63 20 3d 20 53 51 4c 49 54 45 5f 49    lrc = SQLITE_I
12770 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20  OERR_UNLOCK; .  
12780 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
12790 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
127a0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  no);.        rc 
127b0 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  = lrc;.      }. 
127c0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
127d0 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
127e0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 73 65  rrno;.      rese
127f0 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  rved = 1;.      
12800 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20  /* someone else 
12810 6d 69 67 68 74 20 68 61 76 65 20 69 74 20 72 65  might have it re
12820 73 65 72 76 65 64 20 2a 2f 0a 20 20 20 20 20 20  served */.      
12830 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f  lrc = sqliteErro
12840 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
12850 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
12860 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20  OERR_LOCK); .   
12870 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
12880 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20  RROR(lrc) ){.   
12890 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
128a0 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
128b0 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  o);.        rc =
128c0 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20   lrc;.      }.  
128d0 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43    }.  }.  OSTRAC
128e0 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
128f0 20 25 64 20 25 64 20 25 64 20 28 66 6c 6f 63 6b   %d %d %d (flock
12900 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
12910 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a  rc, reserved));.
12920 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49  .#ifdef SQLITE_I
12930 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
12940 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72  _ERRORS.  if( (r
12950 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c & SQLITE_IOERR
12960 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  ) == SQLITE_IOER
12970 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  R ){.    rc = SQ
12980 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 65 73  LITE_OK;.    res
12990 65 72 76 65 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e  erved=1;.  }.#en
129a0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47  dif /* SQLITE_IG
129b0 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
129c0 45 52 52 4f 52 53 20 2a 2f 0a 20 20 2a 70 52 65  ERRORS */.  *pRe
129d0 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
129e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
129f0 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
12a00 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
12a10 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
12a20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c  parameter eFileL
12a30 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ock - one.** of 
12a40 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
12a50 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
12a60 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
12a70 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
12a80 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
12a90 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
12aa0 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
12ab0 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
12ac0 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
12ad0 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
12ae0 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
12af0 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
12b00 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
12b10 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
12b20 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
12b30 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
12b40 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
12b50 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
12b60 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
12b70 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
12b80 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
12b90 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
12ba0 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
12bb0 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
12bc0 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
12bd0 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
12be0 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
12bf0 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
12c00 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
12c10 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
12c20 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
12c30 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
12c40 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
12c50 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
12c60 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
12c70 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
12c80 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
12c90 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
12ca0 49 56 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28  IVE.**.** flock(
12cb0 29 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75  ) only really su
12cc0 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20  pport EXCLUSIVE 
12cd0 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b  locks.  We track
12ce0 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a   intermediate.**
12cf0 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20   lock states in 
12d00 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  the sqlite3_file
12d10 20 73 74 72 75 63 74 75 72 65 2c 20 62 75 74 20   structure, but 
12d20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44  all locks SHARED
12d30 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65   or.** above are
12d40 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56   really EXCLUSIV
12d50 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c  E locks and excl
12d60 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72  ude all other pr
12d70 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20  ocesses from.** 
12d80 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e  access the file.
12d90 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
12da0 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
12db0 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
12dc0 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
12dd0 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
12de0 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
12df0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
12e00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f  /.static int flo
12e10 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ckLock(sqlite3_f
12e20 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
12e30 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20  leLock) {.  int 
12e40 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
12e50 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
12e60 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
12e70 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  d;..  assert( pF
12e80 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 69 66 20  ile );..  /* if 
12e90 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  we already have 
12ea0 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78  a lock, it is ex
12eb0 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20  clusive.  .  ** 
12ec0 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65  Just adjust leve
12ed0 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75  l and punt on ou
12ee0 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69  tta here. */.  i
12ef0 66 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f (pFile->eFileL
12f00 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b  ock > NO_LOCK) {
12f10 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
12f20 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
12f30 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  k;.    return SQ
12f40 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
12f50 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63    /* grab an exc
12f60 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20  lusive lock */. 
12f70 20 0a 20 20 69 66 20 28 72 6f 62 75 73 74 5f 66   .  if (robust_f
12f80 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
12f90 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42  OCK_EX | LOCK_NB
12fa0 29 29 20 7b 0a 20 20 20 20 69 6e 74 20 74 45 72  )) {.    int tEr
12fb0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
12fc0 20 2f 2a 20 64 69 64 6e 27 74 20 67 65 74 2c 20   /* didn't get, 
12fd0 6d 75 73 74 20 62 65 20 62 75 73 79 20 2a 2f 0a  must be busy */.
12fe0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
12ff0 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
13000 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
13010 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20  E_IOERR_LOCK);. 
13020 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
13030 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
13040 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
13050 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
13060 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20  .    }.  } else 
13070 7b 0a 20 20 20 20 2f 2a 20 67 6f 74 20 69 74 2c  {.    /* got it,
13080 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e   set the type an
13090 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20  d return ok */. 
130a0 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
130b0 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
130c0 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
130d0 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25  "LOCK    %d %s %
130e0 73 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46  s (flock)\n", pF
130f0 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f  ile->h, azFileLo
13100 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a  ck(eFileLock), .
13110 20 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53             rc==S
13120 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20  QLITE_OK ? "ok" 
13130 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 23 69  : "failed"));.#i
13140 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f  fdef SQLITE_IGNO
13150 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
13160 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20 26  RORS.  if( (rc &
13170 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d   SQLITE_IOERR) =
13180 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  = SQLITE_IOERR )
13190 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
131a0 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 23 65 6e 64  E_BUSY;.  }.#end
131b0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e  if /* SQLITE_IGN
131c0 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
131d0 52 52 4f 52 53 20 2a 2f 0a 20 20 72 65 74 75 72  RRORS */.  retur
131e0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
131f0 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
13200 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
13210 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
13220 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
13230 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
13240 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
13250 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
13260 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
13270 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
13280 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
13290 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
132a0 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
132b0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
132c0 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
132d0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
132e0 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
132f0 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28  int flockUnlock(
13300 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
13310 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
13320 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
13330 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
13340 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73 73 65 72  *)id;.  .  asser
13350 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
13360 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20  TRACE(("UNLOCK  
13370 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64  %d %d was %d pid
13380 3d 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20  =%d (flock)\n", 
13390 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c  pFile->h, eFileL
133a0 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ock,.           
133b0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
133c0 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b  , osGetpid(0)));
133d0 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
133e0 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
133f0 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d  K );.  .  /* no-
13400 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a  op if possible *
13410 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
13420 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c  FileLock==eFileL
13430 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
13440 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
13450 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20  .  .  /* shared 
13460 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20  can just be set 
13470 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79  because we alway
13480 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73  s have an exclus
13490 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69  ive */.  if (eFi
134a0 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
134b0 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
134c0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
134d0 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74  ileLock;.    ret
134e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
134f0 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72   }.  .  /* no, r
13500 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a  eally, unlock. *
13510 2f 0a 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66  /.  if( robust_f
13520 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
13530 4f 43 4b 5f 55 4e 29 20 29 7b 0a 23 69 66 64 65  OCK_UN) ){.#ifde
13540 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  f SQLITE_IGNORE_
13550 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
13560 53 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  S.    return SQL
13570 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 20 2f  ITE_OK;.#endif /
13580 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  * SQLITE_IGNORE_
13590 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
135a0 53 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  S */.    return 
135b0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
135c0 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  OCK;.  }else{.  
135d0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
135e0 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
135f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13600 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
13610 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a   Close a file..*
13620 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f  /.static int flo
13630 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  ckClose(sqlite3_
13640 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 61 73  file *id) {.  as
13650 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
13660 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c   flockUnlock(id,
13670 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 72 65 74   NO_LOCK);.  ret
13680 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  urn closeUnixFil
13690 65 28 69 64 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66  e(id);.}..#endif
136a0 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
136b0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
136c0 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f  && !OS_VXWORK */
136d0 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
136e0 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
136f0 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70  e flock lock imp
13700 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
13710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13720 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
13730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13770 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
13780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
137a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
137b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
137c0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
137d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
137e0 6e 20 4e 61 6d 65 64 20 53 65 6d 61 70 68 6f 72  n Named Semaphor
137f0 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  e Locking ******
13800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13810 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73  **.**.** Named s
13820 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67  emaphore locking
13830 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74   is only support
13840 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  ed on VxWorks..*
13850 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c  *.** Semaphore l
13860 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64  ocking is like d
13870 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f 63  ot-lock and floc
13880 6b 20 69 6e 20 74 68 61 74 20 69 74 20 72 65 61  k in that it rea
13890 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70  lly only.** supp
138a0 6f 72 74 73 20 45 58 43 4c 55 53 49 56 45 20 6c  orts EXCLUSIVE l
138b0 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20 61 20  ocking.  Only a 
138c0 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63  single process c
138d0 61 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  an read or write
138e0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
138f0 20 66 69 6c 65 20 61 74 20 61 20 74 69 6d 65 2e   file at a time.
13900 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20 70    This reduces p
13910 6f 74 65 6e 74 69 61 6c 20 63 6f 6e 63 75 72 72  otential concurr
13920 65 6e 63 79 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b  ency, but.** mak
13930 65 73 20 74 68 65 20 6c 6f 63 6b 20 69 6d 70 6c  es the lock impl
13940 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 75 63 68 20  ementation much 
13950 65 61 73 69 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f  easier..*/.#if O
13960 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a  S_VXWORKS../*.**
13970 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
13980 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
13990 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
139a0 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
139b0 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
139c0 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
139d0 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
139e0 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
139f0 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
13a00 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
13a10 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
13a20 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
13a30 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
13a40 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
13a50 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
13a60 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
13a70 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
13a80 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
13a90 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
13aa0 69 6e 74 20 73 65 6d 58 43 68 65 63 6b 52 65 73  int semXCheckRes
13ab0 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
13ac0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
13ad0 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e  *pResOut) {.  in
13ae0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
13af0 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
13b00 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
13b10 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
13b20 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75  ile*)id;..  Simu
13b30 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
13b40 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
13b50 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
13b60 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65  CK; );.  .  asse
13b70 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20  rt( pFile );..  
13b80 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
13b90 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
13ba0 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
13bb0 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
13bc0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
13bd0 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
13be0 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
13bf0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74  ;.  }.  .  /* Ot
13c00 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
13c10 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
13c20 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20  s holds it. */. 
13c30 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29   if( !reserved )
13c40 7b 0a 20 20 20 20 73 65 6d 5f 74 20 2a 70 53 65  {.    sem_t *pSe
13c50 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  m = pFile->pInod
13c60 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20 20 20 69 66  e->pSem;..    if
13c70 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53  ( sem_trywait(pS
13c80 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20  em)==-1 ){.     
13c90 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
13ca0 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 45  rno;.      if( E
13cb0 41 47 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f 20  AGAIN != tErrno 
13cc0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
13cd0 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
13ce0 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
13cf0 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  , SQLITE_IOERR_C
13d00 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
13d10 29 3b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65  );.        store
13d20 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
13d30 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20   tErrno);.      
13d40 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
13d50 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65   /* someone else
13d60 20 68 61 73 20 74 68 65 20 6c 6f 63 6b 20 77 68   has the lock wh
13d70 65 6e 20 77 65 20 61 72 65 20 69 6e 20 4e 4f 5f  en we are in NO_
13d80 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 20 20 20 20  LOCK */.        
13d90 72 65 73 65 72 76 65 64 20 3d 20 28 70 46 69 6c  reserved = (pFil
13da0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 53  e->eFileLock < S
13db0 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
13dc0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
13dd0 20 20 20 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c        /* we coul
13de0 64 20 68 61 76 65 20 69 74 20 69 66 20 77 65 20  d have it if we 
13df0 77 61 6e 74 20 69 74 20 2a 2f 0a 20 20 20 20 20  want it */.     
13e00 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3b   sem_post(pSem);
13e10 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54  .    }.  }.  OST
13e20 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c  RACE(("TEST WR-L
13e30 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 73 65  OCK %d %d %d (se
13e40 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  m)\n", pFile->h,
13e50 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b   rc, reserved));
13e60 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72  ..  *pResOut = r
13e70 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72  eserved;.  retur
13e80 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
13e90 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
13ea0 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
13eb0 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
13ec0 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e  r eFileLock - on
13ed0 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
13ee0 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
13ef0 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
13f00 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
13f10 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
13f20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
13f30 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
13f40 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
13f50 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
13f60 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
13f70 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
13f80 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
13f90 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
13fa0 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
13fb0 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
13fc0 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
13fd0 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
13fe0 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
13ff0 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
14000 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
14010 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
14020 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
14030 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
14040 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
14050 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
14060 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
14070 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
14080 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
14090 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
140a0 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
140b0 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
140c0 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
140d0 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
140e0 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
140f0 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
14100 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
14110 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
14120 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
14130 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
14140 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  * Semaphore lock
14150 73 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75  s only really su
14160 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20  pport EXCLUSIVE 
14170 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b  locks.  We track
14180 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a   intermediate.**
14190 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20   lock states in 
141a0 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  the sqlite3_file
141b0 20 73 74 72 75 63 74 75 72 65 2c 20 62 75 74 20   structure, but 
141c0 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44  all locks SHARED
141d0 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65   or.** above are
141e0 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56   really EXCLUSIV
141f0 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c  E locks and excl
14200 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72  ude all other pr
14210 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20  ocesses from.** 
14220 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e  access the file.
14230 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
14240 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
14250 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
14260 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
14270 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
14280 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
14290 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
142a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d  /.static int sem
142b0 58 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  XLock(sqlite3_fi
142c0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
142d0 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
142e0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
142f0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65  ixFile*)id;.  se
14300 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c  m_t *pSem = pFil
14310 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b  e->pInode->pSem;
14320 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
14330 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20  TE_OK;..  /* if 
14340 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  we already have 
14350 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78  a lock, it is ex
14360 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20  clusive.  .  ** 
14370 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65  Just adjust leve
14380 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75  l and punt on ou
14390 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69  tta here. */.  i
143a0 66 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f (pFile->eFileL
143b0 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b  ock > NO_LOCK) {
143c0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
143d0 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
143e0 6b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  k;.    rc = SQLI
143f0 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20  TE_OK;.    goto 
14400 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  sem_end_lock;.  
14410 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20 73  }.  .  /* lock s
14420 65 6d 61 70 68 6f 72 65 20 6e 6f 77 20 62 75 74  emaphore now but
14430 20 62 61 69 6c 20 6f 75 74 20 77 68 65 6e 20 61   bail out when a
14440 6c 72 65 61 64 79 20 6c 6f 63 6b 65 64 2e 20 2a  lready locked. *
14450 2f 0a 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77  /.  if( sem_tryw
14460 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b  ait(pSem)==-1 ){
14470 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
14480 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20  _BUSY;.    goto 
14490 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  sem_end_lock;.  
144a0 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20  }..  /* got it, 
144b0 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64  set the type and
144c0 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20   return ok */.  
144d0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
144e0 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 0a 20   = eFileLock;.. 
144f0 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20  sem_end_lock:.  
14500 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
14510 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
14520 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
14530 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
14540 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
14550 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a  k.  eFileLock.**
14560 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
14570 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
14580 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
14590 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
145a0 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
145b0 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
145c0 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
145d0 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
145e0 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
145f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
14600 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
14610 74 69 63 20 69 6e 74 20 73 65 6d 58 55 6e 6c 6f  tic int semXUnlo
14620 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
14630 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
14640 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ck) {.  unixFile
14650 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
14660 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74  ile*)id;.  sem_t
14670 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e   *pSem = pFile->
14680 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20  pInode->pSem;.. 
14690 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
146a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6d  ;.  assert( pSem
146b0 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
146c0 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
146d0 73 20 25 64 20 70 69 64 3d 25 64 20 28 73 65 6d  s %d pid=%d (sem
146e0 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
146f0 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20  eFileLock,.     
14700 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
14710 6c 65 4c 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64  leLock, osGetpid
14720 28 30 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28  (0)));.  assert(
14730 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52   eFileLock<=SHAR
14740 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20  ED_LOCK );.  .  
14750 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73  /* no-op if poss
14760 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46  ible */.  if( pF
14770 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
14780 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
14790 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
147a0 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73  K;.  }.  .  /* s
147b0 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62  hared can just b
147c0 65 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65  e set because we
147d0 20 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20   always have an 
147e0 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69  exclusive */.  i
147f0 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f (eFileLock==SH
14800 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  ARED_LOCK) {.   
14810 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
14820 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
14830 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14840 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
14850 20 6e 6f 2c 20 72 65 61 6c 6c 79 20 75 6e 6c 6f   no, really unlo
14860 63 6b 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73 65  ck. */.  if ( se
14870 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3d 3d 2d 31  m_post(pSem)==-1
14880 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 2c   ) {.    int rc,
14890 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
148a0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
148b0 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
148c0 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
148d0 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
148e0 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  ;.    if( IS_LOC
148f0 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
14900 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
14910 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
14920 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  o);.    }.    re
14930 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20  turn rc; .  }.  
14940 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
14950 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65   = NO_LOCK;.  re
14960 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14970 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20  }../*. ** Close 
14980 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74  a file.. */.stat
14990 69 63 20 69 6e 74 20 73 65 6d 58 43 6c 6f 73 65  ic int semXClose
149a0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
149b0 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b  d) {.  if( id ){
149c0 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  .    unixFile *p
149d0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
149e0 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d 58 55 6e  *)id;.    semXUn
149f0 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
14a00 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
14a10 46 69 6c 65 20 29 3b 0a 20 20 20 20 75 6e 69 78  File );.    unix
14a20 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
14a30 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e    releaseInodeIn
14a40 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 75  fo(pFile);.    u
14a50 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
14a60 0a 20 20 20 20 63 6c 6f 73 65 55 6e 69 78 46 69  .    closeUnixFi
14a70 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65  le(id);.  }.  re
14a80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14a90 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f  }..#endif /* OS_
14aa0 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a  VXWORKS */./*.**
14ab0 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   Named semaphore
14ac0 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79   locking is only
14ad0 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 56 78   available on Vx
14ae0 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  Works..**.******
14af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
14b00 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d 61 70   the named semap
14b10 68 6f 72 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  hore lock implem
14b20 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
14b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
14b40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14b80 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a  ********/.../***
14b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
14be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14bf0 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 41 46  ******* Begin AF
14c00 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  P Locking ******
14c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
14c30 2a 20 41 46 50 20 69 73 20 74 68 65 20 41 70 70  * AFP is the App
14c40 6c 65 20 46 69 6c 69 6e 67 20 50 72 6f 74 6f 63  le Filing Protoc
14c50 6f 6c 2e 20 20 41 46 50 20 69 73 20 61 20 6e 65  ol.  AFP is a ne
14c60 74 77 6f 72 6b 20 66 69 6c 65 73 79 73 74 65 6d  twork filesystem
14c70 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70   found.** on App
14c80 6c 65 20 4d 61 63 69 6e 74 6f 73 68 20 63 6f 6d  le Macintosh com
14c90 70 75 74 65 72 73 20 2d 20 62 6f 74 68 20 4f 53  puters - both OS
14ca0 39 20 61 6e 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a  9 and OSX..**.**
14cb0 20 54 68 69 72 64 2d 70 61 72 74 79 20 69 6d 70   Third-party imp
14cc0 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20  lementations of 
14cd0 41 46 50 20 61 72 65 20 61 76 61 69 6c 61 62 6c  AFP are availabl
14ce0 65 2e 20 20 42 75 74 20 74 68 69 73 20 63 6f 64  e.  But this cod
14cf0 65 20 68 65 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77  e here.** only w
14d00 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a  orks on OSX..*/.
14d10 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
14d20 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
14d30 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
14d40 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _STYLE./*.** The
14d50 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
14d60 78 74 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  xt structure con
14d70 74 61 69 6e 73 20 61 6c 6c 20 61 66 70 20 6c 6f  tains all afp lo
14d80 63 6b 20 73 70 65 63 69 66 69 63 20 73 74 61 74  ck specific stat
14d90 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  e.*/.typedef str
14da0 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  uct afpLockingCo
14db0 6e 74 65 78 74 20 61 66 70 4c 6f 63 6b 69 6e 67  ntext afpLocking
14dc0 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20  Context;.struct 
14dd0 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
14de0 74 20 7b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  t {.  int reserv
14df0 65 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ed;.  const char
14e00 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20 20   *dbPath;       
14e10 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
14e20 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a   the open file *
14e30 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 42 79 74  /.};..struct Byt
14e40 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a  eRangeLockPB2.{.
14e50 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
14e60 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 20 20 20 20  long offset;    
14e70 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 74 6f      /* offset to
14e80 20 66 69 72 73 74 20 62 79 74 65 20 74 6f 20 6c   first byte to l
14e90 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ock */.  unsigne
14ea0 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67  d long long leng
14eb0 74 68 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 62  th;        /* nb
14ec0 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f  r of bytes to lo
14ed0 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ck */.  unsigned
14ee0 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65 74 52 61   long long retRa
14ef0 6e 67 65 53 74 61 72 74 3b 20 2f 2a 20 6e 62 72  ngeStart; /* nbr
14f00 20 6f 66 20 31 73 74 20 62 79 74 65 20 6c 6f 63   of 1st byte loc
14f10 6b 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75  ked if successfu
14f20 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
14f30 63 68 61 72 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b  char unLockFlag;
14f40 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 3d 20           /* 1 = 
14f50 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b  unlock, 0 = lock
14f60 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
14f70 68 61 72 20 73 74 61 72 74 45 6e 64 46 6c 61 67  har startEndFlag
14f80 3b 20 20 20 20 20 20 20 2f 2a 20 31 3d 72 65 6c  ;       /* 1=rel
14f90 20 74 6f 20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c   to end of fork,
14fa0 20 30 3d 72 65 6c 20 74 6f 20 73 74 61 72 74 20   0=rel to start 
14fb0 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20  */.  int fd;    
14fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14fd0 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 20 64         /* file d
14fe0 65 73 63 20 74 6f 20 61 73 73 6f 63 20 74 68 69  esc to assoc thi
14ff0 73 20 6c 6f 63 6b 20 77 69 74 68 20 2a 2f 0a 7d  s lock with */.}
15000 3b 0a 0a 23 64 65 66 69 6e 65 20 61 66 70 66 73  ;..#define afpfs
15010 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53  ByteRangeLock2FS
15020 43 54 4c 20 20 20 20 20 20 20 20 5f 49 4f 57 52  CTL        _IOWR
15030 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74  ('z', 23, struct
15040 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
15050 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  2)../*.** This i
15060 73 20 61 20 75 74 69 6c 69 74 79 20 66 6f 72 20  s a utility for 
15070 73 65 74 74 69 6e 67 20 6f 72 20 63 6c 65 61 72  setting or clear
15080 69 6e 67 20 61 20 62 69 74 2d 72 61 6e 67 65 20  ing a bit-range 
15090 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46  lock on an.** AF
150a0 50 20 66 69 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a  P filesystem..**
150b0 20 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49   .** Return SQLI
150c0 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
150d0 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 6e  , SQLITE_BUSY on
150e0 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61   failure..*/.sta
150f0 74 69 63 20 69 6e 74 20 61 66 70 53 65 74 4c 6f  tic int afpSetLo
15100 63 6b 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ck(.  const char
15110 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20 20   *path,         
15120 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
15130 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 6c  the file to be l
15140 6f 63 6b 65 64 20 6f 72 20 75 6e 6c 6f 63 6b 65  ocked or unlocke
15150 64 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20  d */.  unixFile 
15160 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  *pFile,         
15170 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69        /* Open fi
15180 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  le descriptor on
15190 20 70 61 74 68 20 2a 2f 0a 20 20 75 6e 73 69 67   path */.  unsig
151a0 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66  ned long long of
151b0 66 73 65 74 2c 20 20 20 20 20 2f 2a 20 46 69 72  fset,     /* Fir
151c0 73 74 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f  st byte to be lo
151d0 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  cked */.  unsign
151e0 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e  ed long long len
151f0 67 74 68 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62  gth,     /* Numb
15200 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c  er of bytes to l
15210 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 73 65 74  ock */.  int set
15220 4c 6f 63 6b 46 6c 61 67 20 20 20 20 20 20 20 20  LockFlag        
15230 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
15240 74 6f 20 73 65 74 20 6c 6f 63 6b 2e 20 20 46 61  to set lock.  Fa
15250 6c 73 65 20 74 6f 20 63 6c 65 61 72 20 6c 6f 63  lse to clear loc
15260 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  k */.){.  struct
15270 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
15280 32 20 70 62 3b 0a 20 20 69 6e 74 20 65 72 72 3b  2 pb;.  int err;
15290 0a 20 20 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b 46  .  .  pb.unLockF
152a0 6c 61 67 20 3d 20 73 65 74 4c 6f 63 6b 46 6c 61  lag = setLockFla
152b0 67 20 3f 20 30 20 3a 20 31 3b 0a 20 20 70 62 2e  g ? 0 : 1;.  pb.
152c0 73 74 61 72 74 45 6e 64 46 6c 61 67 20 3d 20 30  startEndFlag = 0
152d0 3b 0a 20 20 70 62 2e 6f 66 66 73 65 74 20 3d 20  ;.  pb.offset = 
152e0 6f 66 66 73 65 74 3b 0a 20 20 70 62 2e 6c 65 6e  offset;.  pb.len
152f0 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b 20 0a 20  gth = length; . 
15300 20 70 62 2e 66 64 20 3d 20 70 46 69 6c 65 2d 3e   pb.fd = pFile->
15310 68 3b 0a 20 20 0a 20 20 4f 53 54 52 41 43 45 28  h;.  .  OSTRACE(
15320 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 5b 25 73  ("AFPSETLOCK [%s
15330 5d 20 66 6f 72 20 25 64 25 73 20 69 6e 20 72 61  ] for %d%s in ra
15340 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22  nge %llx:%llx\n"
15350 2c 20 0a 20 20 20 20 28 73 65 74 4c 6f 63 6b 46  , .    (setLockF
15360 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46 46 22 29 2c  lag?"ON":"OFF"),
15370 20 70 46 69 6c 65 2d 3e 68 2c 20 28 70 62 2e 66   pFile->h, (pb.f
15380 64 3d 3d 2d 31 3f 22 5b 74 65 73 74 76 61 6c 2d  d==-1?"[testval-
15390 31 5d 22 3a 22 22 29 2c 0a 20 20 20 20 6f 66 66  1]":""),.    off
153a0 73 65 74 2c 20 6c 65 6e 67 74 68 29 29 3b 0a 20  set, length));. 
153b0 20 65 72 72 20 3d 20 66 73 63 74 6c 28 70 61 74   err = fsctl(pat
153c0 68 2c 20 61 66 70 66 73 42 79 74 65 52 61 6e 67  h, afpfsByteRang
153d0 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20 26 70 62  eLock2FSCTL, &pb
153e0 2c 20 30 29 3b 0a 20 20 69 66 20 28 20 65 72 72  , 0);.  if ( err
153f0 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e 74  ==-1 ) {.    int
15400 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 74 45 72   rc;.    int tEr
15410 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
15420 20 4f 53 54 52 41 43 45 28 28 22 41 46 50 53 45   OSTRACE(("AFPSE
15430 54 4c 4f 43 4b 20 66 61 69 6c 65 64 20 74 6f 20  TLOCK failed to 
15440 66 73 63 74 6c 28 29 20 27 25 73 27 20 25 64 20  fsctl() '%s' %d 
15450 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
15460 20 20 20 20 70 61 74 68 2c 20 74 45 72 72 6e 6f      path, tErrno
15470 2c 20 73 74 72 65 72 72 6f 72 28 74 45 72 72 6e  , strerror(tErrn
15480 6f 29 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  o)));.#ifdef SQL
15490 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c  ITE_IGNORE_AFP_L
154a0 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 72  OCK_ERRORS.    r
154b0 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
154c0 0a 23 65 6c 73 65 0a 20 20 20 20 72 63 20 3d 20  .#else.    rc = 
154d0 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
154e0 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
154f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15500 20 20 20 20 20 20 73 65 74 4c 6f 63 6b 46 6c 61        setLockFla
15510 67 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  g ? SQLITE_IOERR
15520 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49 54 45 5f 49  _LOCK : SQLITE_I
15530 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65  OERR_UNLOCK);.#e
15540 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49  ndif /* SQLITE_I
15550 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45  GNORE_AFP_LOCK_E
15560 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 69 66 28  RRORS */.    if(
15570 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
15580 63 29 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72  c) ){.      stor
15590 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
155a0 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d  , tErrno);.    }
155b0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
155c0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72    } else {.    r
155d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
155e0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
155f0 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
15600 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
15610 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
15620 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
15630 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
15640 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
15650 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
15660 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
15670 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
15680 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
15690 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
156a0 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
156b0 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
156c0 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
156d0 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
156e0 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
156f0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
15700 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
15710 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
15720 20 61 66 70 43 68 65 63 6b 52 65 73 65 72 76 65   afpCheckReserve
15730 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
15740 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
15750 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  sOut){.  int rc 
15760 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
15770 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b  nt reserved = 0;
15780 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
15790 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
157a0 69 64 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67  id;.  afpLocking
157b0 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  Context *context
157c0 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49  ;.  .  SimulateI
157d0 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
157e0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
157f0 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
15800 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
15810 46 69 6c 65 20 29 3b 0a 20 20 63 6f 6e 74 65 78  File );.  contex
15820 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43  t = (afpLockingC
15830 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d  ontext *) pFile-
15840 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
15850 0a 20 20 69 66 28 20 63 6f 6e 74 65 78 74 2d 3e  .  if( context->
15860 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20  reserved ){.    
15870 2a 70 52 65 73 4f 75 74 20 3d 20 31 3b 0a 20 20  *pResOut = 1;.  
15880 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15890 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e  OK;.  }.  unixEn
158a0 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42  terMutex(); /* B
158b0 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49  ecause pFile->pI
158c0 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61  node is shared a
158d0 63 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f  cross threads */
158e0 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  .  .  /* Check i
158f0 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68  f a thread in th
15900 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  is process holds
15910 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a   such a lock */.
15920 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e    if( pFile->pIn
15930 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53  ode->eFileLock>S
15940 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
15950 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
15960 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65    }.  .  /* Othe
15970 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d  rwise see if som
15980 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
15990 68 6f 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a  holds it..   */.
159a0 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20    if( !reserved 
159b0 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b 20 74  ){.    /* lock t
159c0 68 65 20 52 45 53 45 52 56 45 44 20 62 79 74 65  he RESERVED byte
159d0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20   */.    int lrc 
159e0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
159f0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
15a00 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59  ile, RESERVED_BY
15a10 54 45 2c 20 31 2c 31 29 3b 20 20 0a 20 20 20 20  TE, 1,1);  .    
15a20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c  if( SQLITE_OK==l
15a30 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69  rc ){.      /* i
15a40 66 20 77 65 20 73 75 63 63 65 65 64 65 64 20 69  f we succeeded i
15a50 6e 20 74 61 6b 69 6e 67 20 74 68 65 20 72 65 73  n taking the res
15a60 65 72 76 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f  erved lock, unlo
15a70 63 6b 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65  ck it to restore
15a80 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72  .      ** the or
15a90 69 67 69 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a  iginal state */.
15aa0 20 20 20 20 20 20 6c 72 63 20 3d 20 61 66 70 53        lrc = afpS
15ab0 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
15ac0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52  dbPath, pFile, R
15ad0 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c  ESERVED_BYTE, 1,
15ae0 20 30 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20   0);.    } else 
15af0 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65  {.      /* if we
15b00 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 74   failed to get t
15b10 68 65 20 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d  he lock then som
15b20 65 6f 6e 65 20 65 6c 73 65 20 6d 75 73 74 20 68  eone else must h
15b30 61 76 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20  ave it */.      
15b40 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
15b50 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c    }.    if( IS_L
15b60 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29  OCK_ERROR(lrc) )
15b70 7b 0a 20 20 20 20 20 20 72 63 3d 6c 72 63 3b 0a  {.      rc=lrc;.
15b80 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75      }.  }.  .  u
15b90 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
15ba0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53  .  OSTRACE(("TES
15bb0 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20  T WR-LOCK %d %d 
15bc0 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69  %d (afp)\n", pFi
15bd0 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
15be0 76 65 64 29 29 3b 0a 20 20 0a 20 20 2a 70 52 65  ved));.  .  *pRe
15bf0 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
15c00 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15c10 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
15c20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
15c30 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
15c40 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c  parameter eFileL
15c50 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ock - one.** of 
15c60 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
15c70 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
15c80 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
15c90 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
15ca0 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
15cb0 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
15cc0 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
15cd0 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
15ce0 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
15cf0 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
15d00 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
15d10 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
15d20 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
15d30 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
15d40 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
15d50 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
15d60 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
15d70 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
15d80 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
15d90 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
15da0 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
15db0 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
15dc0 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
15dd0 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
15de0 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
15df0 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
15e00 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
15e10 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
15e20 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
15e30 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
15e40 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
15e50 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
15e60 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
15e70 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
15e80 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
15e90 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
15ea0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
15eb0 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
15ec0 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  IVE.**.** This r
15ed0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
15ee0 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
15ef0 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
15f00 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
15f10 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
15f20 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
15f30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15f40 61 66 70 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  afpLock(sqlite3_
15f50 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
15f60 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20  ileLock){.  int 
15f70 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
15f80 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
15f90 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
15fa0 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  d;.  unixInodeIn
15fb0 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
15fc0 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 66  le->pInode;.  af
15fd0 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
15fe0 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c  *context = (afpL
15ff0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
16000 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
16010 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 61 73 73  ontext;.  .  ass
16020 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
16030 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
16040 20 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25    %d %s was %s(%
16050 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61 66  s,%d) pid=%d (af
16060 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  p)\n", pFile->h,
16070 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69  .           azFi
16080 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
16090 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46  ), azFileLock(pF
160a0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c  ile->eFileLock),
160b0 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69  .           azFi
160c0 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65  leLock(pInode->e
160d0 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64  FileLock), pInod
160e0 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20 6f 73 47  e->nShared , osG
160f0 65 74 70 69 64 28 30 29 29 29 3b 0a 0a 20 20 2f  etpid(0)));..  /
16100 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  * If there is al
16110 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20  ready a lock of 
16120 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72  this type or mor
16130 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e  e restrictive on
16140 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69   the.  ** unixFi
16150 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20  le, do nothing. 
16160 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 61 66  Don't use the af
16170 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74  p_end_lock: exit
16180 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75   path, as.  ** u
16190 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20  nixEnterMutex() 
161a0 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c  hasn't been call
161b0 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ed yet..  */.  i
161c0 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
161d0 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock>=eFileLock )
161e0 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
161f0 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b  LOCK    %d %s ok
16200 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29 20   (already held) 
16210 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
16220 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61  >h,.           a
16230 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
16240 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72 65 74 75  ock)));.    retu
16250 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
16260 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
16270 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65  e the locking se
16280 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63  quence is correc
16290 74 0a 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e  t.  **  (1) We n
162a0 65 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75  ever move from u
162b0 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68  nlocked to anyth
162c0 69 6e 67 20 68 69 67 68 65 72 20 74 68 61 6e 20  ing higher than 
162d0 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a  shared lock..  *
162e0 2a 20 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65  *  (2) SQLite ne
162f0 76 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72  ver explicitly r
16300 65 71 75 65 73 74 73 20 61 20 70 65 6e 64 69 67  equests a pendig
16310 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29   lock..  **  (3)
16320 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69   A shared lock i
16330 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68  s always held wh
16340 65 6e 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63  en a reserve loc
16350 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a  k is requested..
16360 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
16370 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21  File->eFileLock!
16380 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c  =NO_LOCK || eFil
16390 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
163a0 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
163b0 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49  eFileLock!=PENDI
163c0 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  NG_LOCK );.  ass
163d0 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d  ert( eFileLock!=
163e0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c  RESERVED_LOCK ||
163f0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
16400 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
16410 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d  ;.  .  /* This m
16420 75 74 65 78 20 69 73 20 6e 65 65 64 65 64 20 62  utex is needed b
16430 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49  ecause pFile->pI
16440 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61  node is shared a
16450 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20  cross threads.  
16460 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  */.  unixEnterMu
16470 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20  tex();.  pInode 
16480 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
16490 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74  ..  /* If some t
164a0 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73  hread using this
164b0 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20   PID has a lock 
164c0 76 69 61 20 61 20 64 69 66 66 65 72 65 6e 74 20  via a different 
164d0 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68  unixFile*.  ** h
164e0 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c  andle that precl
164f0 75 64 65 73 20 74 68 65 20 72 65 71 75 65 73 74  udes the request
16500 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20  ed lock, return 
16510 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  BUSY..  */.  if(
16520 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f   (pFile->eFileLo
16530 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  ck!=pInode->eFil
16540 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20 20 20 20  eLock && .      
16550 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c   (pInode->eFileL
16560 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock>=PENDING_LOC
16570 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53  K || eFileLock>S
16580 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 20  HARED_LOCK)).   
16590 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51    ){.    rc = SQ
165a0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67  LITE_BUSY;.    g
165b0 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  oto afp_end_lock
165c0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66  ;.  }.  .  /* If
165d0 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   a SHARED lock i
165e0 73 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64  s requested, and
165f0 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
16600 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c 72 65  ng this PID alre
16610 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53  ady.  ** has a S
16620 48 41 52 45 44 20 6f 72 20 52 45 53 45 52 56 45  HARED or RESERVE
16630 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63  D lock, then inc
16640 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65  rement reference
16650 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a   counts and.  **
16660 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16670 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  K..  */.  if( eF
16680 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
16690 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 28 70  LOCK && .     (p
166a0 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
166b0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
166c0 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
166d0 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
166e0 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  K) ){.    assert
166f0 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
16700 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
16710 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65  assert( pFile->e
16720 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  FileLock==0 );. 
16730 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
16740 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a  e->nShared>0 );.
16750 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
16760 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
16770 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  CK;.    pInode->
16780 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70  nShared++;.    p
16790 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  Inode->nLock++;.
167a0 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
167b0 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 20 20 0a  _lock;.  }.    .
167c0 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c    /* A PENDING l
167d0 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65  ock is needed be
167e0 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 61  fore acquiring a
167f0 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64   SHARED lock and
16800 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71   before.  ** acq
16810 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  uiring an EXCLUS
16820 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74  IVE lock.  For t
16830 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20  he SHARED lock, 
16840 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c  the PENDING will
16850 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65  .  ** be release
16860 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  d..  */.  if( eF
16870 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
16880 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28  LOCK .      || (
16890 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
168a0 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69  SIVE_LOCK && pFi
168b0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45  le->eFileLock<PE
168c0 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b  NDING_LOCK).  ){
168d0 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 3b  .    int failed;
168e0 0a 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66  .    failed = af
168f0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
16900 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
16910 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31   PENDING_BYTE, 1
16920 2c 20 31 29 3b 0a 20 20 20 20 69 66 20 28 66 61  , 1);.    if (fa
16930 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 72 63  iled) {.      rc
16940 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20   = failed;.     
16950 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
16960 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ck;.    }.  }.  
16970 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c  .  /* If control
16980 20 67 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f   gets to this po
16990 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c  int, then actual
169a0 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  ly go ahead and 
169b0 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74  make.  ** operat
169c0 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ing system calls
169d0 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69   for the specifi
169e0 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  ed lock..  */.  
169f0 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
16a00 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
16a10 20 20 69 6e 74 20 6c 72 63 31 2c 20 6c 72 63 32    int lrc1, lrc2
16a20 2c 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20 30 3b  , lrc1Errno = 0;
16a30 0a 20 20 20 20 6c 6f 6e 67 20 6c 6b 2c 20 6d 61  .    long lk, ma
16a40 73 6b 3b 0a 20 20 20 20 0a 20 20 20 20 61 73 73  sk;.    .    ass
16a50 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ert( pInode->nSh
16a60 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61  ared==0 );.    a
16a70 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65  ssert( pInode->e
16a80 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  FileLock==0 );. 
16a90 20 20 20 20 20 20 20 0a 20 20 20 20 6d 61 73 6b         .    mask
16aa0 20 3d 20 28 73 69 7a 65 6f 66 28 6c 6f 6e 67 29   = (sizeof(long)
16ab0 3d 3d 38 29 20 3f 20 4c 41 52 47 45 53 54 5f 49  ==8) ? LARGEST_I
16ac0 4e 54 36 34 20 3a 20 30 78 37 66 66 66 66 66 66  NT64 : 0x7ffffff
16ad0 66 3b 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65  f;.    /* Now ge
16ae0 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20  t the read-lock 
16af0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20  SHARED_LOCK */. 
16b00 20 20 20 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20     /* note that 
16b10 74 68 65 20 71 75 61 6c 69 74 79 20 6f 66 20 74  the quality of t
16b20 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f  he randomness do
16b30 65 73 6e 27 74 20 6d 61 74 74 65 72 20 74 68 61  esn't matter tha
16b40 74 20 6d 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b  t much */.    lk
16b50 20 3d 20 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20   = random(); .  
16b60 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64    pInode->shared
16b70 42 79 74 65 20 3d 20 28 6c 6b 20 26 20 6d 61 73  Byte = (lk & mas
16b80 6b 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45 20  k)%(SHARED_SIZE 
16b90 2d 20 31 29 3b 0a 20 20 20 20 6c 72 63 31 20 3d  - 1);.    lrc1 =
16ba0 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
16bb0 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
16bc0 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53  le, .          S
16bd0 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f  HARED_FIRST+pIno
16be0 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20  de->sharedByte, 
16bf0 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 49  1, 1);.    if( I
16c00 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
16c10 31 29 20 29 7b 0a 20 20 20 20 20 20 6c 72 63 31  1) ){.      lrc1
16c20 45 72 72 6e 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c  Errno = pFile->l
16c30 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a  astErrno;.    }.
16c40 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20      /* Drop the 
16c50 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e  temporary PENDIN
16c60 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 72  G lock */.    lr
16c70 63 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  c2 = afpSetLock(
16c80 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
16c90 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f   pFile, PENDING_
16ca0 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20  BYTE, 1, 0);.   
16cb0 20 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43   .    if( IS_LOC
16cc0 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29 20  K_ERROR(lrc1) ) 
16cd0 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  {.      storeLas
16ce0 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 6c 72  tErrno(pFile, lr
16cf0 63 31 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20  c1Errno);.      
16d00 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 20  rc = lrc1;.     
16d10 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
16d20 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  ck;.    } else i
16d30 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
16d40 28 6c 72 63 32 29 20 29 7b 0a 20 20 20 20 20 20  (lrc2) ){.      
16d50 72 63 20 3d 20 6c 72 63 32 3b 0a 20 20 20 20 20  rc = lrc2;.     
16d60 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
16d70 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  ck;.    } else i
16d80 66 28 20 6c 72 63 31 20 21 3d 20 53 51 4c 49 54  f( lrc1 != SQLIT
16d90 45 5f 4f 4b 20 29 20 7b 0a 20 20 20 20 20 20 72  E_OK ) {.      r
16da0 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 7d 20  c = lrc1;.    } 
16db0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 70 46 69  else {.      pFi
16dc0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
16dd0 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
16de0 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
16df0 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  ++;.      pInode
16e00 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a 20  ->nShared = 1;. 
16e10 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
16e20 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c   eFileLock==EXCL
16e30 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49  USIVE_LOCK && pI
16e40 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20  node->nShared>1 
16e50 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65  ){.    /* We are
16e60 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65   trying for an e
16e70 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75  xclusive lock bu
16e80 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  t another thread
16e90 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20 2a 2a   in this.     **
16ea0 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73   same process is
16eb0 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
16ec0 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f   shared lock. */
16ed0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
16ee0 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BUSY;.  }else{.
16ef0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
16f00 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53  st was for a RES
16f10 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
16f20 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a  VE lock.  It is.
16f30 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74      ** assumed t
16f40 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53  hat there is a S
16f50 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72  HARED or greater
16f60 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
16f70 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79  e.    ** already
16f80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
16f90 20 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20   failed = 0;.   
16fa0 20 61 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c   assert( 0!=pFil
16fb0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a  e->eFileLock );.
16fc0 20 20 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63      if (eFileLoc
16fd0 6b 20 3e 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f  k >= RESERVED_LO
16fe0 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69  CK && pFile->eFi
16ff0 6c 65 4c 6f 63 6b 20 3c 20 52 45 53 45 52 56 45  leLock < RESERVE
17000 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20  D_LOCK) {.      
17010 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52    /* Acquire a R
17020 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a  ESERVED lock */.
17030 20 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d          failed =
17040 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
17050 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
17060 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  le, RESERVED_BYT
17070 45 2c 20 31 2c 31 29 3b 0a 20 20 20 20 20 20 69  E, 1,1);.      i
17080 66 28 20 21 66 61 69 6c 65 64 20 29 7b 0a 20 20  f( !failed ){.  
17090 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72        context->r
170a0 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20  eserved = 1;.   
170b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
170c0 66 20 28 21 66 61 69 6c 65 64 20 26 26 20 65 46  f (!failed && eF
170d0 69 6c 65 4c 6f 63 6b 20 3d 3d 20 45 58 43 4c 55  ileLock == EXCLU
170e0 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  SIVE_LOCK) {.   
170f0 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e     /* Acquire an
17100 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
17110 2a 2f 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  */.        .    
17120 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
17130 73 68 61 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f  shared lock befo
17140 72 65 20 74 72 79 69 6e 67 20 74 68 65 20 72 61  re trying the ra
17150 6e 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64  nge.  we'll need
17160 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 72 65   to .      ** re
17170 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68  establish the sh
17180 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 77 65 20  ared lock if we 
17190 63 61 6e 27 74 20 67 65 74 20 74 68 65 20 20 61  can't get the  a
171a0 66 70 55 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 2a  fpUnlock.      *
171b0 2f 0a 20 20 20 20 20 20 69 66 28 20 21 28 66 61  /.      if( !(fa
171c0 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63  iled = afpSetLoc
171d0 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
171e0 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44  h, pFile, SHARED
171f0 5f 46 49 52 53 54 20 2b 0a 20 20 20 20 20 20 20  _FIRST +.       
17200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17210 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64    pInode->shared
17220 42 79 74 65 2c 20 31 2c 20 30 29 29 20 29 7b 0a  Byte, 1, 0)) ){.
17230 20 20 20 20 20 20 20 20 69 6e 74 20 66 61 69 6c          int fail
17240 65 64 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  ed2 = SQLITE_OK;
17250 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20  .        /* now 
17260 61 74 74 65 6d 6d 70 74 20 74 6f 20 67 65 74 20  attemmpt to get 
17270 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  the exclusive lo
17280 63 6b 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20  ck range */.    
17290 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70      failed = afp
172a0 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
172b0 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
172c0 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 0a 20  SHARED_FIRST, . 
172d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48                SH
172f0 41 52 45 44 5f 53 49 5a 45 2c 20 31 29 3b 0a 20  ARED_SIZE, 1);. 
17300 20 20 20 20 20 20 20 69 66 28 20 66 61 69 6c 65         if( faile
17310 64 20 26 26 20 28 66 61 69 6c 65 64 32 20 3d 20  d && (failed2 = 
17320 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
17330 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
17340 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
17350 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45             SHARE
17360 44 5f 46 49 52 53 54 20 2b 20 70 49 6e 6f 64 65  D_FIRST + pInode
17370 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c  ->sharedByte, 1,
17380 20 31 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20   1)) ){.        
17390 20 20 2f 2a 20 43 61 6e 27 74 20 72 65 65 73 74    /* Can't reest
173a0 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65  ablish the share
173b0 64 20 6c 6f 63 6b 2e 20 20 53 71 6c 69 74 65 20  d lock.  Sqlite 
173c0 63 61 6e 27 74 20 64 65 61 6c 2c 20 74 68 69 73  can't deal, this
173d0 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   is.          **
173e0 20 61 20 63 72 69 74 69 63 61 6c 20 49 2f 4f 20   a critical I/O 
173f0 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20  error.          
17400 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  */.          rc 
17410 3d 20 28 28 66 61 69 6c 65 64 20 26 20 53 51 4c  = ((failed & SQL
17420 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51  ITE_IOERR) == SQ
17430 4c 49 54 45 5f 49 4f 45 52 52 29 20 3f 20 66 61  LITE_IOERR) ? fa
17440 69 6c 65 64 32 20 3a 20 0a 20 20 20 20 20 20 20  iled2 : .       
17450 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
17460 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  OERR_LOCK;.     
17470 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
17480 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  d_lock;.        
17490 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  } .      }else{.
174a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 61 69          rc = fai
174b0 6c 65 64 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  led; .      }.  
174c0 20 20 7d 0a 20 20 20 20 69 66 28 20 66 61 69 6c    }.    if( fail
174d0 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ed ){.      rc =
174e0 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20   failed;.    }. 
174f0 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d   }.  .  if( rc==
17500 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17510 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
17520 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
17530 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
17540 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
17550 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46  ;.  }else if( eF
17560 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
17570 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  VE_LOCK ){.    p
17580 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
17590 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a  = PENDING_LOCK;.
175a0 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
175b0 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f  eLock = PENDING_
175c0 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70  LOCK;.  }.  .afp
175d0 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69  _end_lock:.  uni
175e0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
175f0 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
17600 20 20 20 25 64 20 25 73 20 25 73 20 28 61 66 70     %d %s %s (afp
17610 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
17620 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
17630 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20  Lock), .        
17640 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
17650 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
17660 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
17670 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
17680 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
17690 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
176a0 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
176b0 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
176c0 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
176d0 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
176e0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
176f0 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
17700 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
17710 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
17720 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
17730 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
17740 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
17750 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
17760 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
17770 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
17780 70 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  pUnlock(sqlite3_
17790 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
177a0 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74  ileLock) {.  int
177b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
177c0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
177d0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
177e0 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  id;.  unixInodeI
177f0 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 61  nfo *pInode;.  a
17800 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
17810 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70   *context = (afp
17820 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
17830 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  ) pFile->locking
17840 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 73  Context;.  int s
17850 6b 69 70 53 68 61 72 65 64 20 3d 20 30 3b 0a 23  kipShared = 0;.#
17860 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
17870 54 0a 20 20 69 6e 74 20 68 20 3d 20 70 46 69 6c  T.  int h = pFil
17880 65 2d 3e 68 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  e->h;.#endif..  
17890 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
178a0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
178b0 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
178c0 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20  d(%d,%d) pid=%d 
178d0 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
178e0 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
178f0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
17900 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c  >eFileLock, pFil
17910 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  e->pInode->eFile
17920 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e  Lock, pFile->pIn
17930 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20  ode->nShared,.  
17940 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 70 69           osGetpi
17950 64 28 30 29 29 29 3b 0a 0a 20 20 61 73 73 65 72  d(0)));..  asser
17960 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48  t( eFileLock<=SH
17970 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  ARED_LOCK );.  i
17980 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
17990 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock<=eFileLock )
179a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
179b0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e  ITE_OK;.  }.  un
179c0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
179d0 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65    pInode = pFile
179e0 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65  ->pInode;.  asse
179f0 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  rt( pInode->nSha
17a00 72 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  red!=0 );.  if( 
17a10 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
17a20 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
17a30 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
17a40 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70  de->eFileLock==p
17a50 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
17a60 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
17a70 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
17a80 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
17a90 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20  rror( h=(-1) ). 
17aa0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
17ab0 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
17ac0 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f   .#ifdef SQLITE_
17ad0 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65  DEBUG.    /* Whe
17ae0 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63  n reducing a loc
17af0 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74 68 65  k such that othe
17b00 72 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20  r processes can 
17b10 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61  start.    ** rea
17b20 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
17b30 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61  e file again, ma
17b40 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
17b50 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
17b60 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20  ion counter was 
17b70 75 70 64 61 74 65 64 20 69 66 20 61 6e 79 20 70  updated if any p
17b80 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  art of the datab
17b90 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  ase.    ** file 
17ba0 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65  changed.  If the
17bb0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
17bc0 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61  nter is not upda
17bd0 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65  ted,.    ** othe
17be0 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f  r connections to
17bf0 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d   the same file m
17c00 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65  ight not realize
17c10 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65   that.    ** the
17c20 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65   file has change
17c30 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68  d and hence migh
17c40 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c  t not know to fl
17c50 75 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a  ush their.    **
17c60 20 63 61 63 68 65 2e 20 20 54 68 65 20 75 73 65   cache.  The use
17c70 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63 68   of a stale cach
17c80 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61  e can lead to da
17c90 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
17ca0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  n..    */.    as
17cb0 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 69 6e 4e  sert( pFile->inN
17cc0 6f 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a 20 20  ormalWrite==0.  
17cd0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c           || pFil
17ce0 65 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30 0a 20  e->dbUpdate==0. 
17cf0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69            || pFi
17d00 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e  le->transCntrChn
17d10 67 3d 3d 31 20 29 3b 0a 20 20 20 20 70 46 69 6c  g==1 );.    pFil
17d20 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
17d30 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20   = 0;.#endif.   
17d40 20 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d   .    if( pFile-
17d50 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c  >eFileLock==EXCL
17d60 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  USIVE_LOCK ){.  
17d70 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c      rc = afpSetL
17d80 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
17d90 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52  ath, pFile, SHAR
17da0 45 44 5f 46 49 52 53 54 2c 20 53 48 41 52 45 44  ED_FIRST, SHARED
17db0 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 20  _SIZE, 0);.     
17dc0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17dd0 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b  OK && (eFileLock
17de0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
17df0 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
17e00 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  >1) ){.        /
17e10 2a 20 6f 6e 6c 79 20 72 65 2d 65 73 74 61 62 6c  * only re-establ
17e20 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c  ish the shared l
17e30 6f 63 6b 20 69 66 20 6e 65 63 65 73 73 61 72 79  ock if necessary
17e40 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
17e50 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d  sharedLockByte =
17e60 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49   SHARED_FIRST+pI
17e70 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65  node->sharedByte
17e80 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  ;.        rc = a
17e90 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
17ea0 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
17eb0 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  , sharedLockByte
17ec0 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  , 1, 1);.      }
17ed0 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
17ee0 73 6b 69 70 53 68 61 72 65 64 20 3d 20 31 3b 0a  skipShared = 1;.
17ef0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
17f00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17f10 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46  _OK && pFile->eF
17f20 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47  ileLock>=PENDING
17f30 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72  _LOCK ){.      r
17f40 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
17f50 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
17f60 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42  pFile, PENDING_B
17f70 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  YTE, 1, 0);.    
17f80 7d 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  } .    if( rc==S
17f90 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c  QLITE_OK && pFil
17fa0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 52 45  e->eFileLock>=RE
17fb0 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 63  SERVED_LOCK && c
17fc0 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64  ontext->reserved
17fd0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
17fe0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
17ff0 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
18000 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
18010 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   1, 0);.      if
18020 28 20 21 72 63 20 29 7b 20 0a 20 20 20 20 20 20  ( !rc ){ .      
18030 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72    context->reser
18040 76 65 64 20 3d 20 30 3b 20 0a 20 20 20 20 20 20  ved = 0; .      
18050 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
18060 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
18070 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41   (eFileLock==SHA
18080 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f  RED_LOCK || pIno
18090 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29 29 7b  de->nShared>1)){
180a0 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65  .      pInode->e
180b0 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
180c0 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20  D_LOCK;.    }.  
180d0 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
180e0 54 45 5f 4f 4b 20 26 26 20 65 46 69 6c 65 4c 6f  TE_OK && eFileLo
180f0 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a  ck==NO_LOCK ){..
18100 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74      /* Decrement
18110 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
18120 20 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65 61   counter.  Relea
18130 73 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e  se the lock usin
18140 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63  g an.    ** OS c
18150 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c  all only when al
18160 6c 20 74 68 72 65 61 64 73 20 69 6e 20 74 68 69  l threads in thi
18170 73 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68  s same process h
18180 61 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20  ave released.   
18190 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20   ** the lock..  
181a0 20 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65    */.    unsigne
181b0 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72  d long long shar
181c0 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41  edLockByte = SHA
181d0 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65  RED_FIRST+pInode
181e0 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20  ->sharedByte;.  
181f0 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65    pInode->nShare
18200 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  d--;.    if( pIn
18210 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20  ode->nShared==0 
18220 29 7b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  ){.      Simulat
18230 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
18240 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  );.      Simulat
18250 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29  eIOError( h=(-1)
18260 20 29 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74   ).      Simulat
18270 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
18280 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73 6b  );.      if( !sk
18290 69 70 53 68 61 72 65 64 20 29 7b 0a 20 20 20 20  ipShared ){.    
182a0 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c      rc = afpSetL
182b0 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
182c0 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68 61 72  ath, pFile, shar
182d0 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30  edLockByte, 1, 0
182e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
182f0 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20   if( !rc ){.    
18300 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
18310 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
18320 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
18330 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
18340 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  OCK;.      }.   
18350 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
18360 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18370 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d    pInode->nLock-
18380 2d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  -;.      assert(
18390 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d   pInode->nLock>=
183a0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
183b0 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20  Inode->nLock==0 
183c0 29 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65  ){.        close
183d0 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65  PendingFds(pFile
183e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
183f0 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65  .  }.  .  unixLe
18400 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66  aveMutex();.  if
18410 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18420 29 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ) pFile->eFileLo
18430 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
18440 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18450 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
18460 6c 65 20 26 20 63 6c 65 61 6e 75 70 20 41 46 50  le & cleanup AFP
18470 20 73 70 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e   specific lockin
18480 67 20 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73 74  g context .*/.st
18490 61 74 69 63 20 69 6e 74 20 61 66 70 43 6c 6f 73  atic int afpClos
184a0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
184b0 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d  id) {.  int rc =
184c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
184d0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
184e0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
184f0 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29   assert( id!=0 )
18500 3b 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 28 69 64  ;.  afpUnlock(id
18510 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 75 6e  , NO_LOCK);.  un
18520 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
18530 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e    if( pFile->pIn
18540 6f 64 65 20 26 26 20 70 46 69 6c 65 2d 3e 70 49  ode && pFile->pI
18550 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20  node->nLock ){. 
18560 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
18570 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  re outstanding l
18580 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74  ocks, do not act
18590 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20  ually close the 
185a0 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 2a 2a  file just.    **
185b0 20 79 65 74 20 62 65 63 61 75 73 65 20 74 68 61   yet because tha
185c0 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68  t would clear th
185d0 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74  ose locks.  Inst
185e0 65 61 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c  ead, add the fil
185f0 65 0a 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70  e.    ** descrip
18600 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 61  tor to pInode->a
18610 50 65 6e 64 69 6e 67 2e 20 20 49 74 20 77 69 6c  Pending.  It wil
18620 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  l be automatical
18630 6c 79 20 63 6c 6f 73 65 64 20 77 68 65 6e 0a 20  ly closed when. 
18640 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 6c     ** the last l
18650 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a  ock is cleared..
18660 20 20 20 20 2a 2f 0a 20 20 20 20 73 65 74 50 65      */.    setPe
18670 6e 64 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a  ndingFd(pFile);.
18680 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 49 6e 6f    }.  releaseIno
18690 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20  deInfo(pFile);. 
186a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46   sqlite3_free(pF
186b0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
186c0 65 78 74 29 3b 0a 20 20 72 63 20 3d 20 63 6c 6f  ext);.  rc = clo
186d0 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a  seUnixFile(id);.
186e0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
186f0 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ();.  return rc;
18700 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  .}..#endif /* de
18710 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
18720 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
18730 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
18740 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  */./*.** The cod
18750 65 20 61 62 6f 76 65 20 69 73 20 74 68 65 20 41  e above is the A
18760 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  FP lock implemen
18770 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64  tation.  The cod
18780 65 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a  e is specific.**
18790 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64   to MacOSX and d
187a0 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  oes not work on 
187b0 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66  other unix platf
187c0 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e  orms.  No altern
187d0 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69  ative.** is avai
187e0 6c 61 62 6c 65 2e 20 20 49 66 20 79 6f 75 20 64  lable.  If you d
187f0 6f 6e 27 74 20 63 6f 6d 70 69 6c 65 20 66 6f 72  on't compile for
18800 20 61 20 6d 61 63 2c 20 74 68 65 6e 20 74 68 65   a mac, then the
18810 20 22 75 6e 69 78 2d 61 66 70 22 0a 2a 2a 20 56   "unix-afp".** V
18820 46 53 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61  FS is not availa
18830 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ble..**.********
18840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
18850 64 20 6f 66 20 74 68 65 20 41 46 50 20 6c 6f 63  d of the AFP loc
18860 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
18870 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
18880 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
18890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
188a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
188b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
188c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
188d0 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
188e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
188f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18920 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
18930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18940 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 46 53 20 4c  **** Begin NFS L
18950 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
18960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18970 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 20 64 65  *******/..#if de
18980 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
18990 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
189a0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
189b0 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72 20 74 68 65  /*. ** Lower the
189c0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
189d0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
189e0 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
189f0 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
18a00 0a 20 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  . ** must be eit
18a10 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
18a20 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a  HARED_LOCK.. **.
18a30 20 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69   ** If the locki
18a40 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
18a50 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
18a60 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
18a70 20 62 65 6c 6f 77 0a 20 2a 2a 20 74 68 65 20 72   below. ** the r
18a80 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
18a90 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
18aa0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
18ab0 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
18ac0 6e 66 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  nfsUnlock(sqlite
18ad0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
18ae0 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 72 65  eFileLock){.  re
18af0 74 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b  turn posixUnlock
18b00 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20  (id, eFileLock, 
18b10 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  1);.}..#endif /*
18b20 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
18b30 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
18b40 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
18b50 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20  LE */./*.** The 
18b60 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74 68  code above is th
18b70 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65  e NFS lock imple
18b80 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20  mentation.  The 
18b90 63 6f 64 65 20 69 73 20 73 70 65 63 69 66 69 63  code is specific
18ba0 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e  .** to MacOSX an
18bb0 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  d does not work 
18bc0 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c  on other unix pl
18bd0 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74  atforms.  No alt
18be0 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61  ernative.** is a
18bf0 76 61 69 6c 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a  vailable.  .**.*
18c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18c10 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
18c20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  NFS lock impleme
18c30 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
18c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
18c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
18ca0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
18cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
18cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18d00 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c   Non-locking sql
18d10 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64  ite3_file method
18d20 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
18d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
18d40 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 64  **.** The next d
18d50 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ivision contains
18d60 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
18d70 20 66 6f 72 20 61 6c 6c 20 6d 65 74 68 6f 64 73   for all methods
18d80 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69   of the .** sqli
18d90 74 65 33 5f 66 69 6c 65 20 6f 62 6a 65 63 74 20  te3_file object 
18da0 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6c  other than the l
18db0 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 2e 20  ocking methods. 
18dc0 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20   The locking.** 
18dd0 6d 65 74 68 6f 64 73 20 77 65 72 65 20 64 65 66  methods were def
18de0 69 6e 65 64 20 69 6e 20 64 69 76 69 73 69 6f 6e  ined in division
18df0 73 20 61 62 6f 76 65 20 28 6f 6e 65 20 6c 6f 63  s above (one loc
18e00 6b 69 6e 67 20 6d 65 74 68 6f 64 20 70 65 72 0a  king method per.
18e10 2a 2a 20 64 69 76 69 73 69 6f 6e 29 2e 20 20 54  ** division).  T
18e20 68 6f 73 65 20 6d 65 74 68 6f 64 73 20 74 68 61  hose methods tha
18e30 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20  t are common to 
18e40 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  all locking mode
18e50 73 0a 2a 2a 20 61 72 65 20 67 61 74 68 65 72 20  s.** are gather 
18e60 74 6f 67 65 74 68 65 72 20 69 6e 74 6f 20 74 68  together into th
18e70 69 73 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a  is division..*/.
18e80 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74  ./*.** Seek to t
18e90 68 65 20 6f 66 66 73 65 74 20 70 61 73 73 65 64  he offset passed
18ea0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
18eb0 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e 20 72 65  rgument, then re
18ec0 61 64 20 63 6e 74 20 0a 2a 2a 20 62 79 74 65 73  ad cnt .** bytes
18ed0 20 69 6e 74 6f 20 70 42 75 66 2e 20 52 65 74 75   into pBuf. Retu
18ee0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
18ef0 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
18f00 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20  read..**.** NB: 
18f10 20 49 66 20 79 6f 75 20 64 65 66 69 6e 65 20 55   If you define U
18f20 53 45 5f 50 52 45 41 44 20 6f 72 20 55 53 45 5f  SE_PREAD or USE_
18f30 50 52 45 41 44 36 34 2c 20 74 68 65 6e 20 69 74  PREAD64, then it
18f40 20 6d 69 67 68 74 20 61 6c 73 6f 0a 2a 2a 20 62   might also.** b
18f50 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64  e necessary to d
18f60 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55  efine _XOPEN_SOU
18f70 52 43 45 20 74 6f 20 62 65 20 35 30 30 2e 20 20  RCE to be 500.  
18f80 54 68 69 73 20 76 61 72 69 65 73 20 66 72 6f 6d  This varies from
18f90 0a 2a 2a 20 6f 6e 65 20 73 79 73 74 65 6d 20 74  .** one system t
18fa0 6f 20 61 6e 6f 74 68 65 72 2e 20 20 53 69 6e 63  o another.  Sinc
18fb0 65 20 53 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f  e SQLite does no
18fc0 74 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45  t define USE_PRE
18fd0 41 44 0a 2a 2a 20 69 6e 20 61 6e 79 20 66 6f 72  AD.** in any for
18fe0 6d 20 62 79 20 64 65 66 61 75 6c 74 2c 20 77 65  m by default, we
18ff0 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70   will not attemp
19000 74 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50  t to define _XOP
19010 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a 2a 20 53 65  EN_SOURCE..** Se
19020 65 20 74 69 63 6b 65 74 73 20 23 32 37 34 31 20  e tickets #2741 
19030 61 6e 64 20 23 32 36 38 31 2e 0a 2a 2a 0a 2a 2a  and #2681..**.**
19040 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70 69   To avoid stompi
19050 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61 6c  ng the errno val
19060 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20 72  ue on a failed r
19070 65 61 64 20 74 68 65 20 6c 61 73 74 45 72 72 6e  ead the lastErrn
19080 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  o value.** is se
19090 74 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  t before returni
190a0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
190b0 74 20 73 65 65 6b 41 6e 64 52 65 61 64 28 75 6e  t seekAndRead(un
190c0 69 78 46 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69  ixFile *id, sqli
190d0 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74  te3_int64 offset
190e0 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e  , void *pBuf, in
190f0 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f  t cnt){.  int go
19100 74 3b 0a 20 20 69 6e 74 20 70 72 69 6f 72 20 3d  t;.  int prior =
19110 20 30 3b 0a 23 69 66 20 28 21 64 65 66 69 6e 65   0;.#if (!define
19120 64 28 55 53 45 5f 50 52 45 41 44 29 20 26 26 20  d(USE_PREAD) && 
19130 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45  !defined(USE_PRE
19140 41 44 36 34 29 29 0a 20 20 69 36 34 20 6e 65 77  AD64)).  i64 new
19150 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69 66 0a 20  Offset;.#endif. 
19160 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 20 20   TIMER_START;.  
19170 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 28 63 6e  assert( cnt==(cn
19180 74 26 30 78 31 66 66 66 66 29 20 29 3b 0a 20 20  t&0x1ffff) );.  
19190 61 73 73 65 72 74 28 20 69 64 2d 3e 68 3e 32 20  assert( id->h>2 
191a0 29 3b 0a 20 20 64 6f 7b 0a 23 69 66 20 64 65 66  );.  do{.#if def
191b0 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a  ined(USE_PREAD).
191c0 20 20 20 20 67 6f 74 20 3d 20 6f 73 50 72 65 61      got = osPrea
191d0 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  d(id->h, pBuf, c
191e0 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  nt, offset);.   
191f0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
19200 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65  ( got = -1 );.#e
19210 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  lif defined(USE_
19220 50 52 45 41 44 36 34 29 0a 20 20 20 20 67 6f 74  PREAD64).    got
19230 20 3d 20 6f 73 50 72 65 61 64 36 34 28 69 64 2d   = osPread64(id-
19240 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f  >h, pBuf, cnt, o
19250 66 66 73 65 74 29 3b 0a 20 20 20 20 53 69 6d 75  ffset);.    Simu
19260 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74  lateIOError( got
19270 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 73 65 0a 20   = -1 );.#else. 
19280 20 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c     newOffset = l
19290 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73  seek(id->h, offs
192a0 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20  et, SEEK_SET);. 
192b0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
192c0 6f 72 28 20 6e 65 77 4f 66 66 73 65 74 20 3d 20  or( newOffset = 
192d0 2d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65  -1 );.    if( ne
192e0 77 4f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20  wOffset<0 ){.   
192f0 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
19300 6f 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c  o((unixFile*)id,
19310 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72   errno);.      r
19320 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
19330 20 20 20 20 67 6f 74 20 3d 20 6f 73 52 65 61 64      got = osRead
19340 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
19350 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  t);.#endif.    i
19360 66 28 20 67 6f 74 3d 3d 63 6e 74 20 29 20 62 72  f( got==cnt ) br
19370 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 67 6f 74  eak;.    if( got
19380 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  <0 ){.      if( 
19390 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 7b 20  errno==EINTR ){ 
193a0 67 6f 74 20 3d 20 31 3b 20 63 6f 6e 74 69 6e 75  got = 1; continu
193b0 65 3b 20 7d 0a 20 20 20 20 20 20 70 72 69 6f 72  e; }.      prior
193c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 6f 72   = 0;.      stor
193d0 65 4c 61 73 74 45 72 72 6e 6f 28 28 75 6e 69 78  eLastErrno((unix
193e0 46 69 6c 65 2a 29 69 64 2c 20 20 65 72 72 6e 6f  File*)id,  errno
193f0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
19400 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f      }else if( go
19410 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 63 6e 74  t>0 ){.      cnt
19420 20 2d 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 6f   -= got;.      o
19430 66 66 73 65 74 20 2b 3d 20 67 6f 74 3b 0a 20 20  ffset += got;.  
19440 20 20 20 20 70 72 69 6f 72 20 2b 3d 20 67 6f 74      prior += got
19450 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 28  ;.      pBuf = (
19460 76 6f 69 64 2a 29 28 67 6f 74 20 2b 20 28 63 68  void*)(got + (ch
19470 61 72 2a 29 70 42 75 66 29 3b 0a 20 20 20 20 7d  ar*)pBuf);.    }
19480 0a 20 20 7d 77 68 69 6c 65 28 20 67 6f 74 3e 30  .  }while( got>0
19490 20 29 3b 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b   );.  TIMER_END;
194a0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41  .  OSTRACE(("REA
194b0 44 20 20 20 20 25 2d 33 64 20 25 35 64 20 25 37  D    %-3d %5d %7
194c0 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 0a 20 20 20  lld %llu\n",.   
194d0 20 20 20 20 20 20 20 20 20 69 64 2d 3e 68 2c 20           id->h, 
194e0 67 6f 74 2b 70 72 69 6f 72 2c 20 6f 66 66 73 65  got+prior, offse
194f0 74 2d 70 72 69 6f 72 2c 20 54 49 4d 45 52 5f 45  t-prior, TIMER_E
19500 4c 41 50 53 45 44 29 29 3b 0a 20 20 72 65 74 75  LAPSED));.  retu
19510 72 6e 20 67 6f 74 2b 70 72 69 6f 72 3b 0a 7d 0a  rn got+prior;.}.
19520 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61  ./*.** Read data
19530 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74   from a file int
19540 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52 65 74  o a buffer.  Ret
19550 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
19560 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65   all.** bytes we
19570 72 65 20 72 65 61 64 20 73 75 63 63 65 73 73 66  re read successf
19580 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f  ully and SQLITE_
19590 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e  IOERR if anythin
195a0 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
195b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
195c0 6e 69 78 52 65 61 64 28 0a 20 20 73 71 6c 69 74  nixRead(.  sqlit
195d0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20  e3_file *id, .  
195e0 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69  void *pBuf, .  i
195f0 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65  nt amt,.  sqlite
19600 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 0a 29  3_int64 offset.)
19610 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
19620 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  ile = (unixFile 
19630 2a 29 69 64 3b 0a 20 20 69 6e 74 20 67 6f 74 3b  *)id;.  int got;
19640 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b  .  assert( id );
19650 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
19660 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t>=0 );.  assert
19670 28 20 61 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a  ( amt>0 );..  /*
19680 20 49 66 20 74 68 69 73 20 69 73 20 61 20 64 61   If this is a da
19690 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74  tabase file (not
196a0 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74   a journal, mast
196b0 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65  er-journal or te
196c0 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74  mp.  ** file), t
196d0 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  he bytes in the 
196e0 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 73 68  locking range sh
196f0 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20 72 65  ould never be re
19700 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a  ad or written. *
19710 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74  /.#if 0.  assert
19720 28 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64  ( pFile->pUnused
19730 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66  ==0.       || of
19740 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59  fset>=PENDING_BY
19750 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20 7c 7c  TE+512.       ||
19760 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e   offset+amt<=PEN
19770 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a  DING_BYTE .  );.
19780 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
19790 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
197a0 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74  >0.  /* Deal wit
197b0 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69  h as much of thi
197c0 73 20 72 65 61 64 20 72 65 71 75 65 73 74 20 61  s read request a
197d0 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72  s possible by tr
197e0 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64  ansfering.  ** d
197f0 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d  ata from the mem
19800 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e  ory mapping usin
19810 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a  g memcpy().  */.
19820 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69    if( offset<pFi
19830 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  le->mmapSize ){.
19840 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61      if( offset+a
19850 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  mt <= pFile->mma
19860 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d  pSize ){.      m
19870 65 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28 75  emcpy(pBuf, &((u
19880 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70  8 *)(pFile->pMap
19890 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d  Region))[offset]
198a0 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 72 65  , amt);.      re
198b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
198c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
198d0 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70 46 69   int nCopy = pFi
198e0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f  le->mmapSize - o
198f0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 6d 65 6d  ffset;.      mem
19900 63 70 79 28 70 42 75 66 2c 20 26 28 28 75 38 20  cpy(pBuf, &((u8 
19910 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65  *)(pFile->pMapRe
19920 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20  gion))[offset], 
19930 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42  nCopy);.      pB
19940 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75  uf = &((u8 *)pBu
19950 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20  f)[nCopy];.     
19960 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20   amt -= nCopy;. 
19970 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e       offset += n
19980 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Copy;.    }.  }.
19990 23 65 6e 64 69 66 0a 0a 20 20 67 6f 74 20 3d 20  #endif..  got = 
199a0 73 65 65 6b 41 6e 64 52 65 61 64 28 70 46 69 6c  seekAndRead(pFil
199b0 65 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c  e, offset, pBuf,
199c0 20 61 6d 74 29 3b 0a 20 20 69 66 28 20 67 6f 74   amt);.  if( got
199d0 3d 3d 61 6d 74 20 29 7b 0a 20 20 20 20 72 65 74  ==amt ){.    ret
199e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
199f0 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3c 30   }else if( got<0
19a00 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 61 73 74 45   ){.    /* lastE
19a10 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b  rrno set by seek
19a20 41 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20 20 72  AndRead */.    r
19a30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
19a40 52 52 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65  RR_READ;.  }else
19a50 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45  {.    storeLastE
19a60 72 72 6e 6f 28 70 46 69 6c 65 2c 20 30 29 3b 20  rrno(pFile, 0); 
19a70 20 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74 65    /* not a syste
19a80 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 2f  m error */.    /
19a90 2a 20 55 6e 72 65 61 64 20 70 61 72 74 73 20 6f  * Unread parts o
19aa0 66 20 74 68 65 20 62 75 66 66 65 72 20 6d 75 73  f the buffer mus
19ab0 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64  t be zero-filled
19ac0 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
19ad0 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 67 6f  ((char*)pBuf)[go
19ae0 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29 3b  t], 0, amt-got);
19af0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
19b00 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
19b10 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  EAD;.  }.}../*.*
19b20 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 65  * Attempt to see
19b30 6b 20 74 68 65 20 66 69 6c 65 2d 64 65 73 63 72  k the file-descr
19b40 69 70 74 6f 72 20 70 61 73 73 65 64 20 61 73 20  iptor passed as 
19b50 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
19b60 6e 74 20 74 6f 0a 2a 2a 20 61 62 73 6f 6c 75 74  nt to.** absolut
19b70 65 20 6f 66 66 73 65 74 20 69 4f 66 66 2c 20 74  e offset iOff, t
19b80 68 65 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 77  hen attempt to w
19b90 72 69 74 65 20 6e 42 75 66 20 62 79 74 65 73 20  rite nBuf bytes 
19ba0 6f 66 20 64 61 74 61 20 66 72 6f 6d 0a 2a 2a 20  of data from.** 
19bb0 70 42 75 66 20 74 6f 20 69 74 2e 20 49 66 20 61  pBuf to it. If a
19bc0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
19bd0 72 65 74 75 72 6e 20 2d 31 20 61 6e 64 20 73 65  return -1 and se
19be0 74 20 2a 70 69 45 72 72 6e 6f 2e 20 4f 74 68 65  t *piErrno. Othe
19bf0 72 77 69 73 65 2c 20 0a 2a 2a 20 72 65 74 75 72  rwise, .** retur
19c00 6e 20 74 68 65 20 61 63 74 75 61 6c 20 6e 75 6d  n the actual num
19c10 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69  ber of bytes wri
19c20 74 74 65 6e 20 28 77 68 69 63 68 20 6d 61 79 20  tten (which may 
19c30 62 65 20 6c 65 73 73 20 74 68 61 6e 0a 2a 2a 20  be less than.** 
19c40 6e 42 75 66 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  nBuf)..*/.static
19c50 20 69 6e 74 20 73 65 65 6b 41 6e 64 57 72 69 74   int seekAndWrit
19c60 65 46 64 28 0a 20 20 69 6e 74 20 66 64 2c 20 20  eFd(.  int fd,  
19c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c80 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
19c90 65 73 63 72 69 70 74 6f 72 20 74 6f 20 77 72 69  escriptor to wri
19ca0 74 65 20 74 6f 20 2a 2f 0a 20 20 69 36 34 20 69  te to */.  i64 i
19cb0 4f 66 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Off,            
19cc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
19cd0 6c 65 20 6f 66 66 73 65 74 20 74 6f 20 62 65 67  le offset to beg
19ce0 69 6e 20 77 72 69 74 69 6e 67 20 61 74 20 2a 2f  in writing at */
19cf0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
19d00 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
19d10 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20     /* Copy data 
19d20 66 72 6f 6d 20 74 68 69 73 20 62 75 66 66 65 72  from this buffer
19d30 20 74 6f 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a   to the file */.
19d40 20 20 69 6e 74 20 6e 42 75 66 2c 20 20 20 20 20    int nBuf,     
19d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d60 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66    /* Size of buf
19d70 66 65 72 20 70 42 75 66 20 69 6e 20 62 79 74 65  fer pBuf in byte
19d80 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 45 72  s */.  int *piEr
19d90 72 6e 6f 20 20 20 20 20 20 20 20 20 20 20 20 20  rno             
19da0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45         /* OUT: E
19db0 72 72 6f 72 20 6e 75 6d 62 65 72 20 69 66 20 65  rror number if e
19dc0 72 72 6f 72 20 6f 63 63 75 72 73 20 2a 2f 0a 29  rror occurs */.)
19dd0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20  {.  int rc = 0; 
19de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19df0 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74      /* Value ret
19e00 75 72 6e 65 64 20 62 79 20 73 79 73 74 65 6d 20  urned by system 
19e10 63 61 6c 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72  call */..  asser
19e20 74 28 20 6e 42 75 66 3d 3d 28 6e 42 75 66 26 30  t( nBuf==(nBuf&0
19e30 78 31 66 66 66 66 29 20 29 3b 0a 20 20 61 73 73  x1ffff) );.  ass
19e40 65 72 74 28 20 66 64 3e 32 20 29 3b 0a 20 20 61  ert( fd>2 );.  a
19e50 73 73 65 72 74 28 20 70 69 45 72 72 6e 6f 21 3d  ssert( piErrno!=
19e60 30 20 29 3b 0a 20 20 6e 42 75 66 20 26 3d 20 30  0 );.  nBuf &= 0
19e70 78 31 66 66 66 66 3b 0a 20 20 54 49 4d 45 52 5f  x1ffff;.  TIMER_
19e80 53 54 41 52 54 3b 0a 0a 23 69 66 20 64 65 66 69  START;..#if defi
19e90 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20  ned(USE_PREAD). 
19ea0 20 64 6f 7b 20 72 63 20 3d 20 28 69 6e 74 29 6f   do{ rc = (int)o
19eb0 73 50 77 72 69 74 65 28 66 64 2c 20 70 42 75 66  sPwrite(fd, pBuf
19ec0 2c 20 6e 42 75 66 2c 20 69 4f 66 66 29 3b 20 7d  , nBuf, iOff); }
19ed0 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
19ee0 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23  rrno==EINTR );.#
19ef0 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  elif defined(USE
19f00 5f 50 52 45 41 44 36 34 29 0a 20 20 64 6f 7b 20  _PREAD64).  do{ 
19f10 72 63 20 3d 20 28 69 6e 74 29 6f 73 50 77 72 69  rc = (int)osPwri
19f20 74 65 36 34 28 66 64 2c 20 70 42 75 66 2c 20 6e  te64(fd, pBuf, n
19f30 42 75 66 2c 20 69 4f 66 66 29 3b 7d 77 68 69 6c  Buf, iOff);}whil
19f40 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f  e( rc<0 && errno
19f50 3d 3d 45 49 4e 54 52 29 3b 0a 23 65 6c 73 65 0a  ==EINTR);.#else.
19f60 20 20 64 6f 7b 0a 20 20 20 20 69 36 34 20 69 53    do{.    i64 iS
19f70 65 65 6b 20 3d 20 6c 73 65 65 6b 28 66 64 2c 20  eek = lseek(fd, 
19f80 69 4f 66 66 2c 20 53 45 45 4b 5f 53 45 54 29 3b  iOff, SEEK_SET);
19f90 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
19fa0 72 72 6f 72 28 20 69 53 65 65 6b 20 3d 20 2d 31  rror( iSeek = -1
19fb0 20 29 3b 0a 20 20 20 20 69 66 28 20 69 53 65 65   );.    if( iSee
19fc0 6b 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  k<0 ){.      rc 
19fd0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 62 72 65 61  = -1;.      brea
19fe0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  k;.    }.    rc 
19ff0 3d 20 6f 73 57 72 69 74 65 28 66 64 2c 20 70 42  = osWrite(fd, pB
1a000 75 66 2c 20 6e 42 75 66 29 3b 0a 20 20 7d 77 68  uf, nBuf);.  }wh
1a010 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72  ile( rc<0 && err
1a020 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6e  no==EINTR );.#en
1a030 64 69 66 0a 0a 20 20 54 49 4d 45 52 5f 45 4e 44  dif..  TIMER_END
1a040 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57 52  ;.  OSTRACE(("WR
1a050 49 54 45 20 20 20 25 2d 33 64 20 25 35 64 20 25  ITE   %-3d %5d %
1a060 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 66 64  7lld %llu\n", fd
1a070 2c 20 72 63 2c 20 69 4f 66 66 2c 20 54 49 4d 45  , rc, iOff, TIME
1a080 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 0a 20 20  R_ELAPSED));..  
1a090 69 66 28 20 72 63 3c 30 20 29 20 2a 70 69 45 72  if( rc<0 ) *piEr
1a0a0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 72  rno = errno;.  r
1a0b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
1a0c0 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20  .** Seek to the 
1a0d0 6f 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66  offset in id->of
1a0e0 66 73 65 74 20 74 68 65 6e 20 72 65 61 64 20 63  fset then read c
1a0f0 6e 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42  nt bytes into pB
1a100 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  uf..** Return th
1a110 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1a120 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e  s actually read.
1a130 20 20 55 70 64 61 74 65 20 74 68 65 20 6f 66 66    Update the off
1a140 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76  set..**.** To av
1a150 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65  oid stomping the
1a160 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20   errno value on 
1a170 61 20 66 61 69 6c 65 64 20 77 72 69 74 65 20 74  a failed write t
1a180 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c  he lastErrno val
1a190 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66  ue.** is set bef
1a1a0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
1a1b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
1a1c0 6b 41 6e 64 57 72 69 74 65 28 75 6e 69 78 46 69  kAndWrite(unixFi
1a1d0 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73  le *id, i64 offs
1a1e0 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  et, const void *
1a1f0 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a  pBuf, int cnt){.
1a200 20 20 72 65 74 75 72 6e 20 73 65 65 6b 41 6e 64    return seekAnd
1a210 57 72 69 74 65 46 64 28 69 64 2d 3e 68 2c 20 6f  WriteFd(id->h, o
1a220 66 66 73 65 74 2c 20 70 42 75 66 2c 20 63 6e 74  ffset, pBuf, cnt
1a230 2c 20 26 69 64 2d 3e 6c 61 73 74 45 72 72 6e 6f  , &id->lastErrno
1a240 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  );.}.../*.** Wri
1a250 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62  te data from a b
1a260 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c  uffer into a fil
1a270 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
1a280 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a  E_OK on success.
1a290 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  ** or some other
1a2a0 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66   error code on f
1a2b0 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ailure..*/.stati
1a2c0 63 20 69 6e 74 20 75 6e 69 78 57 72 69 74 65 28  c int unixWrite(
1a2d0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
1a2e0 2a 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f  *id, .  const vo
1a2f0 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74  id *pBuf, .  int
1a300 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f   amt,.  sqlite3_
1a310 69 6e 74 36 34 20 6f 66 66 73 65 74 20 0a 29 7b  int64 offset .){
1a320 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
1a330 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
1a340 69 64 3b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20  id;.  int wrote 
1a350 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69  = 0;.  assert( i
1a360 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  d );.  assert( a
1a370 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  mt>0 );..  /* If
1a380 20 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62   this is a datab
1a390 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20  ase file (not a 
1a3a0 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d  journal, master-
1a3b0 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a  journal or temp.
1a3c0 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20    ** file), the 
1a3d0 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63  bytes in the loc
1a3e0 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c  king range shoul
1a3f0 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20  d never be read 
1a400 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23  or written. */.#
1a410 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70  if 0.  assert( p
1a420 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30  File->pUnused==0
1a430 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65  .       || offse
1a440 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b  t>=PENDING_BYTE+
1a450 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66  512.       || of
1a460 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e  fset+amt<=PENDIN
1a470 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e  G_BYTE .  );.#en
1a480 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
1a490 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 49 66  TE_DEBUG.  /* If
1a4a0 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20   we are doing a 
1a4b0 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20  normal write to 
1a4c0 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
1a4d0 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20  (as opposed to. 
1a4e0 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d   ** doing a hot-
1a4f0 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
1a500 20 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20 73   or a write to s
1a510 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74  ome file other t
1a520 68 61 6e 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61  han a.  ** norma
1a530 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29  l database file)
1a540 20 74 68 65 6e 20 72 65 63 6f 72 64 20 74 68 65   then record the
1a550 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20 64   fact that the d
1a560 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 68 61 73  atabase.  ** has
1a570 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68   changed.  If th
1a580 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
1a590 75 6e 74 65 72 20 69 73 20 6d 6f 64 69 66 69 65  unter is modifie
1a5a0 64 2c 20 72 65 63 6f 72 64 20 74 68 61 74 0a 20  d, record that. 
1a5b0 20 2a 2a 20 66 61 63 74 20 74 6f 6f 2e 0a 20 20   ** fact too..  
1a5c0 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
1a5d0 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 29 7b  inNormalWrite ){
1a5e0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70  .    pFile->dbUp
1a5f0 64 61 74 65 20 3d 20 31 3b 20 20 2f 2a 20 54 68  date = 1;  /* Th
1a600 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62  e database has b
1a610 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a  een modified */.
1a620 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3c 3d      if( offset<=
1a630 32 34 20 26 26 20 6f 66 66 73 65 74 2b 61 6d 74  24 && offset+amt
1a640 3e 3d 32 37 20 29 7b 0a 20 20 20 20 20 20 69 6e  >=27 ){.      in
1a650 74 20 72 63 3b 0a 20 20 20 20 20 20 63 68 61 72  t rc;.      char
1a660 20 6f 6c 64 43 6e 74 72 5b 34 5d 3b 0a 20 20 20   oldCntr[4];.   
1a670 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
1a680 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
1a690 20 20 20 72 63 20 3d 20 73 65 65 6b 41 6e 64 52     rc = seekAndR
1a6a0 65 61 64 28 70 46 69 6c 65 2c 20 32 34 2c 20 6f  ead(pFile, 24, o
1a6b0 6c 64 43 6e 74 72 2c 20 34 29 3b 0a 20 20 20 20  ldCntr, 4);.    
1a6c0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1a6d0 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
1a6e0 20 20 69 66 28 20 72 63 21 3d 34 20 7c 7c 20 6d    if( rc!=4 || m
1a6f0 65 6d 63 6d 70 28 6f 6c 64 43 6e 74 72 2c 20 26  emcmp(oldCntr, &
1a700 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 32 34  ((char*)pBuf)[24
1a710 2d 6f 66 66 73 65 74 5d 2c 20 34 29 21 3d 30 20  -offset], 4)!=0 
1a720 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
1a730 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20  ->transCntrChng 
1a740 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 74 72 61  = 1;  /* The tra
1a750 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
1a760 20 68 61 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a   has changed */.
1a770 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1a780 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65  }.#endif..#if de
1a790 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4d 4d 41  fined(SQLITE_MMA
1a7a0 50 5f 52 45 41 44 57 52 49 54 45 29 20 26 26 20  P_READWRITE) && 
1a7b0 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
1a7c0 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c  SIZE>0.  /* Deal
1a7d0 20 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f 66   with as much of
1a7e0 20 74 68 69 73 20 77 72 69 74 65 20 72 65 71 75   this write requ
1a7f0 65 73 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20  est as possible 
1a800 62 79 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20  by transfering. 
1a810 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68   ** data from th
1a820 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67  e memory mapping
1a830 20 75 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e   using memcpy().
1a840 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65    */.  if( offse
1a850 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  t<pFile->mmapSiz
1a860 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66  e ){.    if( off
1a870 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65  set+amt <= pFile
1a880 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
1a890 20 20 20 20 6d 65 6d 63 70 79 28 26 28 28 75 38      memcpy(&((u8
1a8a0 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52   *)(pFile->pMapR
1a8b0 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c  egion))[offset],
1a8c0 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 20   pBuf, amt);.   
1a8d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1a8e0 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
1a8f0 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20        int nCopy 
1a900 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  = pFile->mmapSiz
1a910 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  e - offset;.    
1a920 20 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a    memcpy(&((u8 *
1a930 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  )(pFile->pMapReg
1a940 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70  ion))[offset], p
1a950 42 75 66 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20  Buf, nCopy);.   
1a960 20 20 20 70 42 75 66 20 3d 20 26 28 28 75 38 20     pBuf = &((u8 
1a970 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a  *)pBuf)[nCopy];.
1a980 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f        amt -= nCo
1a990 70 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74  py;.      offset
1a9a0 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d   += nCopy;.    }
1a9b0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 0a 20 20  .  }.#endif. .  
1a9c0 77 68 69 6c 65 28 20 28 77 72 6f 74 65 20 3d 20  while( (wrote = 
1a9d0 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69  seekAndWrite(pFi
1a9e0 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66  le, offset, pBuf
1a9f0 2c 20 61 6d 74 29 29 3c 61 6d 74 20 26 26 20 77  , amt))<amt && w
1aa00 72 6f 74 65 3e 30 20 29 7b 0a 20 20 20 20 61 6d  rote>0 ){.    am
1aa10 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20  t -= wrote;.    
1aa20 6f 66 66 73 65 74 20 2b 3d 20 77 72 6f 74 65 3b  offset += wrote;
1aa30 0a 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 63  .    pBuf = &((c
1aa40 68 61 72 2a 29 70 42 75 66 29 5b 77 72 6f 74 65  har*)pBuf)[wrote
1aa50 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74  ];.  }.  Simulat
1aa60 65 49 4f 45 72 72 6f 72 28 28 20 77 72 6f 74 65  eIOError(( wrote
1aa70 3d 28 2d 31 29 2c 20 61 6d 74 3d 31 20 29 29 3b  =(-1), amt=1 ));
1aa80 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66  .  SimulateDiskf
1aa90 75 6c 6c 45 72 72 6f 72 28 28 20 77 72 6f 74 65  ullError(( wrote
1aaa0 3d 30 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 0a 20  =0, amt=1 ));.. 
1aab0 20 69 66 28 20 61 6d 74 3e 77 72 6f 74 65 20 29   if( amt>wrote )
1aac0 7b 0a 20 20 20 20 69 66 28 20 77 72 6f 74 65 3c  {.    if( wrote<
1aad0 30 20 26 26 20 70 46 69 6c 65 2d 3e 6c 61 73 74  0 && pFile->last
1aae0 45 72 72 6e 6f 21 3d 45 4e 4f 53 50 43 20 29 7b  Errno!=ENOSPC ){
1aaf0 0a 20 20 20 20 20 20 2f 2a 20 6c 61 73 74 45 72  .      /* lastEr
1ab00 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41  rno set by seekA
1ab10 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20  ndWrite */.     
1ab20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1ab30 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20  OERR_WRITE;.    
1ab40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 6f  }else{.      sto
1ab50 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
1ab60 65 2c 20 30 29 3b 20 2f 2a 20 6e 6f 74 20 61 20  e, 0); /* not a 
1ab70 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a  system error */.
1ab80 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1ab90 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a  ITE_FULL;.    }.
1aba0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
1abb0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64  LITE_OK;.}..#ifd
1abc0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
1abd0 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e  *.** Count the n
1abe0 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e  umber of fullsyn
1abf0 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79  cs and normal sy
1ac00 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  ncs.  This is us
1ac10 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68  ed to test.** th
1ac20 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c  at syncs and ful
1ac30 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72  lsyncs are occur
1ac40 72 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68  ring at the righ
1ac50 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20  t times..*/.int 
1ac60 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75  sqlite3_sync_cou
1ac70 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69  nt = 0;.int sqli
1ac80 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  te3_fullsync_cou
1ac90 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
1aca0 2f 2a 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20  /*.** We do not 
1acb0 74 72 75 73 74 20 73 79 73 74 65 6d 73 20 74 6f  trust systems to
1acc0 20 70 72 6f 76 69 64 65 20 61 20 77 6f 72 6b 69   provide a worki
1acd0 6e 67 20 66 64 61 74 61 73 79 6e 63 28 29 2e 20  ng fdatasync(). 
1ace0 20 53 6f 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68   Some do..** Oth
1acf0 65 72 73 20 64 6f 20 6e 6f 2e 20 20 54 6f 20 62  ers do no.  To b
1ad00 65 20 73 61 66 65 2c 20 77 65 20 77 69 6c 6c 20  e safe, we will 
1ad10 73 74 69 63 6b 20 77 69 74 68 20 74 68 65 20 28  stick with the (
1ad20 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 29  slightly slower)
1ad30 0a 2a 2a 20 66 73 79 6e 63 28 29 2e 20 49 66 20  .** fsync(). If 
1ad40 79 6f 75 20 6b 6e 6f 77 20 74 68 61 74 20 79 6f  you know that yo
1ad50 75 72 20 73 79 73 74 65 6d 20 64 6f 65 73 20 73  ur system does s
1ad60 75 70 70 6f 72 74 20 66 64 61 74 61 73 79 6e 63  upport fdatasync
1ad70 28 29 20 63 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a  () correctly,.**
1ad80 20 74 68 65 6e 20 73 69 6d 70 6c 79 20 63 6f 6d   then simply com
1ad90 70 69 6c 65 20 77 69 74 68 20 2d 44 66 64 61 74  pile with -Dfdat
1ada0 61 73 79 6e 63 3d 66 64 61 74 61 73 79 6e 63 20  async=fdatasync 
1adb0 6f 72 20 2d 44 48 41 56 45 5f 46 44 41 54 41 53  or -DHAVE_FDATAS
1adc0 59 4e 43 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  YNC.*/.#if !defi
1add0 6e 65 64 28 66 64 61 74 61 73 79 6e 63 29 20 26  ned(fdatasync) &
1ade0 26 20 21 48 41 56 45 5f 46 44 41 54 41 53 59 4e  & !HAVE_FDATASYN
1adf0 43 0a 23 20 64 65 66 69 6e 65 20 66 64 61 74 61  C.# define fdata
1ae00 73 79 6e 63 20 66 73 79 6e 63 0a 23 65 6e 64 69  sync fsync.#endi
1ae10 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  f../*.** Define 
1ae20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 74  HAVE_FULLFSYNC t
1ae30 6f 20 30 20 6f 72 20 31 20 64 65 70 65 6e 64 69  o 0 or 1 dependi
1ae40 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ng on whether or
1ae50 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 46 5f 46 55   not.** the F_FU
1ae60 4c 4c 46 53 59 4e 43 20 6d 61 63 72 6f 20 69 73  LLFSYNC macro is
1ae70 20 64 65 66 69 6e 65 64 2e 20 20 46 5f 46 55 4c   defined.  F_FUL
1ae80 4c 46 53 59 4e 43 20 69 73 20 63 75 72 72 65 6e  LFSYNC is curren
1ae90 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61 69  tly.** only avai
1aea0 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 20 4f 53 20  lable on Mac OS 
1aeb0 58 2e 20 20 42 75 74 20 74 68 61 74 20 63 6f 75  X.  But that cou
1aec0 6c 64 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69  ld change..*/.#i
1aed0 66 64 65 66 20 46 5f 46 55 4c 4c 46 53 59 4e 43  fdef F_FULLFSYNC
1aee0 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46  .# define HAVE_F
1aef0 55 4c 4c 46 53 59 4e 43 20 31 0a 23 65 6c 73 65  ULLFSYNC 1.#else
1af00 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46  .# define HAVE_F
1af10 55 4c 4c 46 53 59 4e 43 20 30 0a 23 65 6e 64 69  ULLFSYNC 0.#endi
1af20 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73  f.../*.** The fs
1af30 79 6e 63 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ync() system cal
1af40 6c 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  l does not work 
1af50 61 73 20 61 64 76 65 72 74 69 73 65 64 20 6f 6e  as advertised on
1af60 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79   many.** unix sy
1af70 73 74 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c  stems.  The foll
1af80 6f 77 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20  owing procedure 
1af90 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f  is an attempt to
1afa0 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b   make.** it work
1afb0 20 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   better..**.** T
1afc0 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  he SQLITE_NO_SYN
1afd0 43 20 6d 61 63 72 6f 20 64 69 73 61 62 6c 65 73  C macro disables
1afe0 20 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20 20   all fsync()s.  
1aff0 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 0a 2a  This is useful.*
1b000 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20 77 68  * for testing wh
1b010 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 72 75  en we want to ru
1b020 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 74 65  n through the te
1b030 73 74 20 73 75 69 74 65 20 71 75 69 63 6b 6c 79  st suite quickly
1b040 2e 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73 74 72  ..** You are str
1b050 6f 6e 67 6c 79 20 61 64 76 69 73 65 64 20 2a 6e  ongly advised *n
1b060 6f 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77 69  ot* to deploy wi
1b070 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  th SQLITE_NO_SYN
1b080 43 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f  C.** enabled, ho
1b090 77 65 76 65 72 2c 20 73 69 6e 63 65 20 77 69 74  wever, since wit
1b0a0 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  h SQLITE_NO_SYNC
1b0b0 20 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20   enabled, an OS 
1b0c0 63 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65  crash.** or powe
1b0d0 72 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c  r failure will l
1b0e0 69 6b 65 6c 79 20 63 6f 72 72 75 70 74 20 74 68  ikely corrupt th
1b0f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1b100 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65  .**.** SQLite se
1b110 74 73 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20  ts the dataOnly 
1b120 66 6c 61 67 20 69 66 20 74 68 65 20 73 69 7a 65  flag if the size
1b130 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   of the file is 
1b140 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 54 68  unchanged..** Th
1b150 65 20 69 64 65 61 20 62 65 68 69 6e 64 20 64 61  e idea behind da
1b160 74 61 4f 6e 6c 79 20 69 73 20 74 68 61 74 20 69  taOnly is that i
1b170 74 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 77 72  t should only wr
1b180 69 74 65 20 74 68 65 20 66 69 6c 65 20 63 6f 6e  ite the file con
1b190 74 65 6e 74 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c  tent.** to disk,
1b1a0 20 6e 6f 74 20 74 68 65 20 69 6e 6f 64 65 2e 20   not the inode. 
1b1b0 20 57 65 20 6f 6e 6c 79 20 73 65 74 20 64 61 74   We only set dat
1b1c0 61 4f 6e 6c 79 20 69 66 20 74 68 65 20 66 69 6c  aOnly if the fil
1b1d0 65 20 73 69 7a 65 20 69 73 20 0a 2a 2a 20 75 6e  e size is .** un
1b1e0 63 68 61 6e 67 65 64 20 73 69 6e 63 65 20 74 68  changed since th
1b1f0 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 70  e file size is p
1b200 61 72 74 20 6f 66 20 74 68 65 20 69 6e 6f 64 65  art of the inode
1b210 2e 20 20 48 6f 77 65 76 65 72 2c 20 0a 2a 2a 20  .  However, .** 
1b220 54 65 64 20 54 73 27 6f 20 74 65 6c 6c 73 20 75  Ted Ts'o tells u
1b230 73 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63  s that fdatasync
1b240 28 29 20 77 69 6c 6c 20 61 6c 73 6f 20 77 72 69  () will also wri
1b250 74 65 20 74 68 65 20 69 6e 6f 64 65 20 69 66 20  te the inode if 
1b260 74 68 65 0a 2a 2a 20 66 69 6c 65 20 73 69 7a 65  the.** file size
1b270 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20 54   has changed.  T
1b280 68 65 20 6f 6e 6c 79 20 72 65 61 6c 20 64 69 66  he only real dif
1b290 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
1b2a0 66 64 61 74 61 73 79 6e 63 28 29 0a 2a 2a 20 61  fdatasync().** a
1b2b0 6e 64 20 66 73 79 6e 63 28 29 2c 20 54 65 64 20  nd fsync(), Ted 
1b2c0 74 65 6c 6c 73 20 75 73 2c 20 69 73 20 74 68 61  tells us, is tha
1b2d0 74 20 66 64 61 74 61 73 79 6e 63 28 29 20 77 69  t fdatasync() wi
1b2e0 6c 6c 20 6e 6f 74 20 66 6c 75 73 68 20 74 68 65  ll not flush the
1b2f0 0a 2a 2a 20 69 6e 6f 64 65 20 69 66 20 74 68 65  .** inode if the
1b300 20 6d 74 69 6d 65 20 6f 72 20 6f 77 6e 65 72 20   mtime or owner 
1b310 6f 72 20 6f 74 68 65 72 20 69 6e 6f 64 65 20 61  or other inode a
1b320 74 74 72 69 62 75 74 65 73 20 68 61 76 65 20 63  ttributes have c
1b330 68 61 6e 67 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e  hanged..** We on
1b340 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 74 68  ly care about th
1b350 65 20 66 69 6c 65 20 73 69 7a 65 2c 20 6e 6f 74  e file size, not
1b360 20 74 68 65 20 6f 74 68 65 72 20 66 69 6c 65 20   the other file 
1b370 61 74 74 72 69 62 75 74 65 73 2c 20 73 6f 0a 2a  attributes, so.*
1b380 2a 20 61 73 20 66 61 72 20 61 73 20 53 51 4c 69  * as far as SQLi
1b390 74 65 20 69 73 20 63 6f 6e 63 65 72 6e 65 64 2c  te is concerned,
1b3a0 20 61 6e 20 66 64 61 74 61 73 79 6e 63 28 29 20   an fdatasync() 
1b3b0 69 73 20 61 6c 77 61 79 73 20 61 64 65 71 75 61  is always adequa
1b3c0 74 65 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20 61 6c  te..** So, we al
1b3d0 77 61 79 73 20 75 73 65 20 66 64 61 74 61 73 79  ways use fdatasy
1b3e0 6e 63 28 29 20 69 66 20 69 74 20 69 73 20 61 76  nc() if it is av
1b3f0 61 69 6c 61 62 6c 65 2c 20 72 65 67 61 72 64 6c  ailable, regardl
1b400 65 73 73 20 6f 66 0a 2a 2a 20 74 68 65 20 76 61  ess of.** the va
1b410 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 4f  lue of the dataO
1b420 6e 6c 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61  nly flag..*/.sta
1b430 74 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79  tic int full_fsy
1b440 6e 63 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 66  nc(int fd, int f
1b450 75 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61 74  ullSync, int dat
1b460 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63  aOnly){.  int rc
1b470 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;..  /* The foll
1b480 6f 77 69 6e 67 20 22 69 66 64 65 66 2f 65 6c 69  owing "ifdef/eli
1b490 66 2f 65 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68  f/else/" block h
1b4a0 61 73 20 74 68 65 20 73 61 6d 65 20 73 74 72 75  as the same stru
1b4b0 63 74 75 72 65 20 61 73 0a 20 20 2a 2a 20 74 68  cture as.  ** th
1b4c0 65 20 6f 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20  e one below. It 
1b4d0 69 73 20 72 65 70 6c 69 63 61 74 65 64 20 68 65  is replicated he
1b4e0 72 65 20 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f  re solely to avo
1b4f0 69 64 20 63 6c 75 74 74 65 72 69 6e 67 20 0a 20  id cluttering . 
1b500 20 2a 2a 20 75 70 20 74 68 65 20 72 65 61 6c 20   ** up the real 
1b510 63 6f 64 65 20 77 69 74 68 20 74 68 65 20 55 4e  code with the UN
1b520 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 29  USED_PARAMETER()
1b530 20 6d 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69   macros..  */.#i
1b540 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  fdef SQLITE_NO_S
1b550 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  YNC.  UNUSED_PAR
1b560 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e  AMETER(fd);.  UN
1b570 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
1b580 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53  ullSync);.  UNUS
1b590 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74  ED_PARAMETER(dat
1b5a0 61 4f 6e 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41  aOnly);.#elif HA
1b5b0 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55  VE_FULLFSYNC.  U
1b5c0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1b5d0 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65  dataOnly);.#else
1b5e0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1b5f0 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20  TER(fullSync);. 
1b600 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1b610 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e  R(dataOnly);.#en
1b620 64 69 66 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64  dif..  /* Record
1b630 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
1b640 69 6d 65 73 20 74 68 61 74 20 77 65 20 64 6f 20  imes that we do 
1b650 61 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29  a normal fsync()
1b660 20 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53   and .  ** FULLS
1b670 59 4e 43 2e 20 20 54 68 69 73 20 69 73 20 75 73  YNC.  This is us
1b680 65 64 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  ed during testin
1b690 67 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  g to verify that
1b6a0 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a   this procedure.
1b6b0 20 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 64    ** gets called
1b6c0 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63   with the correc
1b6d0 74 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a  t arguments..  *
1b6e0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1b6f0 54 45 53 54 0a 20 20 69 66 28 20 66 75 6c 6c 53  TEST.  if( fullS
1b700 79 6e 63 20 29 20 73 71 6c 69 74 65 33 5f 66 75  ync ) sqlite3_fu
1b710 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a  llsync_count++;.
1b720 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63    sqlite3_sync_c
1b730 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a  ount++;.#endif..
1b740 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69    /* If we compi
1b750 6c 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c  led with the SQL
1b760 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67  ITE_NO_SYNC flag
1b770 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69  , then syncing i
1b780 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20  s a.  ** no-op. 
1b790 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
1b7a0 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 63 20 3d  E_NO_SYNC.  rc =
1b7b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 69   SQLITE_OK;.#eli
1b7c0 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  f HAVE_FULLFSYNC
1b7d0 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20  .  if( fullSync 
1b7e0 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63  ){.    rc = osFc
1b7f0 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53  ntl(fd, F_FULLFS
1b800 59 4e 43 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  YNC, 0);.  }else
1b810 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  {.    rc = 1;.  
1b820 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 46 55  }.  /* If the FU
1b830 4c 4c 46 53 59 4e 43 20 66 61 69 6c 65 64 2c 20  LLFSYNC failed, 
1b840 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 61 74 74  fall back to att
1b850 65 6d 70 74 69 6e 67 20 61 6e 20 66 73 79 6e 63  empting an fsync
1b860 28 29 2e 0a 20 20 2a 2a 20 49 74 20 73 68 6f 75  ()..  ** It shou
1b870 6c 64 6e 27 74 20 62 65 20 70 6f 73 73 69 62 6c  ldn't be possibl
1b880 65 20 66 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20  e for fullfsync 
1b890 74 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c  to fail on the l
1b8a0 6f 63 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  ocal .  ** file 
1b8b0 73 79 73 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c  system (on OSX),
1b8c0 20 73 6f 20 66 61 69 6c 75 72 65 20 69 6e 64 69   so failure indi
1b8d0 63 61 74 65 73 20 74 68 61 74 20 46 55 4c 4c 46  cates that FULLF
1b8e0 53 59 4e 43 0a 20 20 2a 2a 20 69 73 6e 27 74 20  SYNC.  ** isn't 
1b8f0 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20 74 68  supported for th
1b900 69 73 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20  is file system. 
1b910 53 6f 2c 20 61 74 74 65 6d 70 74 20 61 6e 20 66  So, attempt an f
1b920 73 79 6e 63 20 0a 20 20 2a 2a 20 61 6e 64 20 28  sync .  ** and (
1b930 66 6f 72 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20  for now) ignore 
1b940 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20  the overhead of 
1b950 61 20 73 75 70 65 72 66 6c 75 6f 75 73 20 66 63  a superfluous fc
1b960 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a  ntl call.  .  **
1b970 20 49 74 27 64 20 62 65 20 62 65 74 74 65 72 20   It'd be better 
1b980 74 6f 20 64 65 74 65 63 74 20 66 75 6c 6c 66 73  to detect fullfs
1b990 79 6e 63 20 73 75 70 70 6f 72 74 20 6f 6e 63 65  ync support once
1b9a0 20 61 6e 64 20 61 76 6f 69 64 20 0a 20 20 2a 2a   and avoid .  **
1b9b0 20 74 68 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20   the fcntl call 
1b9c0 65 76 65 72 79 20 74 69 6d 65 20 73 79 6e 63 20  every time sync 
1b9d0 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a  is called..  */.
1b9e0 20 20 69 66 28 20 72 63 20 29 20 72 63 20 3d 20    if( rc ) rc = 
1b9f0 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 69  fsync(fd);..#eli
1ba00 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
1ba10 45 5f 5f 29 0a 20 20 2f 2a 20 66 64 61 74 61 73  E__).  /* fdatas
1ba20 79 6e 63 28 29 20 6f 6e 20 48 46 53 2b 20 64 6f  ync() on HFS+ do
1ba30 65 73 6e 27 74 20 79 65 74 20 66 6c 75 73 68 20  esn't yet flush 
1ba40 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69 66  the file size if
1ba50 20 69 74 20 63 68 61 6e 67 65 64 20 63 6f 72 72   it changed corr
1ba60 65 63 74 6c 79 0a 20 20 2a 2a 20 73 6f 20 63 75  ectly.  ** so cu
1ba70 72 72 65 6e 74 6c 79 20 77 65 20 64 65 66 61 75  rrently we defau
1ba80 6c 74 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20  lt to the macro 
1ba90 74 68 61 74 20 72 65 64 65 66 69 6e 65 73 20 66  that redefines f
1baa0 64 61 74 61 73 79 6e 63 20 74 6f 20 66 73 79 6e  datasync to fsyn
1bab0 63 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66 73  c.  */.  rc = fs
1bac0 79 6e 63 28 66 64 29 3b 0a 23 65 6c 73 65 20 0a  ync(fd);.#else .
1bad0 20 20 72 63 20 3d 20 66 64 61 74 61 73 79 6e 63    rc = fdatasync
1bae0 28 66 64 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57  (fd);.#if OS_VXW
1baf0 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 3d 3d 2d  ORKS.  if( rc==-
1bb00 31 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54  1 && errno==ENOT
1bb10 53 55 50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  SUP ){.    rc = 
1bb20 66 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23  fsync(fd);.  }.#
1bb30 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f  endif /* OS_VXWO
1bb40 52 4b 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a  RKS */.#endif /*
1bb50 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f   ifdef SQLITE_NO
1bb60 5f 53 59 4e 43 20 65 6c 69 66 20 48 41 56 45 5f  _SYNC elif HAVE_
1bb70 46 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20 20  FULLFSYNC */..  
1bb80 69 66 28 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26  if( OS_VXWORKS &
1bb90 26 20 72 63 21 3d 20 2d 31 20 29 7b 0a 20 20 20  & rc!= -1 ){.   
1bba0 20 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72   rc = 0;.  }.  r
1bbb0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1bbc0 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 20 64  ** Open a file d
1bbd0 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65  escriptor to the
1bbe0 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61   directory conta
1bbf0 69 6e 69 6e 67 20 66 69 6c 65 20 7a 46 69 6c 65  ining file zFile
1bc00 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20 73 75 63 63  name..** If succ
1bc10 65 73 73 66 75 6c 2c 20 2a 70 46 64 20 69 73 20  essful, *pFd is 
1bc20 73 65 74 20 74 6f 20 74 68 65 20 6f 70 65 6e 65  set to the opene
1bc30 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
1bc40 72 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  r and.** SQLITE_
1bc50 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
1bc60 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1bc70 72 73 2c 20 65 69 74 68 65 72 20 53 51 4c 49 54  rs, either SQLIT
1bc80 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51  E_NOMEM.** or SQ
1bc90 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 69 73  LITE_CANTOPEN is
1bca0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
1bcb0 46 64 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20  Fd is set to an 
1bcc0 75 6e 64 65 66 69 6e 65 64 0a 2a 2a 20 76 61 6c  undefined.** val
1bcd0 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69  ue..**.** The di
1bce0 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73  rectory file des
1bcf0 63 72 69 70 74 6f 72 20 69 73 20 75 73 65 64 20  criptor is used 
1bd00 66 6f 72 20 6f 6e 6c 79 20 6f 6e 65 20 74 68 69  for only one thi
1bd10 6e 67 20 2d 20 74 6f 0a 2a 2a 20 66 73 79 6e 63  ng - to.** fsync
1bd20 28 29 20 61 20 64 69 72 65 63 74 6f 72 79 20 74  () a directory t
1bd30 6f 20 6d 61 6b 65 20 73 75 72 65 20 66 69 6c 65  o make sure file
1bd40 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20 64 65   creation and de
1bd50 6c 65 74 69 6f 6e 20 65 76 65 6e 74 73 0a 2a 2a  letion events.**
1bd60 20 61 72 65 20 66 6c 75 73 68 65 64 20 74 6f 20   are flushed to 
1bd70 64 69 73 6b 2e 20 20 53 75 63 68 20 66 73 79 6e  disk.  Such fsyn
1bd80 63 73 20 61 72 65 20 6e 6f 74 20 6e 65 65 64 65  cs are not neede
1bd90 64 20 6f 6e 20 6e 65 77 65 72 0a 2a 2a 20 6a 6f  d on newer.** jo
1bda0 75 72 6e 61 6c 69 6e 67 20 66 69 6c 65 73 79 73  urnaling filesys
1bdb0 74 65 6d 73 2c 20 62 75 74 20 61 72 65 20 72 65  tems, but are re
1bdc0 71 75 69 72 65 64 20 6f 6e 20 6f 6c 64 65 72 20  quired on older 
1bdd0 66 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a 0a  filesystems..**.
1bde0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1bdf0 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65  can be overridde
1be00 6e 20 75 73 69 6e 67 20 74 68 65 20 78 53 65 74  n using the xSet
1be10 53 79 73 43 61 6c 6c 20 69 6e 74 65 72 66 61 63  SysCall interfac
1be20 65 2e 0a 2a 2a 20 54 68 65 20 61 62 69 6c 69 74  e..** The abilit
1be30 79 20 74 6f 20 6f 76 65 72 72 69 64 65 20 74 68  y to override th
1be40 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 61  is routine was a
1be50 64 64 65 64 20 69 6e 20 73 75 70 70 6f 72 74 20  dded in support 
1be60 6f 66 20 74 68 65 0a 2a 2a 20 63 68 72 6f 6d 69  of the.** chromi
1be70 75 6d 20 73 61 6e 64 62 6f 78 2e 20 20 4f 70 65  um sandbox.  Ope
1be80 6e 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79  ning a directory
1be90 20 69 73 20 61 20 73 65 63 75 72 69 74 79 20 72   is a security r
1bea0 69 73 6b 20 28 77 65 20 61 72 65 0a 2a 2a 20 74  isk (we are.** t
1beb0 6f 6c 64 29 20 73 6f 20 6d 61 6b 69 6e 67 20 69  old) so making i
1bec0 74 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 61  t overrideable a
1bed0 6c 6c 6f 77 73 20 74 68 65 20 63 68 72 6f 6d 69  llows the chromi
1bee0 75 6d 20 73 61 6e 64 62 6f 78 20 74 6f 0a 2a 2a  um sandbox to.**
1bef0 20 72 65 70 6c 61 63 65 20 74 68 69 73 20 72 6f   replace this ro
1bf00 75 74 69 6e 65 20 77 69 74 68 20 61 20 68 61 72  utine with a har
1bf10 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 20 54 6f  mless no-op.  To
1bf20 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 75 74 69   make this routi
1bf30 6e 65 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2c 20 72  ne.** a no-op, r
1bf40 65 70 6c 61 63 65 20 69 74 20 77 69 74 68 20 61  eplace it with a
1bf50 20 73 74 75 62 20 74 68 61 74 20 72 65 74 75 72   stub that retur
1bf60 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74  ns SQLITE_OK but
1bf70 20 6c 65 61 76 65 73 0a 2a 2a 20 2a 70 46 64 20   leaves.** *pFd 
1bf80 73 65 74 20 74 6f 20 61 20 6e 65 67 61 74 69 76  set to a negativ
1bf90 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
1bfa0 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  If SQLITE_OK is 
1bfb0 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 63 61  returned, the ca
1bfc0 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69  ller is responsi
1bfd0 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 0a  ble for closing.
1bfe0 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ** the file desc
1bff0 72 69 70 74 6f 72 20 2a 70 46 64 20 75 73 69 6e  riptor *pFd usin
1c000 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74  g close()..*/.st
1c010 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72  atic int openDir
1c020 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61  ectory(const cha
1c030 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e  r *zFilename, in
1c040 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 69  t *pFd){.  int i
1c050 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31  i;.  int fd = -1
1c060 3b 0a 20 20 63 68 61 72 20 7a 44 69 72 6e 61 6d  ;.  char zDirnam
1c070 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31  e[MAX_PATHNAME+1
1c080 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ];..  sqlite3_sn
1c090 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e  printf(MAX_PATHN
1c0a0 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65 2c 20 22  AME, zDirname, "
1c0b0 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  %s", zFilename);
1c0c0 0a 20 20 66 6f 72 28 69 69 3d 28 69 6e 74 29 73  .  for(ii=(int)s
1c0d0 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3b  trlen(zDirname);
1c0e0 20 69 69 3e 31 20 26 26 20 7a 44 69 72 6e 61 6d   ii>1 && zDirnam
1c0f0 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d  e[ii]!='/'; ii--
1c100 29 3b 0a 20 20 69 66 28 20 69 69 3e 31 20 29 7b  );.  if( ii>1 ){
1c110 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69 69  .    zDirname[ii
1c120 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66 64  ] = '\0';.    fd
1c130 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a   = robust_open(z
1c140 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c  Dirname, O_RDONL
1c150 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a  Y|O_BINARY, 0);.
1c160 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b      if( fd>=0 ){
1c170 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1c180 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20 25 73  "OPENDIR %-3d %s
1c190 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e 61 6d  \n", fd, zDirnam
1c1a0 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  e));.    }.  }. 
1c1b0 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20 20 69 66   *pFd = fd;.  if
1c1c0 28 20 66 64 3e 3d 30 20 29 20 72 65 74 75 72 6e  ( fd>=0 ) return
1c1d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72 65   SQLITE_OK;.  re
1c1e0 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f  turn unixLogErro
1c1f0 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
1c200 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 44 69 72  N_BKPT, "openDir
1c210 65 63 74 6f 72 79 22 2c 20 7a 44 69 72 6e 61 6d  ectory", zDirnam
1c220 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  e);.}../*.** Mak
1c230 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65  e sure all write
1c240 73 20 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61  s to a particula
1c250 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69  r file are commi
1c260 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  tted to disk..**
1c270 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e 6c 79 3d  .** If dataOnly=
1c280 3d 30 20 74 68 65 6e 20 62 6f 74 68 20 74 68 65  =0 then both the
1c290 20 66 69 6c 65 20 69 74 73 65 6c 66 20 61 6e 64   file itself and
1c2a0 20 69 74 73 20 6d 65 74 61 64 61 74 61 20 28 66   its metadata (f
1c2b0 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20 61 63 63  ile.** size, acc
1c2c0 65 73 73 20 74 69 6d 65 2c 20 65 74 63 29 20 61  ess time, etc) a
1c2d0 72 65 20 73 79 6e 63 65 64 2e 20 20 49 66 20 64  re synced.  If d
1c2e0 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68 65 6e 20  ataOnly!=0 then 
1c2f0 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 69 6c 65  only the.** file
1c300 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64 2e   data is synced.
1c310 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20 55 6e 69  .**.** Under Uni
1c320 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20 73 75 72  x, also make sur
1c330 65 20 74 68 61 74 20 74 68 65 20 64 69 72 65 63  e that the direc
1c340 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74  tory entry for t
1c350 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20 62  he file.** has b
1c360 65 65 6e 20 63 72 65 61 74 65 64 20 62 79 20 66  een created by f
1c370 73 79 6e 63 2d 69 6e 67 20 74 68 65 20 64 69 72  sync-ing the dir
1c380 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74  ectory that cont
1c390 61 69 6e 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a  ains the file..*
1c3a0 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20 64  * If we do not d
1c3b0 6f 20 74 68 69 73 20 61 6e 64 20 77 65 20 65 6e  o this and we en
1c3c0 63 6f 75 6e 74 65 72 20 61 20 70 6f 77 65 72 20  counter a power 
1c3d0 66 61 69 6c 75 72 65 2c 20 74 68 65 20 64 69 72  failure, the dir
1c3e0 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74 72 79 20  ectory.** entry 
1c3f0 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
1c400 6d 69 67 68 74 20 6e 6f 74 20 65 78 69 73 74 20  might not exist 
1c410 61 66 74 65 72 20 77 65 20 72 65 62 6f 6f 74 2e  after we reboot.
1c420 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a 20 53 51    The next.** SQ
1c430 4c 69 74 65 20 74 6f 20 61 63 63 65 73 73 20 74  Lite to access t
1c440 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 6e 6f 74  he file will not
1c450 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6a   know that the j
1c460 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 28 62  ournal exists (b
1c470 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 64 69  ecause.** the di
1c480 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f  rectory entry fo
1c490 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  r the journal wa
1c4a0 73 20 6e 65 76 65 72 20 63 72 65 61 74 65 64 29  s never created)
1c4b0 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63   and the transac
1c4c0 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  tion.** will not
1c4d0 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20 70 6f 73   roll back - pos
1c4e0 73 69 62 6c 79 20 6c 65 61 64 69 6e 67 20 74 6f  sibly leading to
1c4f0 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
1c500 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
1c510 69 6e 74 20 75 6e 69 78 53 79 6e 63 28 73 71 6c  int unixSync(sql
1c520 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
1c530 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74  nt flags){.  int
1c540 20 72 63 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20   rc;.  unixFile 
1c550 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
1c560 6c 65 2a 29 69 64 3b 0a 0a 20 20 69 6e 74 20 69  le*)id;..  int i
1c570 73 44 61 74 61 4f 6e 6c 79 20 3d 20 28 66 6c 61  sDataOnly = (fla
1c580 67 73 26 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44  gs&SQLITE_SYNC_D
1c590 41 54 41 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20  ATAONLY);.  int 
1c5a0 69 73 46 75 6c 6c 73 79 6e 63 20 3d 20 28 66 6c  isFullsync = (fl
1c5b0 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
1c5c0 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 0a 20 20  E_SYNC_FULL;..  
1c5d0 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 6f 6e  /* Check that on
1c5e0 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e 43  e of SQLITE_SYNC
1c5f0 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20  _NORMAL or FULL 
1c600 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a 20 20  was passed */.  
1c610 61 73 73 65 72 74 28 28 66 6c 61 67 73 26 30 78  assert((flags&0x
1c620 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
1c630 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c  _NORMAL.      ||
1c640 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53   (flags&0x0F)==S
1c650 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a  QLITE_SYNC_FULL.
1c660 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78 20    );..  /* Unix 
1c670 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d 65  cannot, but some
1c680 20 73 79 73 74 65 6d 73 20 6d 61 79 20 72 65 74   systems may ret
1c690 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  urn SQLITE_FULL 
1c6a0 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 69 73 0a  from here. This.
1c6b0 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f 20    ** line is to 
1c6c0 74 65 73 74 20 74 68 61 74 20 64 6f 69 6e 67 20  test that doing 
1c6d0 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73  so does not caus
1c6e0 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a  e any problems..
1c6f0 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 44    */.  SimulateD
1c700 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72 65  iskfullError( re
1c710 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
1c720 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
1c730 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
1c740 45 28 28 22 53 59 4e 43 20 20 20 20 25 2d 33 64  E(("SYNC    %-3d
1c750 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
1c760 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f 66 73 79  .  rc = full_fsy
1c770 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20 69 73 46  nc(pFile->h, isF
1c780 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61 74 61 4f  ullsync, isDataO
1c790 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  nly);.  Simulate
1c7a0 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b  IOError( rc=1 );
1c7b0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
1c7c0 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
1c7d0 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20  pFile, errno);. 
1c7e0 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f     return unixLo
1c7f0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
1c800 45 52 52 5f 46 53 59 4e 43 2c 20 22 66 75 6c 6c  ERR_FSYNC, "full
1c810 5f 66 73 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e  _fsync", pFile->
1c820 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 2f  zPath);.  }..  /
1c830 2a 20 41 6c 73 6f 20 66 73 79 6e 63 20 74 68 65  * Also fsync the
1c840 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61   directory conta
1c850 69 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20 69  ining the file i
1c860 66 20 74 68 65 20 44 49 52 53 59 4e 43 20 66 6c  f the DIRSYNC fl
1c870 61 67 0a 20 20 2a 2a 20 69 73 20 73 65 74 2e 20  ag.  ** is set. 
1c880 20 54 68 69 73 20 69 73 20 61 20 6f 6e 65 2d 74   This is a one-t
1c890 69 6d 65 20 6f 63 63 75 72 72 65 6e 63 65 2e 20  ime occurrence. 
1c8a0 20 4d 61 6e 79 20 73 79 73 74 65 6d 73 20 28 65   Many systems (e
1c8b0 78 61 6d 70 6c 65 73 3a 20 41 49 58 29 0a 20 20  xamples: AIX).  
1c8c0 2a 2a 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f  ** are unable to
1c8d0 20 66 73 79 6e 63 20 61 20 64 69 72 65 63 74 6f   fsync a directo
1c8e0 72 79 2c 20 73 6f 20 69 67 6e 6f 72 65 20 65 72  ry, so ignore er
1c8f0 72 6f 72 73 20 6f 6e 20 74 68 65 20 66 73 79 6e  rors on the fsyn
1c900 63 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  c..  */.  if( pF
1c910 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
1c920 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e   UNIXFILE_DIRSYN
1c930 43 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 69 72  C ){.    int dir
1c940 66 64 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  fd;.    OSTRACE(
1c950 28 22 44 49 52 53 59 4e 43 20 25 73 20 28 68 61  ("DIRSYNC %s (ha
1c960 76 65 5f 66 75 6c 6c 66 73 79 6e 63 3d 25 64 20  ve_fullfsync=%d 
1c970 66 75 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e 22 2c  fullsync=%d)\n",
1c980 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 0a 20   pFile->zPath,. 
1c990 20 20 20 20 20 20 20 20 20 20 20 48 41 56 45 5f             HAVE_
1c9a0 46 55 4c 4c 46 53 59 4e 43 2c 20 69 73 46 75 6c  FULLFSYNC, isFul
1c9b0 6c 73 79 6e 63 29 29 3b 0a 20 20 20 20 72 63 20  lsync));.    rc 
1c9c0 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72  = osOpenDirector
1c9d0 79 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20  y(pFile->zPath, 
1c9e0 26 64 69 72 66 64 29 3b 0a 20 20 20 20 69 66 28  &dirfd);.    if(
1c9f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1ca00 7b 0a 20 20 20 20 20 20 66 75 6c 6c 5f 66 73 79  {.      full_fsy
1ca10 6e 63 28 64 69 72 66 64 2c 20 30 2c 20 30 29 3b  nc(dirfd, 0, 0);
1ca20 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  .      robust_cl
1ca30 6f 73 65 28 70 46 69 6c 65 2c 20 64 69 72 66 64  ose(pFile, dirfd
1ca40 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
1ca50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
1ca60 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
1ca70 5f 43 41 4e 54 4f 50 45 4e 20 29 3b 0a 20 20 20  _CANTOPEN );.   
1ca80 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1ca90 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69  K;.    }.    pFi
1caa0 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d  le->ctrlFlags &=
1cab0 20 7e 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59   ~UNIXFILE_DIRSY
1cac0 4e 43 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  NC;.  }.  return
1cad0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72   rc;.}../*.** Tr
1cae0 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66  uncate an open f
1caf0 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69  ile to a specifi
1cb00 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69  ed size.*/.stati
1cb10 63 20 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61  c int unixTrunca
1cb20 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  te(sqlite3_file 
1cb30 2a 69 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b  *id, i64 nByte){
1cb40 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
1cb50 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  le = (unixFile *
1cb60 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  )id;.  int rc;. 
1cb70 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
1cb80 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
1cb90 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
1cba0 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
1cbb0 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  E );..  /* If th
1cbc0 65 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69  e user has confi
1cbd0 67 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69  gured a chunk-si
1cbe0 7a 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65  ze for this file
1cbf0 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20  , truncate the. 
1cc00 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68 61 74   ** file so that
1cc10 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20   it consists of 
1cc20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65  an integer numbe
1cc30 72 20 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e 65  r of chunks (i.e
1cc40 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61  . the.  ** actua
1cc50 6c 20 66 69 6c 65 20 73 69 7a 65 20 61 66 74 65  l file size afte
1cc60 72 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  r the operation 
1cc70 6d 61 79 20 62 65 20 6c 61 72 67 65 72 20 74 68  may be larger th
1cc80 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  an the requested
1cc90 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a  .  ** size)..  *
1cca0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73  /.  if( pFile->s
1ccb0 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20  zChunk>0 ){.    
1ccc0 6e 42 79 74 65 20 3d 20 28 28 6e 42 79 74 65 20  nByte = ((nByte 
1ccd0 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  + pFile->szChunk
1cce0 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43   - 1)/pFile->szC
1ccf0 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73  hunk) * pFile->s
1cd00 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 72  zChunk;.  }..  r
1cd10 63 20 3d 20 72 6f 62 75 73 74 5f 66 74 72 75 6e  c = robust_ftrun
1cd20 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 6e  cate(pFile->h, n
1cd30 42 79 74 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Byte);.  if( rc 
1cd40 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74  ){.    storeLast
1cd50 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72  Errno(pFile, err
1cd60 6e 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  no);.    return 
1cd70 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
1cd80 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
1cd90 54 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c  TE, "ftruncate",
1cda0 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
1cdb0 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66 20    }else{.#ifdef 
1cdc0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
1cdd0 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f   /* If we are do
1cde0 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69  ing a normal wri
1cdf0 74 65 20 74 6f 20 61 20 64 61 74 61 62 61 73 65  te to a database
1ce00 20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65   file (as oppose
1ce10 64 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 69 6e  d to.    ** doin
1ce20 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  g a hot-journal 
1ce30 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77 72  rollback or a wr
1ce40 69 74 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65  ite to some file
1ce50 20 6f 74 68 65 72 20 74 68 61 6e 20 61 0a 20 20   other than a.  
1ce60 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61    ** normal data
1ce70 62 61 73 65 20 66 69 6c 65 29 20 61 6e 64 20 77  base file) and w
1ce80 65 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 66  e truncate the f
1ce90 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67  ile to zero leng
1cea0 74 68 2c 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  th,.    ** that 
1ceb0 65 66 66 65 63 74 69 76 65 6c 79 20 75 70 64 61  effectively upda
1cec0 74 65 73 20 74 68 65 20 63 68 61 6e 67 65 20 63  tes the change c
1ced0 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 6d 69  ounter.  This mi
1cee0 67 68 74 20 68 61 70 70 65 6e 0a 20 20 20 20 2a  ght happen.    *
1cef0 2a 20 77 68 65 6e 20 72 65 73 74 6f 72 69 6e 67  * when restoring
1cf00 20 61 20 64 61 74 61 62 61 73 65 20 75 73 69 6e   a database usin
1cf10 67 20 74 68 65 20 62 61 63 6b 75 70 20 41 50 49  g the backup API
1cf20 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 6c 65 6e   from a zero-len
1cf30 67 74 68 0a 20 20 20 20 2a 2a 20 73 6f 75 72 63  gth.    ** sourc
1cf40 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
1cf50 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61  ( pFile->inNorma
1cf60 6c 57 72 69 74 65 20 26 26 20 6e 42 79 74 65 3d  lWrite && nByte=
1cf70 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  =0 ){.      pFil
1cf80 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67  e->transCntrChng
1cf90 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 1;.    }.#end
1cfa0 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  if..#if SQLITE_M
1cfb0 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
1cfc0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
1cfd0 65 20 77 61 73 20 6a 75 73 74 20 74 72 75 6e 63  e was just trunc
1cfe0 61 74 65 64 20 74 6f 20 61 20 73 69 7a 65 20 73  ated to a size s
1cff0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
1d000 63 75 72 72 65 6e 74 6c 79 0a 20 20 20 20 2a 2a  currently.    **
1d010 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 2c 20   mapped region, 
1d020 72 65 64 75 63 65 20 74 68 65 20 65 66 66 65 63  reduce the effec
1d030 74 69 76 65 20 6d 61 70 70 69 6e 67 20 73 69 7a  tive mapping siz
1d040 65 20 61 73 20 77 65 6c 6c 2e 20 53 51 4c 69 74  e as well. SQLit
1d050 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 75 73  e will.    ** us
1d060 65 20 72 65 61 64 28 29 20 61 6e 64 20 77 72 69  e read() and wri
1d070 74 65 28 29 20 74 6f 20 61 63 63 65 73 73 20 64  te() to access d
1d080 61 74 61 20 62 65 79 6f 6e 64 20 74 68 69 73 20  ata beyond this 
1d090 70 6f 69 6e 74 20 66 72 6f 6d 20 6e 6f 77 20 6f  point from now o
1d0a0 6e 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  n.  .    */.    
1d0b0 69 66 28 20 6e 42 79 74 65 3c 70 46 69 6c 65 2d  if( nByte<pFile-
1d0c0 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20  >mmapSize ){.   
1d0d0 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69     pFile->mmapSi
1d0e0 7a 65 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20  ze = nByte;.    
1d0f0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 72 65  }.#endif..    re
1d100 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1d110 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74    }.}../*.** Det
1d120 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65  ermine the curre
1d130 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c  nt size of a fil
1d140 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74  e in bytes.*/.st
1d150 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c  atic int unixFil
1d160 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  eSize(sqlite3_fi
1d170 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a 70 53 69  le *id, i64 *pSi
1d180 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ze){.  int rc;. 
1d190 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
1d1a0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29  ;.  assert( id )
1d1b0 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74  ;.  rc = osFstat
1d1c0 28 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29  (((unixFile*)id)
1d1d0 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 53 69  ->h, &buf);.  Si
1d1e0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
1d1f0 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63 21  c=1 );.  if( rc!
1d200 3d 30 20 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c  =0 ){.    storeL
1d210 61 73 74 45 72 72 6e 6f 28 28 75 6e 69 78 46 69  astErrno((unixFi
1d220 6c 65 2a 29 69 64 2c 20 65 72 72 6e 6f 29 3b 0a  le*)id, errno);.
1d230 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1d240 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20  E_IOERR_FSTAT;. 
1d250 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62 75   }.  *pSize = bu
1d260 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a 20 20 2f 2a  f.st_size;..  /*
1d270 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20   When opening a 
1d280 7a 65 72 6f 2d 73 69 7a 65 20 64 61 74 61 62 61  zero-size databa
1d290 73 65 2c 20 74 68 65 20 66 69 6e 64 49 6e 6f 64  se, the findInod
1d2a0 65 49 6e 66 6f 28 29 20 70 72 6f 63 65 64 75 72  eInfo() procedur
1d2b0 65 0a 20 20 2a 2a 20 77 72 69 74 65 73 20 61 20  e.  ** writes a 
1d2c0 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 74 6f  single byte into
1d2d0 20 74 68 61 74 20 66 69 6c 65 20 69 6e 20 6f 72   that file in or
1d2e0 64 65 72 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75  der to work arou
1d2f0 6e 64 20 61 20 62 75 67 0a 20 20 2a 2a 20 69 6e  nd a bug.  ** in
1d300 20 74 68 65 20 4f 53 2d 58 20 6d 73 64 6f 73 20   the OS-X msdos 
1d310 66 69 6c 65 73 79 73 74 65 6d 2e 20 20 49 6e 20  filesystem.  In 
1d320 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 70  order to avoid p
1d330 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 75 70 70  roblems with upp
1d340 65 72 0a 20 20 2a 2a 20 6c 61 79 65 72 73 2c 20  er.  ** layers, 
1d350 77 65 20 6e 65 65 64 20 74 6f 20 72 65 70 6f 72  we need to repor
1d360 74 20 74 68 69 73 20 66 69 6c 65 20 73 69 7a 65  t this file size
1d370 20 61 73 20 7a 65 72 6f 20 65 76 65 6e 20 74 68   as zero even th
1d380 6f 75 67 68 20 69 74 20 69 73 0a 20 20 2a 2a 20  ough it is.  ** 
1d390 72 65 61 6c 6c 79 20 31 2e 20 20 20 54 69 63 6b  really 1.   Tick
1d3a0 65 74 20 23 33 32 36 30 2e 0a 20 20 2a 2f 0a 20  et #3260..  */. 
1d3b0 20 69 66 28 20 2a 70 53 69 7a 65 3d 3d 31 20 29   if( *pSize==1 )
1d3c0 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 0a 0a 20   *pSize = 0;... 
1d3d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1d3e0 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  K;.}..#if SQLITE
1d3f0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1d400 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64  STYLE && defined
1d410 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a  (__APPLE__)./*.*
1d420 2a 20 48 61 6e 64 6c 65 72 20 66 6f 72 20 70 72  * Handler for pr
1d430 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 66 69 6c 65  oxy-locking file
1d440 2d 63 6f 6e 74 72 6f 6c 20 76 65 72 62 73 2e 20  -control verbs. 
1d450 20 44 65 66 69 6e 65 64 20 62 65 6c 6f 77 20 69   Defined below i
1d460 6e 20 74 68 65 0a 2a 2a 20 70 72 6f 78 79 69 6e  n the.** proxyin
1d470 67 20 6c 6f 63 6b 69 6e 67 20 64 69 76 69 73 69  g locking divisi
1d480 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
1d490 74 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72  t proxyFileContr
1d4a0 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  ol(sqlite3_file*
1d4b0 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e  ,int,void*);.#en
1d4c0 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  dif../* .** This
1d4d0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1d4e0 6c 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  led to handle th
1d4f0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  e SQLITE_FCNTL_S
1d500 49 5a 45 5f 48 49 4e 54 20 0a 2a 2a 20 66 69 6c  IZE_HINT .** fil
1d510 65 2d 63 6f 6e 74 72 6f 6c 20 6f 70 65 72 61 74  e-control operat
1d520 69 6f 6e 2e 20 20 45 6e 6c 61 72 67 65 20 74 68  ion.  Enlarge th
1d530 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 6e 42  e database to nB
1d540 79 74 65 73 20 69 6e 20 73 69 7a 65 0a 2a 2a 20  ytes in size.** 
1d550 28 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 74  (rounded up to t
1d560 68 65 20 6e 65 78 74 20 63 68 75 6e 6b 2d 73 69  he next chunk-si
1d570 7a 65 29 2e 20 20 49 66 20 74 68 65 20 64 61 74  ze).  If the dat
1d580 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79  abase is already
1d590 0a 2a 2a 20 6e 42 79 74 65 73 20 6f 72 20 6c 61  .** nBytes or la
1d5a0 72 67 65 72 2c 20 74 68 69 73 20 72 6f 75 74 69  rger, this routi
1d5b0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
1d5c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 63 6e  /.static int fcn
1d5d0 74 6c 53 69 7a 65 48 69 6e 74 28 75 6e 69 78 46  tlSizeHint(unixF
1d5e0 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 36 34 20  ile *pFile, i64 
1d5f0 6e 42 79 74 65 29 7b 0a 20 20 69 66 28 20 70 46  nByte){.  if( pF
1d600 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29  ile->szChunk>0 )
1d610 7b 0a 20 20 20 20 69 36 34 20 6e 53 69 7a 65 3b  {.    i64 nSize;
1d620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d630 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1d640 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20  file size */.   
1d650 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
1d660 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1d670 2a 20 55 73 65 64 20 74 6f 20 68 6f 6c 64 20 72  * Used to hold r
1d680 65 74 75 72 6e 20 76 61 6c 75 65 73 20 6f 66 20  eturn values of 
1d690 66 73 74 61 74 28 29 20 2a 2f 0a 20 20 20 0a 20  fstat() */.   . 
1d6a0 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70     if( osFstat(p
1d6b0 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20 29  File->h, &buf) )
1d6c0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
1d6d0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
1d6e0 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 53  T;.    }..    nS
1d6f0 69 7a 65 20 3d 20 28 28 6e 42 79 74 65 2b 70 46  ize = ((nByte+pF
1d700 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 2d 31 29 20  ile->szChunk-1) 
1d710 2f 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  / pFile->szChunk
1d720 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  ) * pFile->szChu
1d730 6e 6b 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a  nk;.    if( nSiz
1d740 65 3e 28 69 36 34 29 62 75 66 2e 73 74 5f 73 69  e>(i64)buf.st_si
1d750 7a 65 20 29 7b 0a 0a 23 69 66 20 64 65 66 69 6e  ze ){..#if defin
1d760 65 64 28 48 41 56 45 5f 50 4f 53 49 58 5f 46 41  ed(HAVE_POSIX_FA
1d770 4c 4c 4f 43 41 54 45 29 20 26 26 20 48 41 56 45  LLOCATE) && HAVE
1d780 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45  _POSIX_FALLOCATE
1d790 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  .      /* The co
1d7a0 64 65 20 62 65 6c 6f 77 20 69 73 20 68 61 6e 64  de below is hand
1d7b0 6c 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20  ling the return 
1d7c0 76 61 6c 75 65 20 6f 66 20 6f 73 46 61 6c 6c 6f  value of osFallo
1d7d0 63 61 74 65 28 29 20 0a 20 20 20 20 20 20 2a 2a  cate() .      **
1d7e0 20 63 6f 72 72 65 63 74 6c 79 2e 20 70 6f 73 69   correctly. posi
1d7f0 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 20 69 73  x_fallocate() is
1d800 20 64 65 66 69 6e 65 64 20 74 6f 20 22 72 65 74   defined to "ret
1d810 75 72 6e 73 20 7a 65 72 6f 20 6f 6e 20 73 75 63  urns zero on suc
1d820 63 65 73 73 2c 20 0a 20 20 20 20 20 20 2a 2a 20  cess, .      ** 
1d830 6f 72 20 61 6e 20 65 72 72 6f 72 20 6e 75 6d 62  or an error numb
1d840 65 72 20 6f 6e 20 20 66 61 69 6c 75 72 65 22 2e  er on  failure".
1d850 20 53 65 65 20 74 68 65 20 6d 61 6e 70 61 67 65   See the manpage
1d860 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f   for details. */
1d870 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72 3b 0a  .      int err;.
1d880 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
1d890 20 20 65 72 72 20 3d 20 6f 73 46 61 6c 6c 6f 63    err = osFalloc
1d8a0 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 62 75  ate(pFile->h, bu
1d8b0 66 2e 73 74 5f 73 69 7a 65 2c 20 6e 53 69 7a 65  f.st_size, nSize
1d8c0 2d 62 75 66 2e 73 74 5f 73 69 7a 65 29 3b 0a 20  -buf.st_size);. 
1d8d0 20 20 20 20 20 7d 77 68 69 6c 65 28 20 65 72 72       }while( err
1d8e0 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 20  ==EINTR );.     
1d8f0 20 69 66 28 20 65 72 72 20 29 20 72 65 74 75 72   if( err ) retur
1d900 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  n SQLITE_IOERR_W
1d910 52 49 54 45 3b 0a 23 65 6c 73 65 0a 20 20 20 20  RITE;.#else.    
1d920 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 53 20 64    /* If the OS d
1d930 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 70 6f 73  oes not have pos
1d940 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 2c 20  ix_fallocate(), 
1d950 66 61 6b 65 20 69 74 2e 20 57 72 69 74 65 20 61  fake it. Write a
1d960 20 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c   .      ** singl
1d970 65 20 62 79 74 65 20 74 6f 20 74 68 65 20 6c 61  e byte to the la
1d980 73 74 20 62 79 74 65 20 69 6e 20 65 61 63 68 20  st byte in each 
1d990 62 6c 6f 63 6b 20 74 68 61 74 20 66 61 6c 6c 73  block that falls
1d9a0 20 65 6e 74 69 72 65 6c 79 0a 20 20 20 20 20 20   entirely.      
1d9b0 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 65 78  ** within the ex
1d9c0 74 65 6e 64 65 64 20 72 65 67 69 6f 6e 2e 20 54  tended region. T
1d9d0 68 65 6e 2c 20 69 66 20 72 65 71 75 69 72 65 64  hen, if required
1d9e0 2c 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 0a  , a single byte.
1d9f0 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73        ** at offs
1da00 65 74 20 28 6e 53 69 7a 65 2d 31 29 2c 20 74 6f  et (nSize-1), to
1da10 20 73 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66   set the size of
1da20 20 74 68 65 20 66 69 6c 65 20 63 6f 72 72 65 63   the file correc
1da30 74 6c 79 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  tly..      ** Th
1da40 69 73 20 69 73 20 61 20 73 69 6d 69 6c 61 72 20  is is a similar 
1da50 74 65 63 68 6e 69 71 75 65 20 74 6f 20 74 68 61  technique to tha
1da60 74 20 75 73 65 64 20 62 79 20 67 6c 69 62 63 20  t used by glibc 
1da70 6f 6e 20 73 79 73 74 65 6d 73 0a 20 20 20 20 20  on systems.     
1da80 20 2a 2a 20 74 68 61 74 20 64 6f 20 6e 6f 74 20   ** that do not 
1da90 68 61 76 65 20 61 20 72 65 61 6c 20 66 61 6c 6c  have a real fall
1daa0 6f 63 61 74 65 28 29 20 63 61 6c 6c 2e 0a 20 20  ocate() call..  
1dab0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
1dac0 20 6e 42 6c 6b 20 3d 20 62 75 66 2e 73 74 5f 62   nBlk = buf.st_b
1dad0 6c 6b 73 69 7a 65 3b 20 20 2f 2a 20 46 69 6c 65  lksize;  /* File
1dae0 2d 73 79 73 74 65 6d 20 62 6c 6f 63 6b 20 73 69  -system block si
1daf0 7a 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ze */.      int 
1db00 6e 57 72 69 74 65 20 3d 20 30 3b 20 20 20 20 20  nWrite = 0;     
1db10 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1db20 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74  r of bytes writt
1db30 65 6e 20 62 79 20 73 65 65 6b 41 6e 64 57 72 69  en by seekAndWri
1db40 74 65 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20  te */.      i64 
1db50 69 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20  iWrite;         
1db60 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
1db70 6f 66 66 73 65 74 20 74 6f 20 77 72 69 74 65 20  offset to write 
1db80 74 6f 20 2a 2f 0a 0a 20 20 20 20 20 20 69 57 72  to */..      iWr
1db90 69 74 65 20 3d 20 28 62 75 66 2e 73 74 5f 73 69  ite = (buf.st_si
1dba0 7a 65 2f 6e 42 6c 6b 29 2a 6e 42 6c 6b 20 2b 20  ze/nBlk)*nBlk + 
1dbb0 6e 42 6c 6b 20 2d 20 31 3b 0a 20 20 20 20 20 20  nBlk - 1;.      
1dbc0 61 73 73 65 72 74 28 20 69 57 72 69 74 65 3e 3d  assert( iWrite>=
1dbd0 62 75 66 2e 73 74 5f 73 69 7a 65 20 29 3b 0a 20  buf.st_size );. 
1dbe0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 28 69       assert( ((i
1dbf0 57 72 69 74 65 2b 31 29 25 6e 42 6c 6b 29 3d 3d  Write+1)%nBlk)==
1dc00 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 2f  0 );.      for(/
1dc10 2a 6e 6f 2d 6f 70 2a 2f 3b 20 69 57 72 69 74 65  *no-op*/; iWrite
1dc20 3c 6e 53 69 7a 65 2b 6e 42 6c 6b 2d 31 3b 20 69  <nSize+nBlk-1; i
1dc30 57 72 69 74 65 2b 3d 6e 42 6c 6b 20 29 7b 0a 20  Write+=nBlk ){. 
1dc40 20 20 20 20 20 20 20 69 66 28 20 69 57 72 69 74         if( iWrit
1dc50 65 3e 3d 6e 53 69 7a 65 20 29 20 69 57 72 69 74  e>=nSize ) iWrit
1dc60 65 20 3d 20 6e 53 69 7a 65 20 2d 20 31 3b 0a 20  e = nSize - 1;. 
1dc70 20 20 20 20 20 20 20 6e 57 72 69 74 65 20 3d 20         nWrite = 
1dc80 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69  seekAndWrite(pFi
1dc90 6c 65 2c 20 69 57 72 69 74 65 2c 20 22 22 2c 20  le, iWrite, "", 
1dca0 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
1dcb0 6e 57 72 69 74 65 21 3d 31 20 29 20 72 65 74 75  nWrite!=1 ) retu
1dcc0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1dcd0 57 52 49 54 45 3b 0a 20 20 20 20 20 20 7d 0a 23  WRITE;.      }.#
1dce0 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
1dcf0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
1dd00 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66  MMAP_SIZE>0.  if
1dd10 28 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  ( pFile->mmapSiz
1dd20 65 4d 61 78 3e 30 20 26 26 20 6e 42 79 74 65 3e  eMax>0 && nByte>
1dd30 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
1dd40 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
1dd50 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a     if( pFile->sz
1dd60 43 68 75 6e 6b 3c 3d 30 20 29 7b 0a 20 20 20 20  Chunk<=0 ){.    
1dd70 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72    if( robust_ftr
1dd80 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c  uncate(pFile->h,
1dd90 20 6e 42 79 74 65 29 20 29 7b 0a 20 20 20 20 20   nByte) ){.     
1dda0 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
1ddb0 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b  o(pFile, errno);
1ddc0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1ddd0 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
1dde0 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
1ddf0 54 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c  TE, "ftruncate",
1de00 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
1de10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1de20 20 20 20 72 63 20 3d 20 75 6e 69 78 4d 61 70 66     rc = unixMapf
1de30 69 6c 65 28 70 46 69 6c 65 2c 20 6e 42 79 74 65  ile(pFile, nByte
1de40 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
1de50 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
1de60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1de70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70  ;.}../*.** If *p
1de80 41 72 67 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  Arg is initially
1de90 20 6e 65 67 61 74 69 76 65 20 74 68 65 6e 20 74   negative then t
1dea0 68 69 73 20 69 73 20 61 20 71 75 65 72 79 2e 20  his is a query. 
1deb0 20 53 65 74 20 2a 70 41 72 67 20 74 6f 0a 2a 2a   Set *pArg to.**
1dec0 20 31 20 6f 72 20 30 20 64 65 70 65 6e 64 69 6e   1 or 0 dependin
1ded0 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  g on whether or 
1dee0 6e 6f 74 20 62 69 74 20 6d 61 73 6b 20 6f 66 20  not bit mask of 
1def0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
1df00 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49   is set..**.** I
1df10 66 20 2a 70 41 72 67 20 69 73 20 30 20 6f 72 20  f *pArg is 0 or 
1df20 31 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 6f 72  1, then clear or
1df30 20 73 65 74 20 74 68 65 20 6d 61 73 6b 20 62 69   set the mask bi
1df40 74 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c  t of pFile->ctrl
1df50 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  Flags..*/.static
1df60 20 76 6f 69 64 20 75 6e 69 78 4d 6f 64 65 42 69   void unixModeBi
1df70 74 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  t(unixFile *pFil
1df80 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e, unsigned char
1df90 20 6d 61 73 6b 2c 20 69 6e 74 20 2a 70 41 72 67   mask, int *pArg
1dfa0 29 7b 0a 20 20 69 66 28 20 2a 70 41 72 67 3c 30  ){.  if( *pArg<0
1dfb0 20 29 7b 0a 20 20 20 20 2a 70 41 72 67 20 3d 20   ){.    *pArg = 
1dfc0 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67  (pFile->ctrlFlag
1dfd0 73 20 26 20 6d 61 73 6b 29 21 3d 30 3b 0a 20 20  s & mask)!=0;.  
1dfe0 7d 65 6c 73 65 20 69 66 28 20 28 2a 70 41 72 67  }else if( (*pArg
1dff0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c  )==0 ){.    pFil
1e000 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20  e->ctrlFlags &= 
1e010 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ~mask;.  }else{.
1e020 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46      pFile->ctrlF
1e030 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  lags |= mask;.  
1e040 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  }.}../* Forward 
1e050 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73  declaration */.s
1e060 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65  tatic int unixGe
1e070 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42  tTempname(int nB
1e080 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 3b  uf, char *zBuf);
1e090 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74  ../*.** Informat
1e0a0 69 6f 6e 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20  ion and control 
1e0b0 6f 66 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20  of an open file 
1e0c0 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  handle..*/.stati
1e0d0 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f  c int unixFileCo
1e0e0 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69  ntrol(sqlite3_fi
1e0f0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20  le *id, int op, 
1e100 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 75  void *pArg){.  u
1e110 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
1e120 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
1e130 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
1e140 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1e150 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a  FCNTL_LOCKSTATE:
1e160 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29   {.      *(int*)
1e170 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 65 46  pArg = pFile->eF
1e180 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 72  ileLock;.      r
1e190 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1e1a0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1e1b0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 41 53  SQLITE_FCNTL_LAS
1e1c0 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20  T_ERRNO: {.     
1e1d0 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70   *(int*)pArg = p
1e1e0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b  File->lastErrno;
1e1f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1e200 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1e210 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1e220 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a  CNTL_CHUNK_SIZE:
1e230 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
1e240 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69 6e 74 20  szChunk = *(int 
1e250 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 72 65  *)pArg;.      re
1e260 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1e270 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1e280 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45  QLITE_FCNTL_SIZE
1e290 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69  _HINT: {.      i
1e2a0 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 53 69 6d  nt rc;.      Sim
1e2b0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
1e2c0 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 72 63 20  gn(1);.      rc 
1e2d0 3d 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28  = fcntlSizeHint(
1e2e0 70 46 69 6c 65 2c 20 2a 28 69 36 34 20 2a 29 70  pFile, *(i64 *)p
1e2f0 41 72 67 29 3b 0a 20 20 20 20 20 20 53 69 6d 75  Arg);.      Simu
1e300 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
1e310 6e 28 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  n(0);.      retu
1e320 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1e330 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1e340 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a 20  TL_PERSIST_WAL: 
1e350 7b 0a 20 20 20 20 20 20 75 6e 69 78 4d 6f 64 65  {.      unixMode
1e360 42 69 74 28 70 46 69 6c 65 2c 20 55 4e 49 58 46  Bit(pFile, UNIXF
1e370 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c  ILE_PERSIST_WAL,
1e380 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20   (int*)pArg);.  
1e390 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1e3a0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1e3b0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1e3c0 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  L_POWERSAFE_OVER
1e3d0 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20 20 75  WRITE: {.      u
1e3e0 6e 69 78 4d 6f 64 65 42 69 74 28 70 46 69 6c 65  nixModeBit(pFile
1e3f0 2c 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 2c  , UNIXFILE_PSOW,
1e400 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20   (int*)pArg);.  
1e410 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1e420 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1e430 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1e440 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a 20 20 20  L_VFSNAME: {.   
1e450 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67     *(char**)pArg
1e460 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
1e470 74 66 28 22 25 73 22 2c 20 70 46 69 6c 65 2d 3e  tf("%s", pFile->
1e480 70 56 66 73 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pVfs->zName);.  
1e490 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1e4a0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1e4b0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1e4c0 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45 3a 20  L_TEMPFILENAME: 
1e4d0 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54  {.      char *zT
1e4e0 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  File = sqlite3_m
1e4f0 61 6c 6c 6f 63 36 34 28 20 70 46 69 6c 65 2d 3e  alloc64( pFile->
1e500 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
1e510 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 54   );.      if( zT
1e520 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  File ){.        
1e530 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28  unixGetTempname(
1e540 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78 50  pFile->pVfs->mxP
1e550 61 74 68 6e 61 6d 65 2c 20 7a 54 46 69 6c 65 29  athname, zTFile)
1e560 3b 0a 20 20 20 20 20 20 20 20 2a 28 63 68 61 72  ;.        *(char
1e570 2a 2a 29 70 41 72 67 20 3d 20 7a 54 46 69 6c 65  **)pArg = zTFile
1e580 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e590 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e5a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e5b0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 48 41   SQLITE_FCNTL_HA
1e5c0 53 5f 4d 4f 56 45 44 3a 20 7b 0a 20 20 20 20 20  S_MOVED: {.     
1e5d0 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 66   *(int*)pArg = f
1e5e0 69 6c 65 48 61 73 4d 6f 76 65 64 28 70 46 69 6c  ileHasMoved(pFil
1e5f0 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
1e600 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1e610 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  }.#if SQLITE_MAX
1e620 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20  _MMAP_SIZE>0.   
1e630 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1e640 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a  TL_MMAP_SIZE: {.
1e650 20 20 20 20 20 20 69 36 34 20 6e 65 77 4c 69 6d        i64 newLim
1e660 69 74 20 3d 20 2a 28 69 36 34 2a 29 70 41 72 67  it = *(i64*)pArg
1e670 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  ;.      int rc =
1e680 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1e690 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 73    if( newLimit>s
1e6a0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1e6b0 69 67 2e 6d 78 4d 6d 61 70 20 29 7b 0a 20 20 20  ig.mxMmap ){.   
1e6c0 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20       newLimit = 
1e6d0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1e6e0 66 69 67 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20 20  fig.mxMmap;.    
1e6f0 20 20 7d 0a 20 20 20 20 20 20 2a 28 69 36 34 2a    }.      *(i64*
1e700 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6d  )pArg = pFile->m
1e710 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 20 20  mapSizeMax;.    
1e720 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d    if( newLimit>=
1e730 30 20 26 26 20 6e 65 77 4c 69 6d 69 74 21 3d 70  0 && newLimit!=p
1e740 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61  File->mmapSizeMa
1e750 78 20 26 26 20 70 46 69 6c 65 2d 3e 6e 46 65 74  x && pFile->nFet
1e760 63 68 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20  chOut==0 ){.    
1e770 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53      pFile->mmapS
1e780 69 7a 65 4d 61 78 20 3d 20 6e 65 77 4c 69 6d 69  izeMax = newLimi
1e790 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  t;.        if( p
1e7a0 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30  File->mmapSize>0
1e7b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 6e   ){.          un
1e7c0 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c  ixUnmapfile(pFil
1e7d0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  e);.          rc
1e7e0 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70   = unixMapfile(p
1e7f0 46 69 6c 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20  File, -1);.     
1e800 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1e810 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1e820 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65    }.#endif.#ifde
1e830 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1e840 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
1e850 63 61 6c 6c 73 20 74 68 69 73 20 6d 65 74 68 6f  calls this metho
1e860 64 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 61 74  d to signal that
1e870 20 69 74 20 68 61 73 20 64 6f 6e 65 0a 20 20 20   it has done.   
1e880 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61   ** a rollback a
1e890 6e 64 20 74 68 61 74 20 74 68 65 20 64 61 74 61  nd that the data
1e8a0 62 61 73 65 20 69 73 20 74 68 65 72 65 66 6f 72  base is therefor
1e8b0 65 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 0a  e unchanged and.
1e8c0 20 20 20 20 2a 2a 20 69 74 20 68 65 6e 63 65 20      ** it hence 
1e8d0 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74 68 65  it is OK for the
1e8e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 68 61   transaction cha
1e8f0 6e 67 65 20 63 6f 75 6e 74 65 72 20 74 6f 20 62  nge counter to b
1e900 65 0a 20 20 20 20 2a 2a 20 75 6e 63 68 61 6e 67  e.    ** unchang
1e910 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ed..    */.    c
1e920 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1e930 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 3a 20 7b  _DB_UNCHANGED: {
1e940 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c  .      ((unixFil
1e950 65 2a 29 69 64 29 2d 3e 64 62 55 70 64 61 74 65  e*)id)->dbUpdate
1e960 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
1e970 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1e980 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 53    }.#endif.#if S
1e990 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1e9a0 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65  KING_STYLE && de
1e9b0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1e9c0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1e9d0 5f 46 43 4e 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50  _FCNTL_SET_LOCKP
1e9e0 52 4f 58 59 46 49 4c 45 3a 0a 20 20 20 20 63 61  ROXYFILE:.    ca
1e9f0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1ea00 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  GET_LOCKPROXYFIL
1ea10 45 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  E: {.      retur
1ea20 6e 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72  n proxyFileContr
1ea30 6f 6c 28 69 64 2c 6f 70 2c 70 41 72 67 29 3b 0a  ol(id,op,pArg);.
1ea40 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
1ea50 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1ea60 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
1ea70 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1ea80 29 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72  ) */.  }.  retur
1ea90 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  n SQLITE_NOTFOUN
1eaa0 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  D;.}../*.** Retu
1eab0 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  rn the sector si
1eac0 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74  ze in bytes of t
1ead0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c  he underlying bl
1eae0 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a  ock device for.*
1eaf0 2a 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  * the specified 
1eb00 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c  file. This is al
1eb10 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32 20  most always 512 
1eb20 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62  bytes, but may b
1eb30 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20  e.** larger for 
1eb40 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a  some devices..**
1eb50 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20  .** SQLite code 
1eb60 61 73 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e  assumes this fun
1eb70 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69  ction cannot fai
1eb80 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d  l. It also assum
1eb90 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77  es that.** if tw
1eba0 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61  o files are crea
1ebb0 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ted in the same 
1ebc0 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65  file-system dire
1ebd0 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61  ctory (i.e..** a
1ebe0 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 74   database and it
1ebf0 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  s journal file) 
1ec00 74 68 61 74 20 74 68 65 20 73 65 63 74 6f 72 20  that the sector 
1ec10 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65  size will be the
1ec20 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74  .** same for bot
1ec30 68 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f  h..*/.#ifndef __
1ec40 51 4e 58 4e 54 4f 5f 5f 20 0a 73 74 61 74 69 63  QNXNTO__ .static
1ec50 20 69 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53   int unixSectorS
1ec60 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
1ec70 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e   *NotUsed){.  UN
1ec80 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
1ec90 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
1eca0 6e 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  n SQLITE_DEFAULT
1ecb0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a  _SECTOR_SIZE;.}.
1ecc0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
1ecd0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 65 72 73  e following vers
1ece0 69 6f 6e 20 6f 66 20 75 6e 69 78 53 65 63 74 6f  ion of unixSecto
1ecf0 72 53 69 7a 65 28 29 20 69 73 20 6f 70 74 69 6d  rSize() is optim
1ed00 69 7a 65 64 20 66 6f 72 20 51 4e 58 2e 0a 2a 2f  ized for QNX..*/
1ed10 0a 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f  .#ifdef __QNXNTO
1ed20 5f 5f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  __.#include <sys
1ed30 2f 64 63 6d 64 5f 62 6c 6b 2e 68 3e 0a 23 69 6e  /dcmd_blk.h>.#in
1ed40 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74 76  clude <sys/statv
1ed50 66 73 2e 68 3e 0a 73 74 61 74 69 63 20 69 6e 74  fs.h>.static int
1ed60 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28   unixSectorSize(
1ed70 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1ed80 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
1ed90 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
1eda0 2a 29 69 64 3b 0a 20 20 69 66 28 20 70 46 69 6c  *)id;.  if( pFil
1edb0 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 3d  e->sectorSize ==
1edc0 20 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74   0 ){.    struct
1edd0 20 73 74 61 74 76 66 73 20 66 73 49 6e 66 6f 3b   statvfs fsInfo;
1ede0 0a 20 20 20 20 20 20 20 0a 20 20 20 20 2f 2a 20  .       .    /* 
1edf0 53 65 74 20 64 65 66 61 75 6c 74 73 20 66 6f 72  Set defaults for
1ee00 20 6e 6f 6e 2d 73 75 70 70 6f 72 74 65 64 20 66   non-supported f
1ee10 69 6c 65 73 79 73 74 65 6d 73 20 2a 2f 0a 20 20  ilesystems */.  
1ee20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53    pFile->sectorS
1ee30 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ize = SQLITE_DEF
1ee40 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AULT_SECTOR_SIZE
1ee50 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76  ;.    pFile->dev
1ee60 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
1ee70 63 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  cs = 0;.    if( 
1ee80 66 73 74 61 74 76 66 73 28 70 46 69 6c 65 2d 3e  fstatvfs(pFile->
1ee90 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d  h, &fsInfo) == -
1eea0 31 20 29 20 7b 0a 20 20 20 20 20 20 72 65 74 75  1 ) {.      retu
1eeb0 72 6e 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72  rn pFile->sector
1eec0 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Size;.    }..   
1eed0 20 69 66 28 20 21 73 74 72 63 6d 70 28 66 73 49   if( !strcmp(fsI
1eee0 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20  nfo.f_basetype, 
1eef0 22 74 6d 70 22 29 20 29 20 7b 0a 20 20 20 20 20  "tmp") ) {.     
1ef00 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
1ef10 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73  ze = fsInfo.f_bs
1ef20 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  ize;.      pFile
1ef30 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
1ef40 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20  ristics =.      
1ef50 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41    SQLITE_IOCAP_A
1ef60 54 4f 4d 49 43 34 4b 20 7c 20 20 20 20 20 20 20  TOMIC4K |       
1ef70 2f 2a 20 41 6c 6c 20 72 61 6d 20 66 69 6c 65 73  /* All ram files
1ef80 79 73 74 65 6d 20 77 72 69 74 65 73 20 61 72 65  ystem writes are
1ef90 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20   atomic */.     
1efa0 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
1efb0 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20  SAFE_APPEND |   
1efc0 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20   /* growing the 
1efd0 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63  file does not oc
1efe0 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20  cur until.      
1eff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f010 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73 75 63  ** the write suc
1f020 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20  ceeds */.       
1f030 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45   SQLITE_IOCAP_SE
1f040 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f  QUENTIAL |     /
1f050 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79  * The ram filesy
1f060 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74  stem has no writ
1f070 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20  e behind.       
1f080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1f0a0 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72  * so it is order
1f0b0 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b  ed */.        0;
1f0c0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
1f0d0 74 72 73 74 72 28 66 73 49 6e 66 6f 2e 66 5f 62  trstr(fsInfo.f_b
1f0e0 61 73 65 74 79 70 65 2c 20 22 65 74 66 73 22 29  asetype, "etfs")
1f0f0 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
1f100 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73  >sectorSize = fs
1f110 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20  Info.f_bsize;.  
1f120 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63      pFile->devic
1f130 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1f140 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20 65 74   =.        /* et
1f150 66 73 20 63 6c 75 73 74 65 72 20 73 69 7a 65 20  fs cluster size 
1f160 77 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69  writes are atomi
1f170 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 28 70 46  c */.        (pF
1f180 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
1f190 2f 20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49  / 512 * SQLITE_I
1f1a0 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20  OCAP_ATOMIC512) 
1f1b0 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  |.        SQLITE
1f1c0 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
1f1d0 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69  ND |    /* growi
1f1e0 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73  ng the file does
1f1f0 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c   not occur until
1f200 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f220 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72         ** the wr
1f230 69 74 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a  ite succeeds */.
1f240 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
1f250 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20  OCAP_SEQUENTIAL 
1f260 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d  |     /* The ram
1f270 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20   filesystem has 
1f280 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a  no write behind.
1f290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2b0 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69        ** so it i
1f2c0 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20  s ordered */.   
1f2d0 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73       0;.    }els
1f2e0 65 20 69 66 28 20 21 73 74 72 63 6d 70 28 66 73  e if( !strcmp(fs
1f2f0 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c  Info.f_basetype,
1f300 20 22 71 6e 78 36 22 29 20 29 7b 0a 20 20 20 20   "qnx6") ){.    
1f310 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53    pFile->sectorS
1f320 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62  ize = fsInfo.f_b
1f330 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c  size;.      pFil
1f340 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  e->deviceCharact
1f350 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20  eristics =.     
1f360 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
1f370 41 54 4f 4d 49 43 20 7c 20 20 20 20 20 20 20 20  ATOMIC |        
1f380 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 79 73 74   /* All filesyst
1f390 65 6d 20 77 72 69 74 65 73 20 61 72 65 20 61 74  em writes are at
1f3a0 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20  omic */.        
1f3b0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
1f3c0 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a  E_APPEND |    /*
1f3d0 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c   growing the fil
1f3e0 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72  e does not occur
1f3f0 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20   until.         
1f400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f410 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1f420 74 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65  the write succee
1f430 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51  ds */.        SQ
1f440 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
1f450 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54  NTIAL |     /* T
1f460 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65  he ram filesyste
1f470 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62  m has no write b
1f480 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20  ehind.          
1f490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4a0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73              ** s
1f4b0 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20  o it is ordered 
1f4c0 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20  */.        0;.  
1f4d0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 73 74 72    }else if( !str
1f4e0 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73  cmp(fsInfo.f_bas
1f4f0 65 74 79 70 65 2c 20 22 71 6e 78 34 22 29 20 29  etype, "qnx4") )
1f500 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
1f510 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e  ectorSize = fsIn
1f520 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20  fo.f_bsize;.    
1f530 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43    pFile->deviceC
1f540 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d  haracteristics =
1f550 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 75 6c 6c  .        /* full
1f560 20 62 69 74 73 65 74 20 6f 66 20 61 74 6f 6d 69   bitset of atomi
1f570 63 73 20 66 72 6f 6d 20 6d 61 78 20 73 65 63 74  cs from max sect
1f580 6f 72 20 73 69 7a 65 20 61 6e 64 20 73 6d 61 6c  or size and smal
1f590 6c 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 28  ler */.        (
1f5a0 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69  (pFile->sectorSi
1f5b0 7a 65 20 2f 20 35 31 32 20 2a 20 53 51 4c 49 54  ze / 512 * SQLIT
1f5c0 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31  E_IOCAP_ATOMIC51
1f5d0 32 29 20 3c 3c 20 31 29 20 2d 20 32 20 7c 0a 20  2) << 1) - 2 |. 
1f5e0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
1f5f0 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c  CAP_SEQUENTIAL |
1f600 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20       /* The ram 
1f610 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e  filesystem has n
1f620 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20  o write behind. 
1f630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f650 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73       ** so it is
1f660 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20   ordered */.    
1f670 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65      0;.    }else
1f680 20 69 66 28 20 73 74 72 73 74 72 28 66 73 49 6e   if( strstr(fsIn
1f690 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22  fo.f_basetype, "
1f6a0 64 6f 73 22 29 20 29 7b 0a 20 20 20 20 20 20 70  dos") ){.      p
1f6b0 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
1f6c0 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a   = fsInfo.f_bsiz
1f6d0 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e;.      pFile->
1f6e0 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
1f6f0 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20  stics =.        
1f700 2f 2a 20 66 75 6c 6c 20 62 69 74 73 65 74 20 6f  /* full bitset o
1f710 66 20 61 74 6f 6d 69 63 73 20 66 72 6f 6d 20 6d  f atomics from m
1f720 61 78 20 73 65 63 74 6f 72 20 73 69 7a 65 20 61  ax sector size a
1f730 6e 64 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20  nd smaller */.  
1f740 20 20 20 20 20 20 28 28 70 46 69 6c 65 2d 3e 73        ((pFile->s
1f750 65 63 74 6f 72 53 69 7a 65 20 2f 20 35 31 32 20  ectorSize / 512 
1f760 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  * SQLITE_IOCAP_A
1f770 54 4f 4d 49 43 35 31 32 29 20 3c 3c 20 31 29 20  TOMIC512) << 1) 
1f780 2d 20 32 20 7c 0a 20 20 20 20 20 20 20 20 53 51  - 2 |.        SQ
1f790 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
1f7a0 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54  NTIAL |     /* T
1f7b0 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65  he ram filesyste
1f7c0 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62  m has no write b
1f7d0 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20  ehind.          
1f7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7f0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73              ** s
1f800 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20  o it is ordered 
1f810 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20  */.        0;.  
1f820 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1f830 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72  File->deviceChar
1f840 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20  acteristics =.  
1f850 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
1f860 41 50 5f 41 54 4f 4d 49 43 35 31 32 20 7c 20 20  AP_ATOMIC512 |  
1f870 20 20 20 20 2f 2a 20 62 6c 6f 63 6b 73 20 61 72      /* blocks ar
1f880 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20  e atomic */.    
1f890 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
1f8a0 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20  _SAFE_APPEND |  
1f8b0 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65    /* growing the
1f8c0 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f   file does not o
1f8d0 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20  ccur until.     
1f8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f900 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73 75   ** the write su
1f910 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20  cceeds */.      
1f920 20 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20    0;.    }.  }. 
1f930 20 2f 2a 20 4c 61 73 74 20 63 68 61 6e 63 65 20   /* Last chance 
1f940 76 65 72 69 66 69 63 61 74 69 6f 6e 2e 20 20 49  verification.  I
1f950 66 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  f the sector siz
1f960 65 20 69 73 6e 27 74 20 61 20 6d 75 6c 74 69 70  e isn't a multip
1f970 6c 65 20 6f 66 20 35 31 32 0a 20 20 2a 2a 20 74  le of 512.  ** t
1f980 68 65 6e 20 69 74 20 69 73 6e 27 74 20 76 61 6c  hen it isn't val
1f990 69 64 2e 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  id.*/.  if( pFil
1f9a0 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 25 20  e->sectorSize % 
1f9b0 35 31 32 20 21 3d 20 30 20 29 7b 0a 20 20 20 20  512 != 0 ){.    
1f9c0 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61  pFile->deviceCha
1f9d0 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 20 30  racteristics = 0
1f9e0 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63  ;.    pFile->sec
1f9f0 74 6f 72 53 69 7a 65 20 3d 20 53 51 4c 49 54 45  torSize = SQLITE
1fa00 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f  _DEFAULT_SECTOR_
1fa10 53 49 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75  SIZE;.  }.  retu
1fa20 72 6e 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72  rn pFile->sector
1fa30 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  Size;.}.#endif /
1fa40 2a 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 20 2a 2f 0a  * __QNXNTO__ */.
1fa50 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1fa60 65 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74  e device charact
1fa70 65 72 69 73 74 69 63 73 20 66 6f 72 20 74 68 65  eristics for the
1fa80 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   file..**.** Thi
1fa90 73 20 56 46 53 20 69 73 20 73 65 74 20 75 70 20  s VFS is set up 
1faa0 74 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  to return SQLITE
1fab0 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45  _IOCAP_POWERSAFE
1fac0 5f 4f 56 45 52 57 52 49 54 45 20 62 79 20 64 65  _OVERWRITE by de
1fad0 66 61 75 6c 74 2e 0a 2a 2a 20 48 6f 77 65 76 65  fault..** Howeve
1fae0 72 2c 20 74 68 61 74 20 63 68 6f 69 63 65 20 69  r, that choice i
1faf0 73 20 63 6f 6e 74 72 6f 76 65 72 73 69 61 6c 20  s controversial 
1fb00 73 69 6e 63 65 20 74 65 63 68 6e 69 63 61 6c 6c  since technicall
1fb10 79 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  y the underlying
1fb20 0a 2a 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20  .** file system 
1fb30 64 6f 65 73 20 6e 6f 74 20 61 6c 77 61 79 73 20  does not always 
1fb40 70 72 6f 76 69 64 65 20 70 6f 77 65 72 73 61 66  provide powersaf
1fb50 65 20 6f 76 65 72 77 72 69 74 65 73 2e 20 20 28  e overwrites.  (
1fb60 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64  In other.** word
1fb70 73 2c 20 61 66 74 65 72 20 61 20 70 6f 77 65 72  s, after a power
1fb80 2d 6c 6f 73 73 20 65 76 65 6e 74 2c 20 70 61 72  -loss event, par
1fb90 74 73 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74  ts of the file t
1fba0 68 61 74 20 77 65 72 65 20 6e 65 76 65 72 0a 2a  hat were never.*
1fbb0 2a 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20  * written might 
1fbc0 65 6e 64 20 75 70 20 62 65 69 6e 67 20 61 6c 74  end up being alt
1fbd0 65 72 65 64 2e 29 20 20 48 6f 77 65 76 65 72 2c  ered.)  However,
1fbe0 20 6e 6f 6e 2d 50 53 4f 57 20 62 65 68 61 76 69   non-PSOW behavi
1fbf0 6f 72 20 69 73 20 76 65 72 79 2c 0a 2a 2a 20 76  or is very,.** v
1fc00 65 72 79 20 72 61 72 65 2e 20 20 41 6e 64 20 61  ery rare.  And a
1fc10 73 73 65 72 74 69 6e 67 20 50 53 4f 57 20 6d 61  sserting PSOW ma
1fc20 6b 65 73 20 61 20 6c 61 72 67 65 20 72 65 64 75  kes a large redu
1fc30 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 61 6d 6f  ction in the amo
1fc40 75 6e 74 0a 2a 2a 20 6f 66 20 72 65 71 75 69 72  unt.** of requir
1fc50 65 64 20 49 2f 4f 20 66 6f 72 20 6a 6f 75 72 6e  ed I/O for journ
1fc60 61 6c 69 6e 67 2c 20 73 69 6e 63 65 20 61 20 6c  aling, since a l
1fc70 6f 74 20 6f 66 20 70 61 64 64 69 6e 67 20 69 73  ot of padding is
1fc80 20 65 6c 69 6d 69 6e 61 74 65 64 2e 0a 2a 2a 20   eliminated..** 
1fc90 20 48 65 6e 63 65 2c 20 77 68 69 6c 65 20 50 4f   Hence, while PO
1fca0 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
1fcb0 45 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75  E is on by defau
1fcc0 6c 74 2c 20 74 68 65 72 65 20 69 73 20 61 20 66  lt, there is a f
1fcd0 69 6c 65 2d 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 61  ile-control.** a
1fce0 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e  vailable to turn
1fcf0 20 69 74 20 6f 66 66 20 61 6e 64 20 55 52 49 20   it off and URI 
1fd00 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 20  query parameter 
1fd10 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 75 72  available to tur
1fd20 6e 20 69 74 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61  n it off..*/.sta
1fd30 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65 76 69  tic int unixDevi
1fd40 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1fd50 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  s(sqlite3_file *
1fd60 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  id){.  unixFile 
1fd70 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  *p = (unixFile*)
1fd80 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  id;.  int rc = 0
1fd90 3b 0a 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e 54  ;.#ifdef __QNXNT
1fda0 4f 5f 5f 0a 20 20 69 66 28 20 70 2d 3e 73 65 63  O__.  if( p->sec
1fdb0 74 6f 72 53 69 7a 65 3d 3d 30 20 29 20 75 6e 69  torSize==0 ) uni
1fdc0 78 53 65 63 74 6f 72 53 69 7a 65 28 69 64 29 3b  xSectorSize(id);
1fdd0 0a 20 20 72 63 20 3d 20 70 2d 3e 64 65 76 69 63  .  rc = p->devic
1fde0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1fdf0 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  ;.#endif.  if( p
1fe00 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
1fe10 49 58 46 49 4c 45 5f 50 53 4f 57 20 29 7b 0a 20  IXFILE_PSOW ){. 
1fe20 20 20 20 72 63 20 7c 3d 20 53 51 4c 49 54 45 5f     rc |= SQLITE_
1fe30 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f  IOCAP_POWERSAFE_
1fe40 4f 56 45 52 57 52 49 54 45 3b 0a 20 20 7d 0a 20  OVERWRITE;.  }. 
1fe50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
1fe60 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
1fe70 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20  TE_OMIT_WAL) || 
1fe80 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
1fe90 53 49 5a 45 3e 30 0a 0a 2f 2a 0a 2a 2a 20 52 65  SIZE>0../*.** Re
1fea0 74 75 72 6e 20 74 68 65 20 73 79 73 74 65 6d 20  turn the system 
1feb0 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  page size..**.**
1fec0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
1fed0 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c  hould not be cal
1fee0 6c 65 64 20 64 69 72 65 63 74 6c 79 20 62 79 20  led directly by 
1fef0 6f 74 68 65 72 20 63 6f 64 65 20 69 6e 20 74 68  other code in th
1ff00 69 73 20 66 69 6c 65 2e 20 0a 2a 2a 20 49 6e 73  is file. .** Ins
1ff10 74 65 61 64 2c 20 69 74 20 73 68 6f 75 6c 64 20  tead, it should 
1ff20 62 65 20 63 61 6c 6c 65 64 20 76 69 61 20 6d 61  be called via ma
1ff30 63 72 6f 20 6f 73 47 65 74 70 61 67 65 73 69 7a  cro osGetpagesiz
1ff40 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
1ff50 6e 74 20 75 6e 69 78 47 65 74 70 61 67 65 73 69  nt unixGetpagesi
1ff60 7a 65 28 76 6f 69 64 29 7b 0a 23 69 66 20 4f 53  ze(void){.#if OS
1ff70 5f 56 58 57 4f 52 4b 53 0a 20 20 72 65 74 75 72  _VXWORKS.  retur
1ff80 6e 20 31 30 32 34 3b 0a 23 65 6c 69 66 20 64 65  n 1024;.#elif de
1ff90 66 69 6e 65 64 28 5f 42 53 44 5f 53 4f 55 52 43  fined(_BSD_SOURC
1ffa0 45 29 0a 20 20 72 65 74 75 72 6e 20 67 65 74 70  E).  return getp
1ffb0 61 67 65 73 69 7a 65 28 29 3b 0a 23 65 6c 73 65  agesize();.#else
1ffc0 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 73  .  return (int)s
1ffd0 79 73 63 6f 6e 66 28 5f 53 43 5f 50 41 47 45 53  ysconf(_SC_PAGES
1ffe0 49 5a 45 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  IZE);.#endif.}..
1fff0 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
20000 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ed(SQLITE_OMIT_W
20010 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41  AL) || SQLITE_MA
20020 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f  X_MMAP_SIZE>0 */
20030 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
20040 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a  _OMIT_WAL../*.**
20050 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20   Object used to 
20060 72 65 70 72 65 73 65 6e 74 20 61 6e 20 73 68 61  represent an sha
20070 72 65 64 20 6d 65 6d 6f 72 79 20 62 75 66 66 65  red memory buffe
20080 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  r.  .**.** When 
20090 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73  multiple threads
200a0 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 74   all reference t
200b0 68 65 20 73 61 6d 65 20 77 61 6c 2d 69 6e 64 65  he same wal-inde
200c0 78 2c 20 65 61 63 68 20 74 68 72 65 61 64 0a 2a  x, each thread.*
200d0 2a 20 68 61 73 20 69 74 73 20 6f 77 6e 20 75 6e  * has its own un
200e0 69 78 53 68 6d 20 6f 62 6a 65 63 74 2c 20 62 75  ixShm object, bu
200f0 74 20 74 68 65 79 20 61 6c 6c 20 70 6f 69 6e 74  t they all point
20100 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e 73   to a single ins
20110 74 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 69 73  tance.** of this
20120 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
20130 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ect.  In other w
20140 6f 72 64 73 2c 20 65 61 63 68 20 77 61 6c 2d 69  ords, each wal-i
20150 6e 64 65 78 20 69 73 20 6f 70 65 6e 65 64 0a 2a  ndex is opened.*
20160 2a 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20  * only once per 
20170 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45  process..**.** E
20180 61 63 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  ach unixShmNode 
20190 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e 6e 65 63  object is connec
201a0 74 65 64 20 74 6f 20 61 20 73 69 6e 67 6c 65 20  ted to a single 
201b0 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
201c0 6a 65 63 74 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c  ject..** We coul
201d0 64 20 63 6f 61 6c 65 73 63 65 20 74 68 69 73 20  d coalesce this 
201e0 6f 62 6a 65 63 74 20 69 6e 74 6f 20 75 6e 69 78  object into unix
201f0 49 6e 6f 64 65 49 6e 66 6f 2c 20 62 75 74 20 74  InodeInfo, but t
20200 68 61 74 20 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a  hat would mean.*
20210 2a 20 65 76 65 72 79 20 6f 70 65 6e 20 66 69 6c  * every open fil
20220 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
20230 75 73 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  use shared memor
20240 79 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64  y (in other word
20250 73 2c 20 6d 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20  s, most.** open 
20260 66 69 6c 65 73 29 20 77 6f 75 6c 64 20 68 61 76  files) would hav
20270 65 20 74 6f 20 63 61 72 72 79 20 61 72 6f 75 6e  e to carry aroun
20280 64 20 74 68 69 73 20 65 78 74 72 61 20 69 6e 66  d this extra inf
20290 6f 72 6d 61 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a  ormation.  So.**
202a0 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e   the unixInodeIn
202b0 66 6f 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69  fo object contai
202c0 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
202d0 74 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65  this unixShmNode
202e0 20 6f 62 6a 65 63 74 0a 2a 2a 20 61 6e 64 20 74   object.** and t
202f0 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f  he unixShmNode o
20300 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64  bject is created
20310 20 6f 6e 6c 79 20 77 68 65 6e 20 6e 65 65 64 65   only when neede
20320 64 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74  d..**.** unixMut
20330 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65  exHeld() must be
20340 20 74 72 75 65 20 77 68 65 6e 20 63 72 65 61 74   true when creat
20350 69 6e 67 20 6f 72 20 64 65 73 74 72 6f 79 69 6e  ing or destroyin
20360 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63 74  g.** this object
20370 20 6f 72 20 77 68 69 6c 65 20 72 65 61 64 69 6e   or while readin
20380 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65  g or writing the
20390 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
203a0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52  s:.**.**      nR
203b0 65 66 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  ef.**.** The fol
203c0 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72  lowing fields ar
203d0 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65  e read-only afte
203e0 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20  r the object is 
203f0 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20  created:.** .** 
20400 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20 20       fid.**     
20410 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a   zFilename.**.**
20420 20 45 69 74 68 65 72 20 75 6e 69 78 53 68 6d 4e   Either unixShmN
20430 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20 62  ode.mutex must b
20440 65 20 68 65 6c 64 20 6f 72 20 75 6e 69 78 53 68  e held or unixSh
20450 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e  mNode.nRef==0 an
20460 64 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65  d.** unixMutexHe
20470 6c 64 28 29 20 69 73 20 74 72 75 65 20 77 68 65  ld() is true whe
20480 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  n reading or wri
20490 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 66  ting any other f
204a0 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  ield.** in this 
204b0 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
204c0 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ruct unixShmNode
204d0 20 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e   {.  unixInodeIn
204e0 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20  fo *pInode;     
204f0 2f 2a 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  /* unixInodeInfo
20500 20 74 68 61 74 20 6f 77 6e 73 20 74 68 69 73 20   that owns this 
20510 53 48 4d 20 6e 6f 64 65 20 2a 2f 0a 20 20 73 71  SHM node */.  sq
20520 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
20530 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74 65  ex;      /* Mute
20540 78 20 74 6f 20 61 63 63 65 73 73 20 74 68 69 73  x to access this
20550 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61   object */.  cha
20560 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20  r *zFilename;   
20570 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
20580 6f 66 20 74 68 65 20 6d 6d 61 70 70 65 64 20 66  of the mmapped f
20590 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20  ile */.  int h; 
205a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205b0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65      /* Open file
205c0 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20   descriptor */. 
205d0 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20   int szRegion;  
205e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
205f0 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65  ize of shared-me
20600 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a  mory regions */.
20610 20 20 75 31 36 20 6e 52 65 67 69 6f 6e 3b 20 20    u16 nRegion;  
20620 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20630 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70  Size of array ap
20640 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 69  Region */.  u8 i
20650 73 52 65 61 64 6f 6e 6c 79 3b 20 20 20 20 20 20  sReadonly;      
20660 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
20670 66 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20  f read-only */. 
20680 20 63 68 61 72 20 2a 2a 61 70 52 65 67 69 6f 6e   char **apRegion
20690 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
206a0 72 72 61 79 20 6f 66 20 6d 61 70 70 65 64 20 73  rray of mapped s
206b0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
206c0 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ions */.  int nR
206d0 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
206e0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
206f0 66 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74  f unixShm object
20700 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  s pointing to th
20710 69 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  is */.  unixShm 
20720 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20  *pFirst;        
20730 20 20 20 2f 2a 20 41 6c 6c 20 75 6e 69 78 53 68     /* All unixSh
20740 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69  m objects pointi
20750 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 23 69  ng to this */.#i
20760 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
20770 47 0a 20 20 75 38 20 65 78 63 6c 4d 61 73 6b 3b  G.  u8 exclMask;
20780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20790 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73  * Mask of exclus
207a0 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  ive locks held *
207b0 2f 0a 20 20 75 38 20 73 68 61 72 65 64 4d 61 73  /.  u8 sharedMas
207c0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k;             /
207d0 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64  * Mask of shared
207e0 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20   locks held */. 
207f0 20 75 38 20 6e 65 78 74 53 68 6d 49 64 3b 20 20   u8 nextShmId;  
20800 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
20810 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 75 6e  ext available un
20820 69 78 53 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a  ixShm.id value *
20830 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
20840 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75 73 65  ** Structure use
20850 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20  d internally by 
20860 74 68 69 73 20 56 46 53 20 74 6f 20 72 65 63 6f  this VFS to reco
20870 72 64 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  rd the state of 
20880 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65  an.** open share
20890 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74  d memory connect
208a0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
208b0 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20  ollowing fields 
208c0 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  are initialized 
208d0 77 68 65 6e 20 74 68 69 73 20 6f 62 6a 65 63 74  when this object
208e0 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 0a   is created and.
208f0 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79  ** are read-only
20900 20 74 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a   thereafter:.**.
20910 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 70 46  **    unixShm.pF
20920 69 6c 65 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68  ile.**    unixSh
20930 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f  m.id.**.** All o
20940 74 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20  ther fields are 
20950 72 65 61 64 2f 77 72 69 74 65 2e 20 20 54 68 65  read/write.  The
20960 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 2d 3e   unixShm.pFile->
20970 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65  mutex must be he
20980 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63 65  ld.** while acce
20990 73 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77  ssing any read/w
209a0 72 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a  rite fields..*/.
209b0 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 7b  struct unixShm {
209c0 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
209d0 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 2f 2a  pShmNode;     /*
209e0 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
209f0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
20a00 63 74 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  ct */.  unixShm 
20a10 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20  *pNext;         
20a20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 69 78 53     /* Next unixS
20a30 68 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  hm with the same
20a40 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a   unixShmNode */.
20a50 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20 20    u8 hasMutex;  
20a60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20a70 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20  True if holding 
20a80 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  the unixShmNode 
20a90 6d 75 74 65 78 20 2a 2f 0a 20 20 75 38 20 69 64  mutex */.  u8 id
20aa0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20ab0 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74        /* Id of t
20ac0 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  his connection w
20ad0 69 74 68 69 6e 20 69 74 73 20 75 6e 69 78 53 68  ithin its unixSh
20ae0 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 73  mNode */.  u16 s
20af0 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20  haredMask;      
20b00 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
20b10 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65   shared locks he
20b20 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c  ld */.  u16 excl
20b30 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
20b40 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78     /* Mask of ex
20b50 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65  clusive locks he
20b60 6c 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ld */.};../*.** 
20b70 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20 66  Constants used f
20b80 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64  or locking.*/.#d
20b90 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 42  efine UNIX_SHM_B
20ba0 41 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49 54  ASE   ((22+SQLIT
20bb0 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20  E_SHM_NLOCK)*4) 
20bc0 20 20 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74          /* first
20bd0 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64   lock byte */.#d
20be0 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 44  efine UNIX_SHM_D
20bf0 4d 53 20 20 20 20 28 55 4e 49 58 5f 53 48 4d 5f  MS    (UNIX_SHM_
20c00 42 41 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f  BASE+SQLITE_SHM_
20c10 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d  NLOCK)  /* deadm
20c20 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a  an switch */../*
20c30 0a 2a 2a 20 41 70 70 6c 79 20 70 6f 73 69 78 20  .** Apply posix 
20c40 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66  advisory locks f
20c50 6f 72 20 61 6c 6c 20 62 79 74 65 73 20 66 72 6f  or all bytes fro
20c60 6d 20 6f 66 73 74 20 74 68 72 6f 75 67 68 20 6f  m ofst through o
20c70 66 73 74 2b 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c  fst+n-1..**.** L
20c80 6f 63 6b 73 20 62 6c 6f 63 6b 20 69 66 20 74 68  ocks block if th
20c90 65 20 6d 61 73 6b 20 69 73 20 65 78 61 63 74 6c  e mask is exactl
20ca0 79 20 55 4e 49 58 5f 53 48 4d 5f 43 20 61 6e 64  y UNIX_SHM_C and
20cb0 20 61 72 65 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e   are non-blockin
20cc0 67 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a  g.** otherwise..
20cd0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
20ce0 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
20cf0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
20d00 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  le,       /* Ope
20d10 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  n connection to 
20d20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 2a 2f 0a  the WAL file */.
20d30 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20    int lockType, 
20d40 20 20 20 20 20 20 20 20 20 2f 2a 20 46 5f 55 4e           /* F_UN
20d50 4c 43 4b 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 72  LCK, F_RDLCK, or
20d60 20 46 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e   F_WRLCK */.  in
20d70 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20  t ofst,         
20d80 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
20d90 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e  te of the lockin
20da0 67 20 72 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74  g range */.  int
20db0 20 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20   n              
20dc0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
20dd0 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a   bytes to lock *
20de0 2f 0a 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f  /.){.  unixShmNo
20df0 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a  de *pShmNode; /*
20e00 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20   Apply locks to 
20e10 74 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65 64  this open shared
20e20 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20  -memory segment 
20e30 2a 2f 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  */.  struct floc
20e40 6b 20 66 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  k f;        /* T
20e50 68 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72  he posix advisor
20e60 79 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74  y locking struct
20e70 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ure */.  int rc 
20e80 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
20e90 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
20ea0 6f 72 6d 20 66 63 6e 74 6c 28 29 20 2a 2f 0a 0a  orm fcntl() */..
20eb0 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74    /* Access to t
20ec0 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f  he unixShmNode o
20ed0 62 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c 69  bject is seriali
20ee0 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  zed by the calle
20ef0 72 20 2a 2f 0a 20 20 70 53 68 6d 4e 6f 64 65 20  r */.  pShmNode 
20f00 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  = pFile->pInode-
20f10 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 61 73 73  >pShmNode;.  ass
20f20 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
20f30 65 78 5f 68 65 6c 64 28 70 53 68 6d 4e 6f 64 65  ex_held(pShmNode
20f40 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70 53 68 6d  ->mutex) || pShm
20f50 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b  Node->nRef==0 );
20f60 0a 0a 20 20 2f 2a 20 53 68 61 72 65 64 20 6c 6f  ..  /* Shared lo
20f70 63 6b 73 20 6e 65 76 65 72 20 73 70 61 6e 20 6d  cks never span m
20f80 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 79 74  ore than one byt
20f90 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e  e */.  assert( n
20fa0 3d 3d 31 20 7c 7c 20 6c 6f 63 6b 54 79 70 65 21  ==1 || lockType!
20fb0 3d 46 5f 52 44 4c 43 4b 20 29 3b 0a 0a 20 20 2f  =F_RDLCK );..  /
20fc0 2a 20 4c 6f 63 6b 73 20 61 72 65 20 77 69 74 68  * Locks are with
20fd0 69 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20 61 73  in range */.  as
20fe0 73 65 72 74 28 20 6e 3e 3d 31 20 26 26 20 6e 3c  sert( n>=1 && n<
20ff0 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
21000 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e   );..  if( pShmN
21010 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20  ode->h>=0 ){.   
21020 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
21030 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d  he locking param
21040 65 74 65 72 73 20 2a 2f 0a 20 20 20 20 6d 65 6d  eters */.    mem
21050 73 65 74 28 26 66 2c 20 30 2c 20 73 69 7a 65 6f  set(&f, 0, sizeo
21060 66 28 66 29 29 3b 0a 20 20 20 20 66 2e 6c 5f 74  f(f));.    f.l_t
21070 79 70 65 20 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a  ype = lockType;.
21080 20 20 20 20 66 2e 6c 5f 77 68 65 6e 63 65 20 3d      f.l_whence =
21090 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 66   SEEK_SET;.    f
210a0 2e 6c 5f 73 74 61 72 74 20 3d 20 6f 66 73 74 3b  .l_start = ofst;
210b0 0a 20 20 20 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e  .    f.l_len = n
210c0 3b 0a 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63  ;..    rc = osFc
210d0 6e 74 6c 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  ntl(pShmNode->h,
210e0 20 46 5f 53 45 54 4c 4b 2c 20 26 66 29 3b 0a 20   F_SETLK, &f);. 
210f0 20 20 20 72 63 20 3d 20 28 72 63 21 3d 28 2d 31     rc = (rc!=(-1
21100 29 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  )) ? SQLITE_OK :
21110 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
21120 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  }..  /* Update t
21130 68 65 20 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73  he global lock s
21140 74 61 74 65 20 61 6e 64 20 64 6f 20 64 65 62 75  tate and do debu
21150 67 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23 69 66  g tracing */.#if
21160 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
21170 0a 20 20 7b 20 75 31 36 20 6d 61 73 6b 3b 0a 20  .  { u16 mask;. 
21180 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c   OSTRACE(("SHM-L
21190 4f 43 4b 20 22 29 29 3b 0a 20 20 6d 61 73 6b 20  OCK "));.  mask 
211a0 3d 20 6f 66 73 74 3e 33 31 20 3f 20 30 78 66 66  = ofst>31 ? 0xff
211b0 66 66 20 3a 20 28 31 3c 3c 28 6f 66 73 74 2b 6e  ff : (1<<(ofst+n
211c0 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a  )) - (1<<ofst);.
211d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
211e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6c  _OK ){.    if( l
211f0 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b  ockType==F_UNLCK
21200 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   ){.      OSTRAC
21210 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20 6f 6b  E(("unlock %d ok
21220 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20  ", ofst));.     
21230 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d   pShmNode->exclM
21240 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
21250 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68      pShmNode->sh
21260 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  aredMask &= ~mas
21270 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  k;.    }else if(
21280 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c   lockType==F_RDL
21290 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  CK ){.      OSTR
212a0 41 43 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20  ACE(("read-lock 
212b0 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a  %d ok", ofst));.
212c0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
212d0 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  exclMask &= ~mas
212e0 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  k;.      pShmNod
212f0 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d  e->sharedMask |=
21300 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65   mask;.    }else
21310 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
21320 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43  lockType==F_WRLC
21330 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  K );.      OSTRA
21340 43 45 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20  CE(("write-lock 
21350 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a  %d ok", ofst));.
21360 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
21370 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  exclMask |= mask
21380 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
21390 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20  ->sharedMask &= 
213a0 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ~mask;.    }.  }
213b0 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6c 6f  else{.    if( lo
213c0 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20  ckType==F_UNLCK 
213d0 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
213e0 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20 66 61 69  (("unlock %d fai
213f0 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20  led", ofst));.  
21400 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b    }else if( lock
21410 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b  Type==F_RDLCK ){
21420 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
21430 22 72 65 61 64 2d 6c 6f 63 6b 20 66 61 69 6c 65  "read-lock faile
21440 64 22 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  d"));.    }else{
21450 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c  .      assert( l
21460 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b  ockType==F_WRLCK
21470 20 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   );.      OSTRAC
21480 45 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25  E(("write-lock %
21490 64 20 66 61 69 6c 65 64 22 2c 20 6f 66 73 74 29  d failed", ofst)
214a0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f  );.    }.  }.  O
214b0 53 54 52 41 43 45 28 28 22 20 2d 20 61 66 74 65  STRACE((" - afte
214c0 72 77 61 72 64 73 20 25 30 33 78 2c 25 30 33 78  rwards %03x,%03x
214d0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
214e0 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64  pShmNode->shared
214f0 4d 61 73 6b 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e  Mask, pShmNode->
21500 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 7d 0a  exclMask));.  }.
21510 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
21520 20 72 63 3b 20 20 20 20 20 20 20 20 0a 7d 0a 0a   rc;        .}..
21530 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
21540 20 6d 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20   minimum number 
21550 6f 66 20 33 32 4b 42 20 73 68 6d 20 72 65 67 69  of 32KB shm regi
21560 6f 6e 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ons that should 
21570 62 65 20 6d 61 70 70 65 64 20 61 74 0a 2a 2a 20  be mapped at.** 
21580 61 20 74 69 6d 65 2c 20 61 73 73 75 6d 69 6e 67  a time, assuming
21590 20 74 68 61 74 20 65 61 63 68 20 6d 61 70 70 69   that each mappi
215a0 6e 67 20 6d 75 73 74 20 62 65 20 61 6e 20 69 6e  ng must be an in
215b0 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f  teger multiple o
215c0 66 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  f the.** current
215d0 20 73 79 73 74 65 6d 20 70 61 67 65 2d 73 69 7a   system page-siz
215e0 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 75 61 6c 6c 79  e..**.** Usually
215f0 2c 20 74 68 69 73 20 69 73 20 31 2e 20 54 68 65  , this is 1. The
21600 20 65 78 63 65 70 74 69 6f 6e 20 73 65 65 6d 73   exception seems
21610 20 74 6f 20 62 65 20 73 79 73 74 65 6d 73 20 74   to be systems t
21620 68 61 74 20 61 72 65 20 63 6f 6e 66 69 67 75 72  hat are configur
21630 65 64 0a 2a 2a 20 74 6f 20 75 73 65 20 36 34 4b  ed.** to use 64K
21640 42 20 70 61 67 65 73 20 2d 20 69 6e 20 74 68 69  B pages - in thi
21650 73 20 63 61 73 65 20 65 61 63 68 20 6d 61 70 70  s case each mapp
21660 69 6e 67 20 6d 75 73 74 20 63 6f 76 65 72 20 61  ing must cover a
21670 74 20 6c 65 61 73 74 20 74 77 6f 0a 2a 2a 20 73  t least two.** s
21680 68 6d 20 72 65 67 69 6f 6e 73 2e 0a 2a 2f 0a 73  hm regions..*/.s
21690 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
216a0 6d 52 65 67 69 6f 6e 50 65 72 4d 61 70 28 76 6f  mRegionPerMap(vo
216b0 69 64 29 7b 0a 20 20 69 6e 74 20 73 68 6d 73 7a  id){.  int shmsz
216c0 20 3d 20 33 32 2a 31 30 32 34 3b 20 20 20 20 20   = 32*1024;     
216d0 20 20 20 20 20 20 20 2f 2a 20 53 48 4d 20 72 65         /* SHM re
216e0 67 69 6f 6e 20 73 69 7a 65 20 2a 2f 0a 20 20 69  gion size */.  i
216f0 6e 74 20 70 67 73 7a 20 3d 20 6f 73 47 65 74 70  nt pgsz = osGetp
21700 61 67 65 73 69 7a 65 28 29 3b 20 20 20 2f 2a 20  agesize();   /* 
21710 53 79 73 74 65 6d 20 70 61 67 65 20 73 69 7a 65  System page size
21720 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 28   */.  assert( ((
21730 70 67 73 7a 2d 31 29 26 70 67 73 7a 29 3d 3d 30  pgsz-1)&pgsz)==0
21740 20 29 3b 20 20 20 2f 2a 20 50 61 67 65 20 73 69   );   /* Page si
21750 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77  ze must be a pow
21760 65 72 20 6f 66 20 32 20 2a 2f 0a 20 20 69 66 28  er of 2 */.  if(
21770 20 70 67 73 7a 3c 73 68 6d 73 7a 20 29 20 72 65   pgsz<shmsz ) re
21780 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e  turn 1;.  return
21790 20 70 67 73 7a 2f 73 68 6d 73 7a 3b 0a 7d 0a 0a   pgsz/shmsz;.}..
217a0 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20  /*.** Purge the 
217b0 75 6e 69 78 53 68 6d 4e 6f 64 65 4c 69 73 74 20  unixShmNodeList 
217c0 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72  list of all entr
217d0 69 65 73 20 77 69 74 68 20 75 6e 69 78 53 68 6d  ies with unixShm
217e0 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a  Node.nRef==0..**
217f0 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20  .** This is not 
21800 61 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d  a VFS shared-mem
21810 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69  ory method; it i
21820 73 20 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63  s a utility func
21830 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62  tion called.** b
21840 79 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d  y VFS shared-mem
21850 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a  ory methods..*/.
21860 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
21870 53 68 6d 50 75 72 67 65 28 75 6e 69 78 46 69 6c  ShmPurge(unixFil
21880 65 20 2a 70 46 64 29 7b 0a 20 20 75 6e 69 78 53  e *pFd){.  unixS
21890 68 6d 4e 6f 64 65 20 2a 70 20 3d 20 70 46 64 2d  hmNode *p = pFd-
218a0 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64  >pInode->pShmNod
218b0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69  e;.  assert( uni
218c0 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  xMutexHeld() );.
218d0 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 6e 52    if( p && p->nR
218e0 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ef==0 ){.    int
218f0 20 6e 53 68 6d 50 65 72 4d 61 70 20 3d 20 75 6e   nShmPerMap = un
21900 69 78 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d 61  ixShmRegionPerMa
21910 70 28 29 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  p();.    int i;.
21920 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
21930 49 6e 6f 64 65 3d 3d 70 46 64 2d 3e 70 49 6e 6f  Inode==pFd->pIno
21940 64 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  de );.    sqlite
21950 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e  3_mutex_free(p->
21960 6d 75 74 65 78 29 3b 0a 20 20 20 20 66 6f 72 28  mutex);.    for(
21970 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f  i=0; i<p->nRegio
21980 6e 3b 20 69 2b 3d 6e 53 68 6d 50 65 72 4d 61 70  n; i+=nShmPerMap
21990 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
219a0 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  h>=0 ){.        
219b0 6f 73 4d 75 6e 6d 61 70 28 70 2d 3e 61 70 52 65  osMunmap(p->apRe
219c0 67 69 6f 6e 5b 69 5d 2c 20 70 2d 3e 73 7a 52 65  gion[i], p->szRe
219d0 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  gion);.      }el
219e0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
219f0 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 52 65  te3_free(p->apRe
21a00 67 69 6f 6e 5b 69 5d 29 3b 0a 20 20 20 20 20 20  gion[i]);.      
21a10 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
21a20 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 52 65  te3_free(p->apRe
21a30 67 69 6f 6e 29 3b 0a 20 20 20 20 69 66 28 20 70  gion);.    if( p
21a40 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->h>=0 ){.      
21a50 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 64  robust_close(pFd
21a60 2c 20 70 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f  , p->h, __LINE__
21a70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 68 20 3d 20  );.      p->h = 
21a80 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  -1;.    }.    p-
21a90 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64  >pInode->pShmNod
21aa0 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  e = 0;.    sqlit
21ab0 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a  e3_free(p);.  }.
21ac0 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
21ad0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72  shared-memory ar
21ae0 65 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ea associated wi
21af0 74 68 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  th open database
21b00 20 66 69 6c 65 20 70 44 62 46 64 2e 20 20 0a 2a   file pDbFd.  .*
21b10 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61  * This particula
21b20 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  r implementation
21b30 20 75 73 65 73 20 6d 6d 61 70 70 65 64 20 66 69   uses mmapped fi
21b40 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  les..**.** The f
21b50 69 6c 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c  ile used to impl
21b60 65 6d 65 6e 74 20 73 68 61 72 65 64 2d 6d 65 6d  ement shared-mem
21b70 6f 72 79 20 69 73 20 69 6e 20 74 68 65 20 73 61  ory is in the sa
21b80 6d 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20  me directory.** 
21b90 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  as the open data
21ba0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 68 61  base file and ha
21bb0 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  s the same name 
21bc0 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  as the open data
21bd0 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 77 69 74  base.** file wit
21be0 68 20 74 68 65 20 22 2d 73 68 6d 22 20 73 75 66  h the "-shm" suf
21bf0 66 69 78 20 61 64 64 65 64 2e 20 20 46 6f 72 20  fix added.  For 
21c00 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
21c10 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a  database file.**
21c20 20 69 73 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31   is "/home/user1
21c30 2f 63 6f 6e 66 69 67 2e 64 62 22 20 74 68 65 6e  /config.db" then
21c40 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 69   the file that i
21c50 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 6d 6d  s created and mm
21c60 61 70 70 65 64 0a 2a 2a 20 66 6f 72 20 73 68 61  apped.** for sha
21c70 72 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20  red memory will 
21c80 62 65 20 63 61 6c 6c 65 64 20 22 2f 68 6f 6d 65  be called "/home
21c90 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62  /user1/config.db
21ca0 2d 73 68 6d 22 2e 20 20 0a 2a 2a 0a 2a 2a 20 41  -shm".  .**.** A
21cb0 6e 6f 74 68 65 72 20 61 70 70 72 6f 61 63 68 20  nother approach 
21cc0 74 6f 20 69 73 20 74 6f 20 75 73 65 20 66 69 6c  to is to use fil
21cd0 65 73 20 69 6e 20 2f 64 65 76 2f 73 68 6d 20 6f  es in /dev/shm o
21ce0 72 20 2f 64 65 76 2f 74 6d 70 20 6f 72 20 61 6e  r /dev/tmp or an
21cf0 0a 2a 2a 20 73 6f 6d 65 20 6f 74 68 65 72 20 74  .** some other t
21d00 6d 70 66 73 20 6d 6f 75 6e 74 2e 20 42 75 74 20  mpfs mount. But 
21d10 69 66 20 61 20 66 69 6c 65 20 69 6e 20 61 20 64  if a file in a d
21d20 69 66 66 65 72 65 6e 74 20 64 69 72 65 63 74 6f  ifferent directo
21d30 72 79 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64  ry.** from the d
21d40 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
21d50 75 73 65 64 2c 20 74 68 65 6e 20 64 69 66 66 65  used, then diffe
21d60 72 69 6e 67 20 61 63 63 65 73 73 20 70 65 72 6d  ring access perm
21d70 69 73 73 69 6f 6e 73 0a 2a 2a 20 6f 72 20 61 20  issions.** or a 
21d80 63 68 72 6f 6f 74 28 29 20 6d 69 67 68 74 20 63  chroot() might c
21d90 61 75 73 65 20 74 77 6f 20 64 69 66 66 65 72 65  ause two differe
21da0 6e 74 20 70 72 6f 63 65 73 73 65 73 20 6f 6e 20  nt processes on 
21db0 74 68 65 20 73 61 6d 65 0a 2a 2a 20 64 61 74 61  the same.** data
21dc0 62 61 73 65 20 74 6f 20 65 6e 64 20 75 70 20 75  base to end up u
21dd0 73 69 6e 67 20 64 69 66 66 65 72 65 6e 74 20 66  sing different f
21de0 69 6c 65 73 20 66 6f 72 20 73 68 61 72 65 64 20  iles for shared 
21df0 6d 65 6d 6f 72 79 20 2d 20 0a 2a 2a 20 6d 65 61  memory - .** mea
21e00 6e 69 6e 67 20 74 68 61 74 20 74 68 65 69 72 20  ning that their 
21e10 6d 65 6d 6f 72 79 20 77 6f 75 6c 64 20 6e 6f 74  memory would not
21e20 20 72 65 61 6c 6c 79 20 62 65 20 73 68 61 72 65   really be share
21e30 64 20 2d 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a  d - resulting.**
21e40 20 69 6e 20 64 61 74 61 62 61 73 65 20 63 6f 72   in database cor
21e50 72 75 70 74 69 6f 6e 2e 20 20 4e 65 76 65 72 74  ruption.  Nevert
21e60 68 65 6c 65 73 73 2c 20 74 68 69 73 20 74 6d 70  heless, this tmp
21e70 66 73 20 66 69 6c 65 20 75 73 61 67 65 0a 2a 2a  fs file usage.**
21e80 20 63 61 6e 20 62 65 20 65 6e 61 62 6c 65 64 20   can be enabled 
21e90 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
21ea0 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 53  using -DSQLITE_S
21eb0 48 4d 5f 44 49 52 45 43 54 4f 52 59 3d 22 2f 64  HM_DIRECTORY="/d
21ec0 65 76 2f 73 68 6d 22 0a 2a 2a 20 6f 72 20 74 68  ev/shm".** or th
21ed0 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 54  e equivalent.  T
21ee0 68 65 20 75 73 65 20 6f 66 20 74 68 65 20 53 51  he use of the SQ
21ef0 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
21f00 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a  RY compile-time.
21f10 2a 2a 20 6f 70 74 69 6f 6e 20 72 65 73 75 6c 74  ** option result
21f20 73 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74  s in an incompat
21f30 69 62 6c 65 20 62 75 69 6c 64 20 6f 66 20 53 51  ible build of SQ
21f40 4c 69 74 65 3b 20 20 62 75 69 6c 64 73 20 6f 66  Lite;  builds of
21f50 20 53 51 4c 69 74 65 0a 2a 2a 20 74 68 61 74 20   SQLite.** that 
21f60 77 69 74 68 20 64 69 66 66 65 72 69 6e 67 20 53  with differing S
21f70 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
21f80 4f 52 59 20 73 65 74 74 69 6e 67 73 20 61 74 74  ORY settings att
21f90 65 6d 70 74 20 74 6f 20 75 73 65 20 74 68 65 0a  empt to use the.
21fa0 2a 2a 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  ** same database
21fb0 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d   file at the sam
21fc0 65 20 74 69 6d 65 2c 20 64 61 74 61 62 61 73 65  e time, database
21fd0 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c   corruption will
21fe0 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c   likely.** resul
21ff0 74 2e 20 54 68 65 20 53 51 4c 49 54 45 5f 53 48  t. The SQLITE_SH
22000 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f 6d 70  M_DIRECTORY comp
22010 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
22020 69 73 20 63 6f 6e 73 69 64 65 72 65 64 0a 2a 2a  is considered.**
22030 20 22 75 6e 73 75 70 70 6f 72 74 65 64 22 20 61   "unsupported" a
22040 6e 64 20 6d 61 79 20 67 6f 20 61 77 61 79 20 69  nd may go away i
22050 6e 20 61 20 66 75 74 75 72 65 20 53 51 4c 69 74  n a future SQLit
22060 65 20 72 65 6c 65 61 73 65 2e 0a 2a 2a 0a 2a 2a  e release..**.**
22070 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20   When opening a 
22080 6e 65 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  new shared-memor
22090 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74  y file, if no ot
220a0 68 65 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  her instances of
220b0 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72   that.** file ar
220c0 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e  e currently open
220d0 2c 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  , in this proces
220e0 73 20 6f 72 20 69 6e 20 6f 74 68 65 72 20 70 72  s or in other pr
220f0 6f 63 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a  ocesses, then.**
22100 20 74 68 65 20 66 69 6c 65 20 6d 75 73 74 20 62   the file must b
22110 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a  e truncated to z
22120 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68 61  ero length or ha
22130 76 65 20 69 74 73 20 68 65 61 64 65 72 20 63 6c  ve its header cl
22140 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eared..**.** If 
22150 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
22160 61 62 61 73 65 20 66 69 6c 65 20 28 70 44 62 46  abase file (pDbF
22170 64 29 20 69 73 20 75 73 69 6e 67 20 74 68 65 20  d) is using the 
22180 22 75 6e 69 78 2d 65 78 63 6c 22 20 56 46 53 0a  "unix-excl" VFS.
22190 2a 2a 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  ** that means th
221a0 61 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  at an exclusive 
221b0 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20  lock is held on 
221c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
221d0 65 20 61 6e 64 0a 2a 2a 20 74 68 61 74 20 6e 6f  e and.** that no
221e0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
221f0 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72 65 61   are able to rea
22200 64 20 6f 72 20 77 72 69 74 65 20 74 68 65 20 64  d or write the d
22210 61 74 61 62 61 73 65 2e 20 20 49 6e 0a 2a 2a 20  atabase.  In.** 
22220 74 68 61 74 20 63 61 73 65 2c 20 77 65 20 64 6f  that case, we do
22230 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6e 65 65 64   not really need
22240 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20   shared memory. 
22250 20 4e 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   No shared memor
22260 79 0a 2a 2a 20 66 69 6c 65 20 69 73 20 63 72 65  y.** file is cre
22270 61 74 65 64 2e 20 20 54 68 65 20 73 68 61 72 65  ated.  The share
22280 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65  d memory will be
22290 20 73 69 6d 75 6c 61 74 65 64 20 77 69 74 68 20   simulated with 
222a0 68 65 61 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  heap memory..*/.
222b0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f  static int unixO
222c0 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28  penSharedMemory(
222d0 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 29  unixFile *pDbFd)
222e0 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 53  {.  struct unixS
222f0 68 6d 20 2a 70 20 3d 20 30 3b 20 20 20 20 20 20  hm *p = 0;      
22300 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65      /* The conne
22310 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e  ction to be open
22320 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75  ed */.  struct u
22330 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
22340 4e 6f 64 65 3b 20 20 20 2f 2a 20 54 68 65 20 75  Node;   /* The u
22350 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65  nderlying mmappe
22360 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  d file */.  int 
22370 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
22380 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
22390 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20  esult code */.  
223a0 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
223b0 49 6e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  Inode;          
223c0 2f 2a 20 54 68 65 20 69 6e 6f 64 65 20 6f 66 20  /* The inode of 
223d0 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53  fd */.  char *zS
223e0 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  hmFilename;     
223f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
22400 6f 66 20 74 68 65 20 66 69 6c 65 20 75 73 65 64  of the file used
22410 20 66 6f 72 20 53 48 4d 20 2a 2f 0a 20 20 69 6e   for SHM */.  in
22420 74 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20  t nShmFilename; 
22430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22440 20 53 69 7a 65 20 6f 66 20 74 68 65 20 53 48 4d   Size of the SHM
22450 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 62 79 74   filename in byt
22460 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  es */..  /* Allo
22470 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
22480 68 65 20 6e 65 77 20 75 6e 69 78 53 68 6d 20 6f  he new unixShm o
22490 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 70 20 3d 20  bject. */.  p = 
224a0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
224b0 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a  ( sizeof(*p) );.
224c0 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
224d0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
224e0 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  ;.  memset(p, 0,
224f0 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
22500 61 73 73 65 72 74 28 20 70 44 62 46 64 2d 3e 70  assert( pDbFd->p
22510 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Shm==0 );..  /* 
22520 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
22530 61 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  a unixShmNode ob
22540 6a 65 63 74 20 61 6c 72 65 61 64 79 20 65 78 69  ject already exi
22550 73 74 73 2e 20 52 65 75 73 65 20 61 6e 20 65 78  sts. Reuse an ex
22560 69 73 74 69 6e 67 0a 20 20 2a 2a 20 6f 6e 65 20  isting.  ** one 
22570 69 66 20 70 72 65 73 65 6e 74 2e 20 43 72 65 61  if present. Crea
22580 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20  te a new one if 
22590 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a  necessary..  */.
225a0 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
225b0 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  ();.  pInode = p
225c0 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  DbFd->pInode;.  
225d0 70 53 68 6d 4e 6f 64 65 20 3d 20 70 49 6e 6f 64  pShmNode = pInod
225e0 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69  e->pShmNode;.  i
225f0 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29  f( pShmNode==0 )
22600 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  {.    struct sta
22610 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20  t sStat;        
22620 20 20 20 20 20 20 20 20 20 2f 2a 20 66 73 74 61           /* fsta
22630 74 28 29 20 69 6e 66 6f 20 66 6f 72 20 64 61 74  t() info for dat
22640 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23 69  abase file */.#i
22650 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d  fndef SQLITE_SHM
22660 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20 63  _DIRECTORY.    c
22670 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 61 73 65  onst char *zBase
22680 50 61 74 68 20 3d 20 70 44 62 46 64 2d 3e 7a 50  Path = pDbFd->zP
22690 61 74 68 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  ath;.#endif..   
226a0 20 2f 2a 20 43 61 6c 6c 20 66 73 74 61 74 28 29   /* Call fstat()
226b0 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20 74   to figure out t
226c0 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f  he permissions o
226d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
226e0 69 6c 65 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61  ile. If.    ** a
226f0 20 6e 65 77 20 2a 2d 73 68 6d 20 66 69 6c 65 20   new *-shm file 
22700 69 73 20 63 72 65 61 74 65 64 2c 20 61 6e 20 61  is created, an a
22710 74 74 65 6d 70 74 20 77 69 6c 6c 20 62 65 20 6d  ttempt will be m
22720 61 64 65 20 74 6f 20 63 72 65 61 74 65 20 69 74  ade to create it
22730 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65  .    ** with the
22740 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e   same permission
22750 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
22760 28 20 6f 73 46 73 74 61 74 28 70 44 62 46 64 2d  ( osFstat(pDbFd-
22770 3e 68 2c 20 26 73 53 74 61 74 29 20 26 26 20 70  >h, &sStat) && p
22780 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
22790 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ock==0 ){.      
227a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
227b0 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 20 20 67  R_FSTAT;.      g
227c0 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
227d0 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
227e0 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
227f0 54 4f 52 59 0a 20 20 20 20 6e 53 68 6d 46 69 6c  TORY.    nShmFil
22800 65 6e 61 6d 65 20 3d 20 73 69 7a 65 6f 66 28 53  ename = sizeof(S
22810 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
22820 4f 52 59 29 20 2b 20 33 31 3b 0a 23 65 6c 73 65  ORY) + 31;.#else
22830 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d  .    nShmFilenam
22840 65 20 3d 20 36 20 2b 20 28 69 6e 74 29 73 74 72  e = 6 + (int)str
22850 6c 65 6e 28 7a 42 61 73 65 50 61 74 68 29 3b 0a  len(zBasePath);.
22860 23 65 6e 64 69 66 0a 20 20 20 20 70 53 68 6d 4e  #endif.    pShmN
22870 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ode = sqlite3_ma
22880 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a  lloc64( sizeof(*
22890 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 53 68 6d  pShmNode) + nShm
228a0 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20 20 20  Filename );.    
228b0 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20  if( pShmNode==0 
228c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
228d0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
228e0 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f    goto shm_open_
228f0 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  err;.    }.    m
22900 65 6d 73 65 74 28 70 53 68 6d 4e 6f 64 65 2c 20  emset(pShmNode, 
22910 30 2c 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e  0, sizeof(*pShmN
22920 6f 64 65 29 2b 6e 53 68 6d 46 69 6c 65 6e 61 6d  ode)+nShmFilenam
22930 65 29 3b 0a 20 20 20 20 7a 53 68 6d 46 69 6c 65  e);.    zShmFile
22940 6e 61 6d 65 20 3d 20 70 53 68 6d 4e 6f 64 65 2d  name = pShmNode-
22950 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68  >zFilename = (ch
22960 61 72 2a 29 26 70 53 68 6d 4e 6f 64 65 5b 31 5d  ar*)&pShmNode[1]
22970 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
22980 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20  SHM_DIRECTORY.  
22990 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
229a0 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c  tf(nShmFilename,
229b0 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 0a   zShmFilename, .
229c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229d0 20 20 20 20 20 53 51 4c 49 54 45 5f 53 48 4d 5f       SQLITE_SHM_
229e0 44 49 52 45 43 54 4f 52 59 20 22 2f 73 71 6c 69  DIRECTORY "/sqli
229f0 74 65 2d 73 68 6d 2d 25 78 2d 25 78 22 2c 0a 20  te-shm-%x-%x",. 
22a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a10 20 20 20 20 28 75 33 32 29 73 53 74 61 74 2e 73      (u32)sStat.s
22a20 74 5f 69 6e 6f 2c 20 28 75 33 32 29 73 53 74 61  t_ino, (u32)sSta
22a30 74 2e 73 74 5f 64 65 76 29 3b 0a 23 65 6c 73 65  t.st_dev);.#else
22a40 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
22a50 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61  rintf(nShmFilena
22a60 6d 65 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65  me, zShmFilename
22a70 2c 20 22 25 73 2d 73 68 6d 22 2c 20 7a 42 61 73  , "%s-shm", zBas
22a80 65 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69  ePath);.    sqli
22a90 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70  te3FileSuffix3(p
22aa0 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 7a 53 68  DbFd->zPath, zSh
22ab0 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64  mFilename);.#end
22ac0 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  if.    pShmNode-
22ad0 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 70 44 62  >h = -1;.    pDb
22ae0 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
22af0 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b  Node = pShmNode;
22b00 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  .    pShmNode->p
22b10 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70  Inode = pDbFd->p
22b20 49 6e 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e  Inode;.    pShmN
22b30 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c  ode->mutex = sql
22b40 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
22b50 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41  (SQLITE_MUTEX_FA
22b60 53 54 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68  ST);.    if( pSh
22b70 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20  mNode->mutex==0 
22b80 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
22b90 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
22ba0 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f    goto shm_open_
22bb0 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  err;.    }..    
22bc0 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  if( pInode->bPro
22bd0 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20  cessLock==0 ){. 
22be0 20 20 20 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61       int openFla
22bf0 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f  gs = O_RDWR | O_
22c00 43 52 45 41 54 3b 0a 20 20 20 20 20 20 69 66 28  CREAT;.      if(
22c10 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f   sqlite3_uri_boo
22c20 6c 65 61 6e 28 70 44 62 46 64 2d 3e 7a 50 61 74  lean(pDbFd->zPat
22c30 68 2c 20 22 72 65 61 64 6f 6e 6c 79 5f 73 68 6d  h, "readonly_shm
22c40 22 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  ", 0) ){.       
22c50 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52   openFlags = O_R
22c60 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 70  DONLY;.        p
22c70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f  ShmNode->isReado
22c80 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  nly = 1;.      }
22c90 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
22ca0 3e 68 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  >h = robust_open
22cb0 28 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 6f  (zShmFilename, o
22cc0 70 65 6e 46 6c 61 67 73 2c 20 28 73 53 74 61 74  penFlags, (sStat
22cd0 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37 29 29 3b  .st_mode&0777));
22ce0 0a 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e  .      if( pShmN
22cf0 6f 64 65 2d 3e 68 3c 30 20 29 7b 0a 20 20 20 20  ode->h<0 ){.    
22d00 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
22d10 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
22d20 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65  TOPEN_BKPT, "ope
22d30 6e 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65  n", zShmFilename
22d40 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
22d50 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
22d60 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
22d70 49 66 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  If this process 
22d80 69 73 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f  is running as ro
22d90 6f 74 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  ot, make sure th
22da0 61 74 20 74 68 65 20 53 48 4d 20 66 69 6c 65 0a  at the SHM file.
22db0 20 20 20 20 20 20 2a 2a 20 69 73 20 6f 77 6e 65        ** is owne
22dc0 64 20 62 79 20 74 68 65 20 73 61 6d 65 20 75 73  d by the same us
22dd0 65 72 20 74 68 61 74 20 6f 77 6e 73 20 74 68 65  er that owns the
22de0 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
22df0 73 65 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a  se.  Otherwise,.
22e00 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69        ** the ori
22e10 67 69 6e 61 6c 20 6f 77 6e 65 72 20 77 69 6c 6c  ginal owner will
22e20 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20   not be able to 
22e30 63 6f 6e 6e 65 63 74 2e 0a 20 20 20 20 20 20 2a  connect..      *
22e40 2f 0a 20 20 20 20 20 20 72 6f 62 75 73 74 46 63  /.      robustFc
22e50 68 6f 77 6e 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  hown(pShmNode->h
22e60 2c 20 73 53 74 61 74 2e 73 74 5f 75 69 64 2c 20  , sStat.st_uid, 
22e70 73 53 74 61 74 2e 73 74 5f 67 69 64 29 3b 0a 20  sStat.st_gid);. 
22e80 20 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b   .      /* Check
22e90 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68   to see if anoth
22ea0 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f  er process is ho
22eb0 6c 64 69 6e 67 20 74 68 65 20 64 65 61 64 2d 6d  lding the dead-m
22ec0 61 6e 20 73 77 69 74 63 68 2e 0a 20 20 20 20 20  an switch..     
22ed0 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e   ** If not, trun
22ee0 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f  cate the file to
22ef0 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2e 20 0a 20   zero length. . 
22f00 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
22f10 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
22f20 20 20 20 20 69 66 28 20 75 6e 69 78 53 68 6d 53      if( unixShmS
22f30 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c  ystemLock(pDbFd,
22f40 20 46 5f 57 52 4c 43 4b 2c 20 55 4e 49 58 5f 53   F_WRLCK, UNIX_S
22f50 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49  HM_DMS, 1)==SQLI
22f60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
22f70 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75   if( robust_ftru
22f80 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  ncate(pShmNode->
22f90 68 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  h, 0) ){.       
22fa0 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
22fb0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
22fc0 52 5f 53 48 4d 4f 50 45 4e 2c 20 22 66 74 72 75  R_SHMOPEN, "ftru
22fd0 6e 63 61 74 65 22 2c 20 7a 53 68 6d 46 69 6c 65  ncate", zShmFile
22fe0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  name);.        }
22ff0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
23000 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
23010 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
23020 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f   unixShmSystemLo
23030 63 6b 28 70 44 62 46 64 2c 20 46 5f 52 44 4c 43  ck(pDbFd, F_RDLC
23040 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c  K, UNIX_SHM_DMS,
23050 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   1);.      }.   
23060 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
23070 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
23080 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d     }.  }..  /* M
23090 61 6b 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e  ake the new conn
230a0 65 63 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f  ection a child o
230b0 66 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64  f the unixShmNod
230c0 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f  e */.  p->pShmNo
230d0 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23  de = pShmNode;.#
230e0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
230f0 55 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68  UG.  p->id = pSh
23100 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64  mNode->nextShmId
23110 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68  ++;.#endif.  pSh
23120 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  mNode->nRef++;. 
23130 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70   pDbFd->pShm = p
23140 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  ;.  unixLeaveMut
23150 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ex();..  /* The 
23160 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
23170 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20  on pShmNode has 
23180 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63  already been inc
23190 72 65 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20  remented under. 
231a0 20 2a 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66   ** the cover of
231b0 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75   the unixEnterMu
231c0 74 65 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20  tex() mutex and 
231d0 74 68 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d  the pointer from
231e0 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73   the.  ** new (s
231f0 74 72 75 63 74 20 75 6e 69 78 53 68 6d 29 20 6f  truct unixShm) o
23200 62 6a 65 63 74 20 74 6f 20 74 68 65 20 70 53 68  bject to the pSh
23210 6d 4e 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73  mNode has been s
23220 65 74 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a  et. All that is.
23230 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20    ** left to do 
23240 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e  is to link the n
23250 65 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74  ew object into t
23260 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73  he linked list s
23270 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20  tarting.  ** at 
23280 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
23290 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 64  . This must be d
232a0 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e  one while holdin
232b0 67 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e  g the pShmNode->
232c0 6d 75 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65  mutex .  ** mute
232d0 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  x..  */.  sqlite
232e0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
232f0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
23300 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68    p->pNext = pSh
23310 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20  mNode->pFirst;. 
23320 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73   pShmNode->pFirs
23330 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33  t = p;.  sqlite3
23340 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
23350 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
23360 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
23370 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  K;..  /* Jump he
23380 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20  re on any error 
23390 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a  */.shm_open_err:
233a0 0a 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28  .  unixShmPurge(
233b0 70 44 62 46 64 29 3b 20 20 20 20 20 20 20 2f 2a  pDbFd);       /*
233c0 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73   This call frees
233d0 20 70 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71   pShmNode if req
233e0 75 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  uired */.  sqlit
233f0 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 75 6e  e3_free(p);.  un
23400 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
23410 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
23420 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
23430 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
23440 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65   obtain a pointe
23450 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67  r to region iReg
23460 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73  ion of the .** s
23470 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73  hared-memory ass
23480 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
23490 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
234a0 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79  d. Shared-memory
234b0 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65   regions .** are
234c0 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74 69   numbered starti
234d0 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61  ng from zero. Ea
234e0 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ch shared-memory
234f0 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67   region is szReg
23500 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e  ion .** bytes in
23510 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   size..**.** If 
23520 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
23530 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
23540 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
23550 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  pp is set to NUL
23560 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  L..**.** Otherwi
23570 73 65 2c 20 69 66 20 74 68 65 20 62 45 78 74 65  se, if the bExte
23580 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
23590 30 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  0 and the reques
235a0 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ted shared-memor
235b0 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20  y.** region has 
235c0 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  not been allocat
235d0 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e  ed (by any clien
235e0 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65  t, including one
235f0 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a   running in a.**
23600 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73   separate proces
23610 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20  s), then *pp is 
23620 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20  set to NULL and 
23630 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
23640 65 64 2e 20 49 66 20 0a 2a 2a 20 62 45 78 74 65  ed. If .** bExte
23650 6e 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61  nd is non-zero a
23660 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64  nd the requested
23670 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
23680 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65  egion has not ye
23690 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63  t .** been alloc
236a0 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f  ated, it is allo
236b0 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75  cated by this fu
236c0 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
236d0 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f   the shared-memo
236e0 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c  ry region has al
236f0 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
23700 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63  ated or is alloc
23710 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20  ated by.** this 
23720 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65  call as describe
23730 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74  d above, then it
23740 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20   is mapped into 
23750 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 0a  this processes .
23760 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61 63 65  ** address space
23770 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
23780 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20  lready), *pp is 
23790 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
237a0 74 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d  the mapped .** m
237b0 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45  emory and SQLITE
237c0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  _OK returned..*/
237d0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
237e0 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65  ShmMap(.  sqlite
237f0 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20  3_file *fd,     
23800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
23810 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61  dle open on data
23820 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
23830 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20  nt iRegion,     
23840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23850 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72  * Region to retr
23860 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  ieve */.  int sz
23870 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20  Region,         
23880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
23890 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a  e of regions */.
238a0 20 20 69 6e 74 20 62 45 78 74 65 6e 64 2c 20 20    int bExtend,  
238b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238c0 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74    /* True to ext
238d0 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65  end file if nece
238e0 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20  ssary */.  void 
238f0 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20  volatile **pp   
23900 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
23910 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79  T: Mapped memory
23920 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c   */.){.  unixFil
23930 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78  e *pDbFd = (unix
23940 46 69 6c 65 2a 29 66 64 3b 0a 20 20 75 6e 69 78  File*)fd;.  unix
23950 53 68 6d 20 2a 70 3b 0a 20 20 75 6e 69 78 53 68  Shm *p;.  unixSh
23960 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
23970 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
23980 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 53 68  TE_OK;.  int nSh
23990 6d 50 65 72 4d 61 70 20 3d 20 75 6e 69 78 53 68  mPerMap = unixSh
239a0 6d 52 65 67 69 6f 6e 50 65 72 4d 61 70 28 29 3b  mRegionPerMap();
239b0 0a 20 20 69 6e 74 20 6e 52 65 71 52 65 67 69 6f  .  int nReqRegio
239c0 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  n;..  /* If the 
239d0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
239e0 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  le has not yet b
239f0 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e  een opened, open
23a00 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69 66   it now. */.  if
23a10 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30  ( pDbFd->pShm==0
23a20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69   ){.    rc = uni
23a30 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72  xOpenSharedMemor
23a40 79 28 70 44 62 46 64 29 3b 0a 20 20 20 20 69 66  y(pDbFd);.    if
23a50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
23a60 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
23a70 0a 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70  ..  p = pDbFd->p
23a80 53 68 6d 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20  Shm;.  pShmNode 
23a90 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20  = p->pShmNode;. 
23aa0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
23ab0 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
23ac0 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
23ad0 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e   szRegion==pShmN
23ae0 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c  ode->szRegion ||
23af0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
23b00 6f 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  on==0 );.  asser
23b10 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e  t( pShmNode->pIn
23b20 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f  ode==pDbFd->pIno
23b30 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  de );.  assert( 
23b40 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c  pShmNode->h>=0 |
23b50 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d  | pDbFd->pInode-
23b60 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31  >bProcessLock==1
23b70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
23b80 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70  hmNode->h<0 || p
23b90 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50  DbFd->pInode->bP
23ba0 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b  rocessLock==0 );
23bb0 0a 0a 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6e  ..  /* Minimum n
23bc0 75 6d 62 65 72 20 6f 66 20 72 65 67 69 6f 6e 73  umber of regions
23bd0 20 72 65 71 75 69 72 65 64 20 74 6f 20 62 65 20   required to be 
23be0 6d 61 70 70 65 64 2e 20 2a 2f 0a 20 20 6e 52 65  mapped. */.  nRe
23bf0 71 52 65 67 69 6f 6e 20 3d 20 28 28 69 52 65 67  qRegion = ((iReg
23c00 69 6f 6e 2b 6e 53 68 6d 50 65 72 4d 61 70 29 20  ion+nShmPerMap) 
23c10 2f 20 6e 53 68 6d 50 65 72 4d 61 70 29 20 2a 20  / nShmPerMap) * 
23c20 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 0a 20 20 69  nShmPerMap;..  i
23c30 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  f( pShmNode->nRe
23c40 67 69 6f 6e 3c 6e 52 65 71 52 65 67 69 6f 6e 20  gion<nReqRegion 
23c50 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 70  ){.    char **ap
23c60 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
23c70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
23c80 20 61 70 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61   apRegion[] arra
23c90 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79  y */.    int nBy
23ca0 74 65 20 3d 20 6e 52 65 71 52 65 67 69 6f 6e 2a  te = nReqRegion*
23cb0 73 7a 52 65 67 69 6f 6e 3b 20 20 20 2f 2a 20 4d  szRegion;   /* M
23cc0 69 6e 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20  inimum required 
23cd0 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20  file size */.   
23ce0 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74   struct stat sSt
23cf0 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  at;             
23d00 20 20 20 20 2f 2a 20 55 73 65 64 20 62 79 20 66      /* Used by f
23d10 73 74 61 74 28 29 20 2a 2f 0a 0a 20 20 20 20 70  stat() */..    p
23d20 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f  ShmNode->szRegio
23d30 6e 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20  n = szRegion;.. 
23d40 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d     if( pShmNode-
23d50 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  >h>=0 ){.      /
23d60 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
23d70 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61  region is not ma
23d80 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70  pped into this p
23d90 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73 73  rocesses address
23da0 20 73 70 61 63 65 2e 0a 20 20 20 20 20 20 2a 2a   space..      **
23db0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
23dc0 20 69 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c   it has been all
23dd0 6f 63 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20  ocated (i.e. if 
23de0 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69  the wal-index fi
23df0 6c 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6c  le is.      ** l
23e00 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63  arge enough to c
23e10 6f 6e 74 61 69 6e 20 74 68 65 20 72 65 71 75 65  ontain the reque
23e20 73 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20  sted region)..  
23e30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
23e40 20 6f 73 46 73 74 61 74 28 70 53 68 6d 4e 6f 64   osFstat(pShmNod
23e50 65 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 29 7b  e->h, &sStat) ){
23e60 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
23e70 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49  LITE_IOERR_SHMSI
23e80 5a 45 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  ZE;.        goto
23e90 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
23ea0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 69      }.  .      i
23eb0 66 28 20 73 53 74 61 74 2e 73 74 5f 73 69 7a 65  f( sStat.st_size
23ec0 3c 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20  <nByte ){.      
23ed0 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
23ee0 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed memory region
23ef0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
23f00 20 49 66 20 62 45 78 74 65 6e 64 20 69 73 20 73   If bExtend is s
23f10 65 74 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  et to.        **
23f20 20 66 61 6c 73 65 2c 20 65 78 69 74 20 65 61 72   false, exit ear
23f30 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20  ly. *pp will be 
23f40 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20  set to NULL and 
23f50 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
23f60 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
23f70 20 20 20 20 20 20 20 69 66 28 20 21 62 45 78 74         if( !bExt
23f80 65 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  end ){.         
23f90 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
23fa0 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  t;.        }..  
23fb0 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61        /* Alterna
23fc0 74 69 76 65 6c 79 2c 20 69 66 20 62 45 78 74 65  tively, if bExte
23fd0 6e 64 20 69 73 20 74 72 75 65 2c 20 65 78 74 65  nd is true, exte
23fe0 6e 64 20 74 68 65 20 66 69 6c 65 2e 20 44 6f 20  nd the file. Do 
23ff0 74 68 69 73 20 62 79 0a 20 20 20 20 20 20 20 20  this by.        
24000 2a 2a 20 77 72 69 74 69 6e 67 20 61 20 73 69 6e  ** writing a sin
24010 67 6c 65 20 62 79 74 65 20 74 6f 20 74 68 65 20  gle byte to the 
24020 65 6e 64 20 6f 66 20 65 61 63 68 20 28 4f 53 29  end of each (OS)
24030 20 70 61 67 65 20 62 65 69 6e 67 0a 20 20 20 20   page being.    
24040 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64      ** allocated
24050 20 6f 72 20 65 78 74 65 6e 64 65 64 2e 20 54 65   or extended. Te
24060 63 68 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6e 65  chnically, we ne
24070 65 64 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 6f  ed only write to
24080 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
24090 6c 61 73 74 20 70 61 67 65 20 69 6e 20 6f 72 64  last page in ord
240a0 65 72 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65  er to extend the
240b0 20 66 69 6c 65 2e 20 42 75 74 20 77 72 69 74 69   file. But writi
240c0 6e 67 20 74 6f 20 61 6c 6c 20 6e 65 77 0a 20 20  ng to all new.  
240d0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 73 20 66        ** pages f
240e0 6f 72 63 65 73 20 74 68 65 20 4f 53 20 74 6f 20  orces the OS to 
240f0 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d 20 69 6d  allocate them im
24100 6d 65 64 69 61 74 65 6c 79 2c 20 77 68 69 63 68  mediately, which
24110 20 72 65 64 75 63 65 73 0a 20 20 20 20 20 20 20   reduces.       
24120 20 2a 2a 20 74 68 65 20 63 68 61 6e 63 65 73 20   ** the chances 
24130 6f 66 20 53 49 47 42 55 53 20 77 68 69 6c 65 20  of SIGBUS while 
24140 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 6d 61  accessing the ma
24150 70 70 65 64 20 72 65 67 69 6f 6e 20 6c 61 74 65  pped region late
24160 72 20 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f  r on..        */
24170 0a 20 20 20 20 20 20 20 20 65 6c 73 65 7b 0a 20  .        else{. 
24180 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20           static 
24190 63 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d  const int pgsz =
241a0 20 34 30 39 36 3b 0a 20 20 20 20 20 20 20 20 20   4096;.         
241b0 20 69 6e 74 20 69 50 67 3b 0a 0a 20 20 20 20 20   int iPg;..     
241c0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f       /* Write to
241d0 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f   the last byte o
241e0 66 20 65 61 63 68 20 6e 65 77 6c 79 20 61 6c 6c  f each newly all
241f0 6f 63 61 74 65 64 20 6f 72 20 65 78 74 65 6e 64  ocated or extend
24200 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ed page */.     
24210 20 20 20 20 20 61 73 73 65 72 74 28 20 28 6e 42       assert( (nB
24220 79 74 65 20 25 20 70 67 73 7a 29 3d 3d 30 20 29  yte % pgsz)==0 )
24230 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
24240 69 50 67 3d 28 73 53 74 61 74 2e 73 74 5f 73 69  iPg=(sStat.st_si
24250 7a 65 2f 70 67 73 7a 29 3b 20 69 50 67 3c 28 6e  ze/pgsz); iPg<(n
24260 42 79 74 65 2f 70 67 73 7a 29 3b 20 69 50 67 2b  Byte/pgsz); iPg+
24270 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
24280 69 6e 74 20 78 20 3d 20 30 3b 0a 20 20 20 20 20  int x = 0;.     
24290 20 20 20 20 20 20 20 69 66 28 20 73 65 65 6b 41         if( seekA
242a0 6e 64 57 72 69 74 65 46 64 28 70 53 68 6d 4e 6f  ndWriteFd(pShmNo
242b0 64 65 2d 3e 68 2c 20 69 50 67 2a 70 67 73 7a 20  de->h, iPg*pgsz 
242c0 2b 20 70 67 73 7a 2d 31 2c 20 22 22 2c 20 31 2c  + pgsz-1, "", 1,
242d0 20 26 78 29 21 3d 31 20 29 7b 0a 20 20 20 20 20   &x)!=1 ){.     
242e0 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63           const c
242f0 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 70 53 68  har *zFile = pSh
24300 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65  mNode->zFilename
24310 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
24320 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  rc = unixLogErro
24330 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
24340 48 4d 53 49 5a 45 2c 20 22 77 72 69 74 65 22 2c  HMSIZE, "write",
24350 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20   zFile);.       
24360 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70         goto shmp
24370 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  age_out;.       
24380 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
24390 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
243a0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
243b0 2f 2a 20 4d 61 70 20 74 68 65 20 72 65 71 75 65  /* Map the reque
243c0 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69  sted memory regi
243d0 6f 6e 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f  on into this pro
243e0 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73  cesses address s
243f0 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e  pace. */.    apN
24400 65 77 20 3d 20 28 63 68 61 72 20 2a 2a 29 73 71  ew = (char **)sq
24410 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20  lite3_realloc(. 
24420 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
24430 3e 61 70 52 65 67 69 6f 6e 2c 20 6e 52 65 71 52  >apRegion, nReqR
24440 65 67 69 6f 6e 2a 73 69 7a 65 6f 66 28 63 68 61  egion*sizeof(cha
24450 72 20 2a 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  r *).    );.    
24460 69 66 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 20  if( !apNew ){.  
24470 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
24480 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
24490 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
244a0 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  out;.    }.    p
244b0 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f  ShmNode->apRegio
244c0 6e 20 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20 77  n = apNew;.    w
244d0 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  hile( pShmNode->
244e0 6e 52 65 67 69 6f 6e 3c 6e 52 65 71 52 65 67 69  nRegion<nReqRegi
244f0 6f 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  on ){.      int 
24500 6e 4d 61 70 20 3d 20 73 7a 52 65 67 69 6f 6e 2a  nMap = szRegion*
24510 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 20 20 20 20  nShmPerMap;.    
24520 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 76    int i;.      v
24530 6f 69 64 20 2a 70 4d 65 6d 3b 0a 20 20 20 20 20  oid *pMem;.     
24540 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68   if( pShmNode->h
24550 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  >=0 ){.        p
24560 4d 65 6d 20 3d 20 6f 73 4d 6d 61 70 28 30 2c 20  Mem = osMmap(0, 
24570 6e 4d 61 70 2c 0a 20 20 20 20 20 20 20 20 20 20  nMap,.          
24580 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65    pShmNode->isRe
24590 61 64 6f 6e 6c 79 20 3f 20 50 52 4f 54 5f 52 45  adonly ? PROT_RE
245a0 41 44 20 3a 20 50 52 4f 54 5f 52 45 41 44 7c 50  AD : PROT_READ|P
245b0 52 4f 54 5f 57 52 49 54 45 2c 20 0a 20 20 20 20  ROT_WRITE, .    
245c0 20 20 20 20 20 20 20 20 4d 41 50 5f 53 48 41 52          MAP_SHAR
245d0 45 44 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  ED, pShmNode->h,
245e0 20 73 7a 52 65 67 69 6f 6e 2a 28 69 36 34 29 70   szRegion*(i64)p
245f0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
24600 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
24610 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 4d 41      if( pMem==MA
24620 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20  P_FAILED ){.    
24630 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c        rc = unixL
24640 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
24650 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20 22 6d 6d  OERR_SHMMAP, "mm
24660 61 70 22 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a  ap", pShmNode->z
24670 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
24680 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
24690 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  e_out;.        }
246a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
246b0 20 20 20 20 20 20 70 4d 65 6d 20 3d 20 73 71 6c        pMem = sql
246c0 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 7a  ite3_malloc64(sz
246d0 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20  Region);.       
246e0 20 69 66 28 20 70 4d 65 6d 3d 3d 30 20 29 7b 0a   if( pMem==0 ){.
246f0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
24700 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
24710 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70         goto shmp
24720 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  age_out;.       
24730 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65   }.        memse
24740 74 28 70 4d 65 6d 2c 20 30 2c 20 73 7a 52 65 67  t(pMem, 0, szReg
24750 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  ion);.      }.. 
24760 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
24770 6e 53 68 6d 50 65 72 4d 61 70 3b 20 69 2b 2b 29  nShmPerMap; i++)
24780 7b 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f  {.        pShmNo
24790 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 70 53 68  de->apRegion[pSh
247a0 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 69  mNode->nRegion+i
247b0 5d 20 3d 20 26 28 28 63 68 61 72 2a 29 70 4d 65  ] = &((char*)pMe
247c0 6d 29 5b 73 7a 52 65 67 69 6f 6e 2a 69 5d 3b 0a  m)[szRegion*i];.
247d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53        }.      pS
247e0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 20  hmNode->nRegion 
247f0 2b 3d 20 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 20  += nShmPerMap;. 
24800 20 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67     }.  }..shmpag
24810 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 53 68  e_out:.  if( pSh
24820 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69  mNode->nRegion>i
24830 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 2a 70  Region ){.    *p
24840 70 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70  p = pShmNode->ap
24850 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 3b  Region[iRegion];
24860 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
24870 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  p = 0;.  }.  if(
24880 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61   pShmNode->isRea
24890 64 6f 6e 6c 79 20 26 26 20 72 63 3d 3d 53 51 4c  donly && rc==SQL
248a0 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 53 51  ITE_OK ) rc = SQ
248b0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
248c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
248d0 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
248e0 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
248f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  rc;.}../*.** Cha
24900 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  nge the lock sta
24910 74 65 20 66 6f 72 20 61 20 73 68 61 72 65 64 2d  te for a shared-
24920 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a  memory segment..
24930 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
24940 74 68 65 20 72 65 6c 61 74 69 6f 6e 73 68 69 70  the relationship
24950 20 62 65 74 77 65 65 6e 20 53 48 41 52 45 64 20   between SHAREd 
24960 61 6e 64 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  and EXCLUSIVE lo
24970 63 6b 73 20 69 73 20 61 20 6c 69 74 74 6c 65 0a  cks is a little.
24980 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 68 65 72  ** different her
24990 65 20 74 68 61 6e 20 69 6e 20 70 6f 73 69 78 2e  e than in posix.
249a0 20 20 49 6e 20 78 53 68 6d 4c 6f 63 6b 28 29 2c    In xShmLock(),
249b0 20 6f 6e 65 20 63 61 6e 20 67 6f 20 66 72 6f 6d   one can go from
249c0 20 75 6e 6c 6f 63 6b 65 64 0a 2a 2a 20 74 6f 20   unlocked.** to 
249d0 73 68 61 72 65 64 20 61 6e 64 20 62 61 63 6b 20  shared and back 
249e0 6f 72 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64  or from unlocked
249f0 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 61 6e   to exclusive an
24a00 64 20 62 61 63 6b 2e 20 20 42 75 74 20 6f 6e 65  d back.  But one
24a10 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 67 6f 20 66   may.** not go f
24a20 72 6f 6d 20 73 68 61 72 65 64 20 74 6f 20 65 78  rom shared to ex
24a30 63 6c 75 73 69 76 65 20 6f 72 20 66 72 6f 6d 20  clusive or from 
24a40 65 78 63 6c 75 73 69 76 65 20 74 6f 20 73 68 61  exclusive to sha
24a50 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
24a60 6e 74 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 28 0a  nt unixShmLock(.
24a70 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
24a80 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fd,          /* 
24a90 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f  Database file ho
24aa0 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  lding the shared
24ab0 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74   memory */.  int
24ac0 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20   ofst,          
24ad0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
24ae0 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69 72 65   lock to acquire
24af0 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20   or release */. 
24b00 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20   int n,         
24b10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
24b20 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 74  umber of locks t
24b30 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c  o acquire or rel
24b40 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  ease */.  int fl
24b50 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ags             
24b60 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
24b70 64 6f 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  do with the lock
24b80 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c   */.){.  unixFil
24b90 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78  e *pDbFd = (unix
24ba0 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20 2f  File*)fd;      /
24bb0 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c  * Connection hol
24bc0 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f  ding shared memo
24bd0 72 79 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  ry */.  unixShm 
24be0 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d  *p = pDbFd->pShm
24bf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
24c00 20 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   The shared memo
24c10 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 20  ry being locked 
24c20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 58  */.  unixShm *pX
24c30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24c40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
24c50 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61  r looping over a
24c60 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20  ll siblings */. 
24c70 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
24c80 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d  hmNode = p->pShm
24c90 4e 6f 64 65 3b 20 20 2f 2a 20 54 68 65 20 75 6e  Node;  /* The un
24ca0 64 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 69 4e  derlying file iN
24cb0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ode */.  int rc 
24cc0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
24cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24ce0 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  * Result code */
24cf0 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20 20  .  u16 mask;    
24d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d10 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
24d20 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61 6b   of locks to tak
24d30 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
24d40 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
24d50 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f  ode==pDbFd->pIno
24d60 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a  de->pShmNode );.
24d70 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
24d80 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46  de->pInode==pDbF
24d90 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61  d->pInode );.  a
24da0 73 73 65 72 74 28 20 6f 66 73 74 3e 3d 30 20 26  ssert( ofst>=0 &
24db0 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45  & ofst+n<=SQLITE
24dc0 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20  _SHM_NLOCK );.  
24dd0 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a  assert( n>=1 );.
24de0 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
24df0 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43  =(SQLITE_SHM_LOC
24e00 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53  K | SQLITE_SHM_S
24e10 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c  HARED).       ||
24e20 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
24e30 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  SHM_LOCK | SQLIT
24e40 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
24e50 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
24e60 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e  ==(SQLITE_SHM_UN
24e70 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
24e80 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20  M_SHARED).      
24e90 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49   || flags==(SQLI
24ea0 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20  TE_SHM_UNLOCK | 
24eb0 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
24ec0 53 49 56 45 29 20 29 3b 0a 20 20 61 73 73 65 72  SIVE) );.  asser
24ed0 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67  t( n==1 || (flag
24ee0 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45  s & SQLITE_SHM_E
24ef0 58 43 4c 55 53 49 56 45 29 21 3d 30 20 29 3b 0a  XCLUSIVE)!=0 );.
24f00 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
24f10 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44 62 46  de->h>=0 || pDbF
24f20 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  d->pInode->bProc
24f30 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20  essLock==1 );.  
24f40 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
24f50 2d 3e 68 3c 30 20 7c 7c 20 70 44 62 46 64 2d 3e  ->h<0 || pDbFd->
24f60 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
24f70 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 6d 61  Lock==0 );..  ma
24f80 73 6b 20 3d 20 28 31 3c 3c 28 6f 66 73 74 2b 6e  sk = (1<<(ofst+n
24f90 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a  )) - (1<<ofst);.
24fa0 20 20 61 73 73 65 72 74 28 20 6e 3e 31 20 7c 7c    assert( n>1 ||
24fb0 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29   mask==(1<<ofst)
24fc0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   );.  sqlite3_mu
24fd0 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
24fe0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  de->mutex);.  if
24ff0 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
25000 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  _SHM_UNLOCK ){. 
25010 20 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20 3d     u16 allMask =
25020 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c   0; /* Mask of l
25030 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 73 69 62  ocks held by sib
25040 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a  lings */..    /*
25050 20 53 65 65 20 69 66 20 61 6e 79 20 73 69 62 6c   See if any sibl
25060 69 6e 67 73 20 68 6f 6c 64 20 74 68 69 73 20 73  ings hold this s
25070 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ame lock */.    
25080 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d  for(pX=pShmNode-
25090 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d  >pFirst; pX; pX=
250a0 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  pX->pNext){.    
250b0 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63 6f    if( pX==p ) co
250c0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73  ntinue;.      as
250d0 73 65 72 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d  sert( (pX->exclM
250e0 61 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61  ask & (p->exclMa
250f0 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b  sk|p->sharedMask
25100 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  ))==0 );.      a
25110 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73 68  llMask |= pX->sh
25120 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a  aredMask;.    }.
25130 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74  .    /* Unlock t
25140 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20  he system-level 
25150 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28  locks */.    if(
25160 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73 6b   (mask & allMask
25170 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  )==0 ){.      rc
25180 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d   = unixShmSystem
25190 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f 55 4e  Lock(pDbFd, F_UN
251a0 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53  LCK, ofst+UNIX_S
251b0 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20  HM_BASE, n);.   
251c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
251d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
251e0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f    }..    /* Undo
251f0 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73   the local locks
25200 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
25210 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25220 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26     p->exclMask &
25230 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70  = ~mask;.      p
25240 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20  ->sharedMask &= 
25250 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20  ~mask;.    } .  
25260 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
25270 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41  & SQLITE_SHM_SHA
25280 52 45 44 20 29 7b 0a 20 20 20 20 75 31 36 20 61  RED ){.    u16 a
25290 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f  llShared = 0;  /
252a0 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73  * Union of locks
252b0 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74   held by connect
252c0 69 6f 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20  ions other than 
252d0 22 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46  "p" */..    /* F
252e0 69 6e 64 20 6f 75 74 20 77 68 69 63 68 20 73 68  ind out which sh
252f0 61 72 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61  ared locks are a
25300 6c 72 65 61 64 79 20 68 65 6c 64 20 62 79 20 73  lready held by s
25310 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
25320 6e 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e  ns..    ** If an
25330 79 20 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64  y sibling alread
25340 79 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75  y holds an exclu
25350 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68  sive lock, go ah
25360 65 61 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20  ead and return. 
25370 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53     ** SQLITE_BUS
25380 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  Y..    */.    fo
25390 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70  r(pX=pShmNode->p
253a0 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58  First; pX; pX=pX
253b0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
253c0 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73  if( (pX->exclMas
253d0 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a  k & mask)!=0 ){.
253e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
253f0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
25400 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
25410 0a 20 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64  .      allShared
25420 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61   |= pX->sharedMa
25430 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  sk;.    }..    /
25440 2a 20 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63  * Get shared loc
25450 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d  ks at the system
25460 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73   level, if neces
25470 73 61 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20  sary */.    if( 
25480 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
25490 0a 20 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53  .      if( (allS
254a0 68 61 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30  hared & mask)==0
254b0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
254c0 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f   unixShmSystemLo
254d0 63 6b 28 70 44 62 46 64 2c 20 46 5f 52 44 4c 43  ck(pDbFd, F_RDLC
254e0 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d  K, ofst+UNIX_SHM
254f0 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20  _BASE, n);.     
25500 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
25510 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
25520 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
25530 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f     /* Get the lo
25540 63 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  cal shared locks
25550 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
25560 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25570 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b     p->sharedMask
25580 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a   |= mask;.    }.
25590 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
255a0 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 73 69 62  Make sure no sib
255b0 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
255c0 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74   hold locks that
255d0 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73   will block this
255e0 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49  .    ** lock.  I
255f0 66 20 61 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e  f any do, return
25600 20 53 51 4c 49 54 45 5f 42 55 53 59 20 72 69 67   SQLITE_BUSY rig
25610 68 74 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a  ht away..    */.
25620 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e      for(pX=pShmN
25630 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b  ode->pFirst; pX;
25640 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
25650 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65        if( (pX->e
25660 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21  xclMask & mask)!
25670 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65  =0 || (pX->share
25680 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  dMask & mask)!=0
25690 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
256a0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
256b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
256c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
256d0 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65 78 63    /* Get the exc
256e0 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 61 74 20  lusive locks at 
256f0 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c  the system level
25700 2e 20 20 54 68 65 6e 20 69 66 20 73 75 63 63 65  .  Then if succe
25710 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73  ssful.    ** als
25720 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c  o mark the local
25730 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62   connection as b
25740 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20  eing locked..   
25750 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
25760 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25770 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53     rc = unixShmS
25780 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c  ystemLock(pDbFd,
25790 20 46 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 55   F_WRLCK, ofst+U
257a0 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29  NIX_SHM_BASE, n)
257b0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
257c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
257d0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d       assert( (p-
257e0 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61  >sharedMask & ma
257f0 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  sk)==0 );.      
25800 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d    p->exclMask |=
25810 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20   mask;.      }. 
25820 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
25830 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
25840 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
25850 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d  .  OSTRACE(("SHM
25860 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25 64 2c 20  -LOCK shmid-%d, 
25870 70 69 64 2d 25 64 20 67 6f 74 20 25 30 33 78 2c  pid-%d got %03x,
25880 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %03x\n",.       
25890 20 20 20 20 70 2d 3e 69 64 2c 20 6f 73 47 65 74      p->id, osGet
258a0 70 69 64 28 30 29 2c 20 70 2d 3e 73 68 61 72 65  pid(0), p->share
258b0 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61  dMask, p->exclMa
258c0 73 6b 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  sk));.  return r
258d0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  c;.}../*.** Impl
258e0 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62  ement a memory b
258f0 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79  arrier or memory
25900 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72 65 64   fence on shared
25910 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a   memory.  .**.**
25920 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73   All loads and s
25930 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65 66 6f  tores begun befo
25940 72 65 20 74 68 65 20 62 61 72 72 69 65 72 20 6d  re the barrier m
25950 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 66  ust complete bef
25960 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20  ore.** any load 
25970 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e 20 61  or store begun a
25980 66 74 65 72 20 74 68 65 20 62 61 72 72 69 65 72  fter the barrier
25990 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
259a0 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 28   unixShmBarrier(
259b0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
259c0 2a 66 64 20 20 20 20 20 20 20 20 20 20 20 20 20  *fd             
259d0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66     /* Database f
259e0 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ile holding the 
259f0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
25a00 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  .){.  UNUSED_PAR
25a10 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 73 71  AMETER(fd);.  sq
25a20 6c 69 74 65 33 4d 65 6d 6f 72 79 42 61 72 72 69  lite3MemoryBarri
25a30 65 72 28 29 3b 20 20 20 20 20 20 20 20 20 2f 2a  er();         /*
25a40 20 63 6f 6d 70 69 6c 65 72 2d 64 65 66 69 6e 65   compiler-define
25a50 64 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72  d memory barrier
25a60 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
25a70 75 74 65 78 28 29 3b 20 20 20 20 20 20 20 20 20  utex();         
25a80 20 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20 6d 75        /* Also mu
25a90 74 65 78 2c 20 66 6f 72 20 72 65 64 75 6e 64 61  tex, for redunda
25aa0 6e 63 79 20 2a 2f 0a 20 20 75 6e 69 78 4c 65 61  ncy */.  unixLea
25ab0 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a  veMutex();.}../*
25ac0 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e  .** Close a conn
25ad0 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64  ection to shared
25ae0 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65  -memory.  Delete
25af0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
25b00 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69 66 20 64  .** storage if d
25b10 65 6c 65 74 65 46 6c 61 67 20 69 73 20 74 72 75  eleteFlag is tru
25b20 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  e..**.** If ther
25b30 65 20 69 73 20 6e 6f 20 73 68 61 72 65 64 20 6d  e is no shared m
25b40 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
25b50 20 77 69 74 68 20 74 68 65 20 63 6f 6e 6e 65 63   with the connec
25b60 74 69 6f 6e 20 74 68 65 6e 20 74 68 69 73 0a 2a  tion then this.*
25b70 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68  * routine is a h
25b80 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a  armless no-op..*
25b90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
25ba0 78 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c  xShmUnmap(.  sql
25bb0 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
25bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25bd0 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  The underlying d
25be0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
25bf0 20 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67    int deleteFlag
25c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c10 20 20 2f 2a 20 44 65 6c 65 74 65 20 73 68 61 72    /* Delete shar
25c20 65 64 2d 6d 65 6d 6f 72 79 20 69 66 20 74 72 75  ed-memory if tru
25c30 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53 68  e */.){.  unixSh
25c40 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  m *p;           
25c50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
25c60 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62   connection to b
25c70 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 75 6e  e closed */.  un
25c80 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
25c90 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ode;          /*
25ca0 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
25cb0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
25cc0 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  le */.  unixShm 
25cd0 2a 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20 20  **pp;           
25ce0 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
25cf0 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c  ooping over sibl
25d00 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ing connections 
25d10 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  */.  unixFile *p
25d20 44 62 46 64 3b 20 20 20 20 20 20 20 20 20 20 20  DbFd;           
25d30 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65       /* The unde
25d40 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
25d50 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 44 62 46 64  file */..  pDbFd
25d60 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64   = (unixFile*)fd
25d70 3b 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70  ;.  p = pDbFd->p
25d80 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  Shm;.  if( p==0 
25d90 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
25da0 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d  OK;.  pShmNode =
25db0 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20   p->pShmNode;.. 
25dc0 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
25dd0 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
25de0 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20  ->pShmNode );.  
25df0 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
25e00 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d  ->pInode==pDbFd-
25e10 3e 70 49 6e 6f 64 65 20 29 3b 0a 0a 20 20 2f 2a  >pInode );..  /*
25e20 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69   Remove connecti
25e30 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65  on p from the se
25e40 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  t of connections
25e50 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a   associated.  **
25e60 20 77 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a   with pShmNode *
25e70 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
25e80 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
25e90 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28  ->mutex);.  for(
25ea0 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  pp=&pShmNode->pF
25eb0 69 72 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20  irst; (*pp)!=p; 
25ec0 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65  pp = &(*pp)->pNe
25ed0 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d  xt){}.  *pp = p-
25ee0 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72  >pNext;..  /* Fr
25ef0 65 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ee the connectio
25f00 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  n p */.  sqlite3
25f10 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46  _free(p);.  pDbF
25f20 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73  d->pShm = 0;.  s
25f30 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
25f40 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
25f50 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53  ex);..  /* If pS
25f60 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73  hmNode->nRef has
25f70 20 72 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e   reached 0, then
25f80 20 63 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72   close the under
25f90 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65  lying.  ** share
25fa0 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74  d-memory file, t
25fb0 6f 6f 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65  oo */.  unixEnte
25fc0 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65  rMutex();.  asse
25fd0 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  rt( pShmNode->nR
25fe0 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f  ef>0 );.  pShmNo
25ff0 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  de->nRef--;.  if
26000 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  ( pShmNode->nRef
26010 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64  ==0 ){.    if( d
26020 65 6c 65 74 65 46 6c 61 67 20 26 26 20 70 53 68  eleteFlag && pSh
26030 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20  mNode->h>=0 ){. 
26040 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 70 53       osUnlink(pS
26050 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d  hmNode->zFilenam
26060 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e  e);.    }.    un
26070 69 78 53 68 6d 50 75 72 67 65 28 70 44 62 46 64  ixShmPurge(pDbFd
26080 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61  );.  }.  unixLea
26090 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65  veMutex();..  re
260a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
260b0 7d 0a 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }...#else.# defi
260c0 6e 65 20 75 6e 69 78 53 68 6d 4d 61 70 20 20 20  ne unixShmMap   
260d0 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69    0.# define uni
260e0 78 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20  xShmLock    0.# 
260f0 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 42 61  define unixShmBa
26100 72 72 69 65 72 20 30 0a 23 20 64 65 66 69 6e 65  rrier 0.# define
26110 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 20 20 20   unixShmUnmap   
26120 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e  0.#endif /* #ifn
26130 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
26140 57 41 4c 20 2a 2f 0a 0a 23 69 66 20 53 51 4c 49  WAL */..#if SQLI
26150 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
26160 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74 20 69  >0./*.** If it i
26170 73 20 63 75 72 72 65 6e 74 6c 79 20 6d 65 6d 6f  s currently memo
26180 72 79 20 6d 61 70 70 65 64 2c 20 75 6e 6d 61 70  ry mapped, unmap
26190 20 66 69 6c 65 20 70 46 64 2e 0a 2a 2f 0a 73 74   file pFd..*/.st
261a0 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 55 6e  atic void unixUn
261b0 6d 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65  mapfile(unixFile
261c0 20 2a 70 46 64 29 7b 0a 20 20 61 73 73 65 72 74   *pFd){.  assert
261d0 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74  ( pFd->nFetchOut
261e0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 64  ==0 );.  if( pFd
261f0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 29 7b 0a  ->pMapRegion ){.
26200 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 46 64      osMunmap(pFd
26210 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c 20 70 46  ->pMapRegion, pF
26220 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  d->mmapSizeActua
26230 6c 29 3b 0a 20 20 20 20 70 46 64 2d 3e 70 4d 61  l);.    pFd->pMa
26240 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 20  pRegion = 0;.   
26250 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d   pFd->mmapSize =
26260 20 30 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61   0;.    pFd->mma
26270 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b  pSizeActual = 0;
26280 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74  .  }.}../*.** At
26290 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65  tempt to set the
262a0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 65 6d   size of the mem
262b0 6f 72 79 20 6d 61 70 70 69 6e 67 20 6d 61 69 6e  ory mapping main
262c0 74 61 69 6e 65 64 20 62 79 20 66 69 6c 65 20 0a  tained by file .
262d0 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  ** descriptor pF
262e0 64 20 74 6f 20 6e 4e 65 77 20 62 79 74 65 73 2e  d to nNew bytes.
262f0 20 41 6e 79 20 65 78 69 73 74 69 6e 67 20 6d 61   Any existing ma
26300 70 70 69 6e 67 20 69 73 20 64 69 73 63 61 72 64  pping is discard
26310 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  ed..**.** If suc
26320 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20 66 75  cessful, this fu
26330 6e 63 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20  nction sets the 
26340 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
26350 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  les:.**.**      
26360 20 75 6e 69 78 46 69 6c 65 2e 70 4d 61 70 52 65   unixFile.pMapRe
26370 67 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 75 6e  gion.**       un
26380 69 78 46 69 6c 65 2e 6d 6d 61 70 53 69 7a 65 0a  ixFile.mmapSize.
26390 2a 2a 20 20 20 20 20 20 20 75 6e 69 78 46 69 6c  **       unixFil
263a0 65 2e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  e.mmapSizeActual
263b0 0a 2a 2a 0a 2a 2a 20 49 66 20 75 6e 73 75 63 63  .**.** If unsucc
263c0 65 73 73 66 75 6c 2c 20 61 6e 20 65 72 72 6f 72  essful, an error
263d0 20 6d 65 73 73 61 67 65 20 69 73 20 6c 6f 67 67   message is logg
263e0 65 64 20 76 69 61 20 73 71 6c 69 74 65 33 5f 6c  ed via sqlite3_l
263f0 6f 67 28 29 20 61 6e 64 0a 2a 2a 20 74 68 65 20  og() and.** the 
26400 74 68 72 65 65 20 76 61 72 69 61 62 6c 65 73 20  three variables 
26410 61 62 6f 76 65 20 61 72 65 20 7a 65 72 6f 65 64  above are zeroed
26420 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 53  . In this case S
26430 51 4c 69 74 65 20 73 68 6f 75 6c 64 0a 2a 2a 20  QLite should.** 
26440 63 6f 6e 74 69 6e 75 65 20 61 63 63 65 73 73 69  continue accessi
26450 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
26460 75 73 69 6e 67 20 74 68 65 20 78 52 65 61 64 28  using the xRead(
26470 29 20 61 6e 64 20 78 57 72 69 74 65 28 29 0a 2a  ) and xWrite().*
26480 2a 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74  * methods..*/.st
26490 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 52 65  atic void unixRe
264a0 6d 61 70 66 69 6c 65 28 0a 20 20 75 6e 69 78 46  mapfile(.  unixF
264b0 69 6c 65 20 2a 70 46 64 2c 20 20 20 20 20 20 20  ile *pFd,       
264c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
264d0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 62  le descriptor ob
264e0 6a 65 63 74 20 2a 2f 0a 20 20 69 36 34 20 6e 4e  ject */.  i64 nN
264f0 65 77 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ew              
26500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71            /* Req
26510 75 69 72 65 64 20 6d 61 70 70 69 6e 67 20 73 69  uired mapping si
26520 7a 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  ze */.){.  const
26530 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 22 6d   char *zErr = "m
26540 6d 61 70 22 3b 0a 20 20 69 6e 74 20 68 20 3d 20  map";.  int h = 
26550 70 46 64 2d 3e 68 3b 20 20 20 20 20 20 20 20 20  pFd->h;         
26560 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26570 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
26580 6f 70 65 6e 20 6f 6e 20 64 62 20 66 69 6c 65 20  open on db file 
26590 2a 2f 0a 20 20 75 38 20 2a 70 4f 72 69 67 20 3d  */.  u8 *pOrig =
265a0 20 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70   (u8 *)pFd->pMap
265b0 52 65 67 69 6f 6e 3b 20 20 20 2f 2a 20 50 6f 69  Region;   /* Poi
265c0 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20  nter to current 
265d0 66 69 6c 65 20 6d 61 70 70 69 6e 67 20 2a 2f 0a  file mapping */.
265e0 20 20 69 36 34 20 6e 4f 72 69 67 20 3d 20 70 46    i64 nOrig = pF
265f0 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  d->mmapSizeActua
26600 6c 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  l;     /* Size o
26610 66 20 70 4f 72 69 67 20 72 65 67 69 6f 6e 20 69  f pOrig region i
26620 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 38 20  n bytes */.  u8 
26630 2a 70 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20  *pNew = 0;      
26640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26650 20 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20 6f 66    /* Location of
26660 20 6e 65 77 20 6d 61 70 70 69 6e 67 20 2a 2f 0a   new mapping */.
26670 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 50 52    int flags = PR
26680 4f 54 5f 52 45 41 44 3b 20 20 20 20 20 20 20 20  OT_READ;        
26690 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
266a0 74 6f 20 70 61 73 73 20 74 6f 20 6d 6d 61 70 28  to pass to mmap(
266b0 29 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  ) */..  assert( 
266c0 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d  pFd->nFetchOut==
266d0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
266e0 4e 65 77 3e 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  New>pFd->mmapSiz
266f0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  e );.  assert( n
26700 4e 65 77 3c 3d 70 46 64 2d 3e 6d 6d 61 70 53 69  New<=pFd->mmapSi
26710 7a 65 4d 61 78 20 29 3b 0a 20 20 61 73 73 65 72  zeMax );.  asser
26720 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20 61  t( nNew>0 );.  a
26730 73 73 65 72 74 28 20 70 46 64 2d 3e 6d 6d 61 70  ssert( pFd->mmap
26740 53 69 7a 65 41 63 74 75 61 6c 3e 3d 70 46 64 2d  SizeActual>=pFd-
26750 3e 6d 6d 61 70 53 69 7a 65 20 29 3b 0a 20 20 61  >mmapSize );.  a
26760 73 73 65 72 74 28 20 4d 41 50 5f 46 41 49 4c 45  ssert( MAP_FAILE
26770 44 21 3d 30 20 29 3b 0a 0a 23 69 66 64 65 66 20  D!=0 );..#ifdef 
26780 53 51 4c 49 54 45 5f 4d 4d 41 50 5f 52 45 41 44  SQLITE_MMAP_READ
26790 57 52 49 54 45 0a 20 20 69 66 28 20 28 70 46 64  WRITE.  if( (pFd
267a0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
267b0 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d  IXFILE_RDONLY)==
267c0 30 20 29 20 66 6c 61 67 73 20 7c 3d 20 50 52 4f  0 ) flags |= PRO
267d0 54 5f 57 52 49 54 45 3b 0a 23 65 6e 64 69 66 0a  T_WRITE;.#endif.
267e0 0a 20 20 69 66 28 20 70 4f 72 69 67 20 29 7b 0a  .  if( pOrig ){.
267f0 23 69 66 20 48 41 56 45 5f 4d 52 45 4d 41 50 0a  #if HAVE_MREMAP.
26800 20 20 20 20 69 36 34 20 6e 52 65 75 73 65 20 3d      i64 nReuse =
26810 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 3b 0a   pFd->mmapSize;.
26820 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74 20  #else.    const 
26830 69 6e 74 20 73 7a 53 79 73 70 61 67 65 20 3d 20  int szSyspage = 
26840 6f 73 47 65 74 70 61 67 65 73 69 7a 65 28 29 3b  osGetpagesize();
26850 0a 20 20 20 20 69 36 34 20 6e 52 65 75 73 65 20  .    i64 nReuse 
26860 3d 20 28 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  = (pFd->mmapSize
26870 20 26 20 7e 28 73 7a 53 79 73 70 61 67 65 2d 31   & ~(szSyspage-1
26880 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 75  ));.#endif.    u
26890 38 20 2a 70 52 65 71 20 3d 20 26 70 4f 72 69 67  8 *pReq = &pOrig
268a0 5b 6e 52 65 75 73 65 5d 3b 0a 0a 20 20 20 20 2f  [nReuse];..    /
268b0 2a 20 55 6e 6d 61 70 20 61 6e 79 20 70 61 67 65  * Unmap any page
268c0 73 20 6f 66 20 74 68 65 20 65 78 69 73 74 69 6e  s of the existin
268d0 67 20 6d 61 70 70 69 6e 67 20 74 68 61 74 20 63  g mapping that c
268e0 61 6e 6e 6f 74 20 62 65 20 72 65 75 73 65 64 2e  annot be reused.
268f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 75   */.    if( nReu
26900 73 65 21 3d 6e 4f 72 69 67 20 29 7b 0a 20 20 20  se!=nOrig ){.   
26910 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 52 65 71     osMunmap(pReq
26920 2c 20 6e 4f 72 69 67 2d 6e 52 65 75 73 65 29 3b  , nOrig-nReuse);
26930 0a 20 20 20 20 7d 0a 0a 23 69 66 20 48 41 56 45  .    }..#if HAVE
26940 5f 4d 52 45 4d 41 50 0a 20 20 20 20 70 4e 65 77  _MREMAP.    pNew
26950 20 3d 20 6f 73 4d 72 65 6d 61 70 28 70 4f 72 69   = osMremap(pOri
26960 67 2c 20 6e 52 65 75 73 65 2c 20 6e 4e 65 77 2c  g, nReuse, nNew,
26970 20 4d 52 45 4d 41 50 5f 4d 41 59 4d 4f 56 45 29   MREMAP_MAYMOVE)
26980 3b 0a 20 20 20 20 7a 45 72 72 20 3d 20 22 6d 72  ;.    zErr = "mr
26990 65 6d 61 70 22 3b 0a 23 65 6c 73 65 0a 20 20 20  emap";.#else.   
269a0 20 70 4e 65 77 20 3d 20 6f 73 4d 6d 61 70 28 70   pNew = osMmap(p
269b0 52 65 71 2c 20 6e 4e 65 77 2d 6e 52 65 75 73 65  Req, nNew-nReuse
269c0 2c 20 66 6c 61 67 73 2c 20 4d 41 50 5f 53 48 41  , flags, MAP_SHA
269d0 52 45 44 2c 20 68 2c 20 6e 52 65 75 73 65 29 3b  RED, h, nReuse);
269e0 0a 20 20 20 20 69 66 28 20 70 4e 65 77 21 3d 4d  .    if( pNew!=M
269f0 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20  AP_FAILED ){.   
26a00 20 20 20 69 66 28 20 70 4e 65 77 21 3d 70 52 65     if( pNew!=pRe
26a10 71 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 73 4d  q ){.        osM
26a20 75 6e 6d 61 70 28 70 4e 65 77 2c 20 6e 4e 65 77  unmap(pNew, nNew
26a30 20 2d 20 6e 52 65 75 73 65 29 3b 0a 20 20 20 20   - nReuse);.    
26a40 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20      pNew = 0;.  
26a50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26a60 20 20 20 70 4e 65 77 20 3d 20 70 4f 72 69 67 3b     pNew = pOrig;
26a70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
26a80 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68  endif..    /* Th
26a90 65 20 61 74 74 65 6d 70 74 20 74 6f 20 65 78 74  e attempt to ext
26aa0 65 6e 64 20 74 68 65 20 65 78 69 73 74 69 6e 67  end the existing
26ab0 20 6d 61 70 70 69 6e 67 20 66 61 69 6c 65 64 2e   mapping failed.
26ac0 20 46 72 65 65 20 69 74 2e 20 2a 2f 0a 20 20 20   Free it. */.   
26ad0 20 69 66 28 20 70 4e 65 77 3d 3d 4d 41 50 5f 46   if( pNew==MAP_F
26ae0 41 49 4c 45 44 20 7c 7c 20 70 4e 65 77 3d 3d 30  AILED || pNew==0
26af0 20 29 7b 0a 20 20 20 20 20 20 6f 73 4d 75 6e 6d   ){.      osMunm
26b00 61 70 28 70 4f 72 69 67 2c 20 6e 52 65 75 73 65  ap(pOrig, nReuse
26b10 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
26b20 2f 2a 20 49 66 20 70 4e 65 77 20 69 73 20 73 74  /* If pNew is st
26b30 69 6c 6c 20 4e 55 4c 4c 2c 20 74 72 79 20 74 6f  ill NULL, try to
26b40 20 63 72 65 61 74 65 20 61 6e 20 65 6e 74 69 72   create an entir
26b50 65 6c 79 20 6e 65 77 20 6d 61 70 70 69 6e 67 2e  ely new mapping.
26b60 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   */.  if( pNew==
26b70 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20  0 ){.    pNew = 
26b80 6f 73 4d 6d 61 70 28 30 2c 20 6e 4e 65 77 2c 20  osMmap(0, nNew, 
26b90 66 6c 61 67 73 2c 20 4d 41 50 5f 53 48 41 52 45  flags, MAP_SHARE
26ba0 44 2c 20 68 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  D, h, 0);.  }.. 
26bb0 20 69 66 28 20 70 4e 65 77 3d 3d 4d 41 50 5f 46   if( pNew==MAP_F
26bc0 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 70 4e 65  AILED ){.    pNe
26bd0 77 20 3d 20 30 3b 0a 20 20 20 20 6e 4e 65 77 20  w = 0;.    nNew 
26be0 3d 20 30 3b 0a 20 20 20 20 75 6e 69 78 4c 6f 67  = 0;.    unixLog
26bf0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 4f 4b 2c  Error(SQLITE_OK,
26c00 20 7a 45 72 72 2c 20 70 46 64 2d 3e 7a 50 61 74   zErr, pFd->zPat
26c10 68 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  h);..    /* If t
26c20 68 65 20 6d 6d 61 70 28 29 20 61 62 6f 76 65 20  he mmap() above 
26c30 66 61 69 6c 65 64 2c 20 61 73 73 75 6d 65 20 74  failed, assume t
26c40 68 61 74 20 61 6c 6c 20 73 75 62 73 65 71 75 65  hat all subseque
26c50 6e 74 20 6d 6d 61 70 28 29 20 63 61 6c 6c 73 0a  nt mmap() calls.
26c60 20 20 20 20 2a 2a 20 77 69 6c 6c 20 70 72 6f 62      ** will prob
26c70 61 62 6c 79 20 66 61 69 6c 20 74 6f 6f 2e 20 46  ably fail too. F
26c80 61 6c 6c 20 62 61 63 6b 20 74 6f 20 75 73 69 6e  all back to usin
26c90 67 20 78 52 65 61 64 2f 78 57 72 69 74 65 20 65  g xRead/xWrite e
26ca0 78 63 6c 75 73 69 76 65 6c 79 0a 20 20 20 20 2a  xclusively.    *
26cb0 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  * in this case. 
26cc0 20 2a 2f 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61   */.    pFd->mma
26cd0 70 53 69 7a 65 4d 61 78 20 3d 20 30 3b 0a 20 20  pSizeMax = 0;.  
26ce0 7d 0a 20 20 70 46 64 2d 3e 70 4d 61 70 52 65 67  }.  pFd->pMapReg
26cf0 69 6f 6e 20 3d 20 28 76 6f 69 64 20 2a 29 70 4e  ion = (void *)pN
26d00 65 77 3b 0a 20 20 70 46 64 2d 3e 6d 6d 61 70 53  ew;.  pFd->mmapS
26d10 69 7a 65 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53  ize = pFd->mmapS
26d20 69 7a 65 41 63 74 75 61 6c 20 3d 20 6e 4e 65 77  izeActual = nNew
26d30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72  ;.}../*.** Memor
26d40 79 20 6d 61 70 20 6f 72 20 72 65 6d 61 70 20 74  y map or remap t
26d50 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 62  he file opened b
26d60 79 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f  y file-descripto
26d70 72 20 70 46 64 20 28 69 66 20 74 68 65 20 66 69  r pFd (if the fi
26d80 6c 65 0a 2a 2a 20 69 73 20 61 6c 72 65 61 64 79  le.** is already
26d90 20 6d 61 70 70 65 64 2c 20 74 68 65 20 65 78 69   mapped, the exi
26da0 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73  sting mapping is
26db0 20 72 65 70 6c 61 63 65 64 20 62 79 20 74 68 65   replaced by the
26dc0 20 6e 65 77 29 2e 20 4f 72 2c 20 69 66 20 0a 2a   new). Or, if .*
26dd0 2a 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 20  * there already 
26de0 65 78 69 73 74 73 20 61 20 6d 61 70 70 69 6e 67  exists a mapping
26df0 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20   for this file, 
26e00 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 73 74  and there are st
26e10 69 6c 6c 20 0a 2a 2a 20 6f 75 74 73 74 61 6e 64  ill .** outstand
26e20 69 6e 67 20 78 46 65 74 63 68 28 29 20 72 65 66  ing xFetch() ref
26e30 65 72 65 6e 63 65 73 20 74 6f 20 69 74 2c 20 74  erences to it, t
26e40 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
26e50 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
26e60 66 20 70 61 72 61 6d 65 74 65 72 20 6e 42 79 74  f parameter nByt
26e70 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  e is non-negativ
26e80 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  e, then it is th
26e90 65 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65  e requested size
26ea0 20 6f 66 20 0a 2a 2a 20 74 68 65 20 6d 61 70 70   of .** the mapp
26eb0 69 6e 67 20 74 6f 20 63 72 65 61 74 65 2e 20 4f  ing to create. O
26ec0 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 42 79  therwise, if nBy
26ed0 74 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  te is less than 
26ee0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 0a  zero, then the .
26ef0 2a 2a 20 72 65 71 75 65 73 74 65 64 20 73 69 7a  ** requested siz
26f00 65 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66  e is the size of
26f10 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
26f20 6b 2e 20 54 68 65 20 61 63 74 75 61 6c 20 73 69  k. The actual si
26f30 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 72 65  ze of the.** cre
26f40 61 74 65 64 20 6d 61 70 70 69 6e 67 20 69 73 20  ated mapping is 
26f50 65 69 74 68 65 72 20 74 68 65 20 72 65 71 75 65  either the reque
26f60 73 74 65 64 20 73 69 7a 65 20 6f 72 20 74 68 65  sted size or the
26f70 20 76 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65   value configure
26f80 64 20 0a 2a 2a 20 75 73 69 6e 67 20 53 51 4c 49  d .** using SQLI
26f90 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 4c 49  TE_FCNTL_MMAP_LI
26fa0 4d 49 54 2c 20 77 68 69 63 68 65 76 65 72 20 69  MIT, whichever i
26fb0 73 20 73 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a  s smaller..**.**
26fc0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
26fd0 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72  turned if no err
26fe0 6f 72 20 6f 63 63 75 72 73 20 28 65 76 65 6e 20  or occurs (even 
26ff0 69 66 20 74 68 65 20 6d 61 70 70 69 6e 67 20 69  if the mapping i
27000 73 20 6e 6f 74 0a 2a 2a 20 72 65 63 72 65 61 74  s not.** recreat
27010 65 64 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ed as a result o
27020 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  f outstanding re
27030 66 65 72 65 6e 63 65 73 29 20 6f 72 20 61 6e 20  ferences) or an 
27040 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20  SQLite error.** 
27050 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  code otherwise..
27060 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
27070 69 78 4d 61 70 66 69 6c 65 28 75 6e 69 78 46 69  ixMapfile(unixFi
27080 6c 65 20 2a 70 46 64 2c 20 69 36 34 20 6e 42 79  le *pFd, i64 nBy
27090 74 65 29 7b 0a 20 20 69 36 34 20 6e 4d 61 70 20  te){.  i64 nMap 
270a0 3d 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 72  = nByte;.  int r
270b0 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 4d  c;..  assert( nM
270c0 61 70 3e 3d 30 20 7c 7c 20 70 46 64 2d 3e 6e 46  ap>=0 || pFd->nF
270d0 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20  etchOut==0 );.  
270e0 69 66 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f  if( pFd->nFetchO
270f0 75 74 3e 30 20 29 20 72 65 74 75 72 6e 20 53 51  ut>0 ) return SQ
27100 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20  LITE_OK;..  if( 
27110 6e 4d 61 70 3c 30 20 29 7b 0a 20 20 20 20 73 74  nMap<0 ){.    st
27120 72 75 63 74 20 73 74 61 74 20 73 74 61 74 62 75  ruct stat statbu
27130 66 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  f;          /* L
27140 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e  ow-level file in
27150 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  formation */.   
27160 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28 70 46   rc = osFstat(pF
27170 64 2d 3e 68 2c 20 26 73 74 61 74 62 75 66 29 3b  d->h, &statbuf);
27180 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
27190 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
271a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
271b0 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d  ERR_FSTAT;.    }
271c0 0a 20 20 20 20 6e 4d 61 70 20 3d 20 73 74 61 74  .    nMap = stat
271d0 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 20 20 7d  buf.st_size;.  }
271e0 0a 20 20 69 66 28 20 6e 4d 61 70 3e 70 46 64 2d  .  if( nMap>pFd-
271f0 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29 7b 0a  >mmapSizeMax ){.
27200 20 20 20 20 6e 4d 61 70 20 3d 20 70 46 64 2d 3e      nMap = pFd->
27210 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 7d  mmapSizeMax;.  }
27220 0a 0a 20 20 69 66 28 20 6e 4d 61 70 21 3d 70 46  ..  if( nMap!=pF
27230 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  d->mmapSize ){. 
27240 20 20 20 69 66 28 20 6e 4d 61 70 3e 30 20 29 7b     if( nMap>0 ){
27250 0a 20 20 20 20 20 20 75 6e 69 78 52 65 6d 61 70  .      unixRemap
27260 66 69 6c 65 28 70 46 64 2c 20 6e 4d 61 70 29 3b  file(pFd, nMap);
27270 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
27280 20 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28    unixUnmapfile(
27290 70 46 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pFd);.    }.  }.
272a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
272b0 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
272c0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
272d0 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a  _SIZE>0 */../*.*
272e0 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 72  * If possible, r
272f0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
27300 74 6f 20 61 20 6d 61 70 70 69 6e 67 20 6f 66 20  to a mapping of 
27310 66 69 6c 65 20 66 64 20 73 74 61 72 74 69 6e 67  file fd starting
27320 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a 20 69 4f   at offset.** iO
27330 66 66 2e 20 54 68 65 20 6d 61 70 70 69 6e 67 20  ff. The mapping 
27340 6d 75 73 74 20 62 65 20 76 61 6c 69 64 20 66 6f  must be valid fo
27350 72 20 61 74 20 6c 65 61 73 74 20 6e 41 6d 74 20  r at least nAmt 
27360 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  bytes..**.** If 
27370 73 75 63 68 20 61 20 70 6f 69 6e 74 65 72 20 63  such a pointer c
27380 61 6e 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20  an be obtained, 
27390 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 70 70 20  store it in *pp 
273a0 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
273b0 45 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20  E_OK..** Or, if 
273c0 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 75 74 20 6e  one cannot but n
273d0 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
273e0 73 65 74 20 2a 70 70 20 74 6f 20 30 20 61 6e 64  set *pp to 0 and
273f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
27400 4b 2e 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69  K..** Finally, i
27410 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20  f an error does 
27420 6f 63 63 75 72 2c 20 72 65 74 75 72 6e 20 61 6e  occur, return an
27430 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
27440 64 65 2e 20 54 68 65 20 66 69 6e 61 6c 0a 2a 2a  de. The final.**
27450 20 76 61 6c 75 65 20 6f 66 20 2a 70 70 20 69 73   value of *pp is
27460 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68   undefined in th
27470 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  is case..**.** I
27480 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
27490 64 6f 65 73 20 72 65 74 75 72 6e 20 61 20 70 6f  does return a po
274a0 69 6e 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 65  inter, the calle
274b0 72 20 6d 75 73 74 20 65 76 65 6e 74 75 61 6c 6c  r must eventuall
274c0 79 20 0a 2a 2a 20 72 65 6c 65 61 73 65 20 74 68  y .** release th
274d0 65 20 72 65 66 65 72 65 6e 63 65 20 62 79 20 63  e reference by c
274e0 61 6c 6c 69 6e 67 20 75 6e 69 78 55 6e 66 65 74  alling unixUnfet
274f0 63 68 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ch()..*/.static 
27500 69 6e 74 20 75 6e 69 78 46 65 74 63 68 28 73 71  int unixFetch(sq
27510 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
27520 69 36 34 20 69 4f 66 66 2c 20 69 6e 74 20 6e 41  i64 iOff, int nA
27530 6d 74 2c 20 76 6f 69 64 20 2a 2a 70 70 29 7b 0a  mt, void **pp){.
27540 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
27550 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69  MAP_SIZE>0.  uni
27560 78 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e  xFile *pFd = (un
27570 69 78 46 69 6c 65 20 2a 29 66 64 3b 20 20 20 2f  ixFile *)fd;   /
27580 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
27590 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
275a0 2f 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 20 3d  /.#endif.  *pp =
275b0 20 30 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f   0;..#if SQLITE_
275c0 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
275d0 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53    if( pFd->mmapS
275e0 69 7a 65 4d 61 78 3e 30 20 29 7b 0a 20 20 20 20  izeMax>0 ){.    
275f0 69 66 28 20 70 46 64 2d 3e 70 4d 61 70 52 65 67  if( pFd->pMapReg
27600 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ion==0 ){.      
27610 69 6e 74 20 72 63 20 3d 20 75 6e 69 78 4d 61 70  int rc = unixMap
27620 66 69 6c 65 28 70 46 64 2c 20 2d 31 29 3b 0a 20  file(pFd, -1);. 
27630 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
27640 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
27650 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
27660 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20  ( pFd->mmapSize 
27670 3e 3d 20 69 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a  >= iOff+nAmt ){.
27680 20 20 20 20 20 20 2a 70 70 20 3d 20 26 28 28 75        *pp = &((u
27690 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67  8 *)pFd->pMapReg
276a0 69 6f 6e 29 5b 69 4f 66 66 5d 3b 0a 20 20 20 20  ion)[iOff];.    
276b0 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74    pFd->nFetchOut
276c0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ++;.    }.  }.#e
276d0 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51  ndif.  return SQ
276e0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
276f0 2a 20 49 66 20 74 68 65 20 74 68 69 72 64 20 61  * If the third a
27700 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 4e  rgument is non-N
27710 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66  ULL, then this f
27720 75 6e 63 74 69 6f 6e 20 72 65 6c 65 61 73 65 73  unction releases
27730 20 61 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65   a .** reference
27740 20 6f 62 74 61 69 6e 65 64 20 62 79 20 61 6e 20   obtained by an 
27750 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20  earlier call to 
27760 75 6e 69 78 46 65 74 63 68 28 29 2e 20 54 68 65  unixFetch(). The
27770 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d   second.** argum
27780 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  ent passed to th
27790 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  is function must
277a0 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20   be the same as 
277b0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
277c0 67 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 68  g.** argument th
277d0 61 74 20 77 61 73 20 70 61 73 73 65 64 20 74 6f  at was passed to
277e0 20 74 68 65 20 75 6e 69 78 46 65 74 63 68 28 29   the unixFetch()
277f0 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20 0a 2a 2a   invocation. .**
27800 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 74  .** Or, if the t
27810 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73  hird argument is
27820 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73   NULL, then this
27830 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69   function is bei
27840 6e 67 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 74 6f  ng called .** to
27850 20 69 6e 66 6f 72 6d 20 74 68 65 20 56 46 53 20   inform the VFS 
27860 6c 61 79 65 72 20 74 68 61 74 2c 20 61 63 63 6f  layer that, acco
27870 72 64 69 6e 67 20 74 6f 20 50 4f 53 49 58 2c 20  rding to POSIX, 
27880 61 6e 79 20 65 78 69 73 74 69 6e 67 20 6d 61 70  any existing map
27890 70 69 6e 67 20 0a 2a 2a 20 6d 61 79 20 6e 6f 77  ping .** may now
278a0 20 62 65 20 69 6e 76 61 6c 69 64 20 61 6e 64 20   be invalid and 
278b0 73 68 6f 75 6c 64 20 62 65 20 75 6e 6d 61 70 70  should be unmapp
278c0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
278d0 74 20 75 6e 69 78 55 6e 66 65 74 63 68 28 73 71  t unixUnfetch(sq
278e0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
278f0 69 36 34 20 69 4f 66 66 2c 20 76 6f 69 64 20 2a  i64 iOff, void *
27900 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  p){.#if SQLITE_M
27910 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
27920 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 20 3d   unixFile *pFd =
27930 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 66 64 3b   (unixFile *)fd;
27940 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
27950 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
27960 6c 65 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50  le */.  UNUSED_P
27970 41 52 41 4d 45 54 45 52 28 69 4f 66 66 29 3b 0a  ARAMETER(iOff);.
27980 0a 20 20 2f 2a 20 49 66 20 70 3d 3d 30 20 28 75  .  /* If p==0 (u
27990 6e 6d 61 70 20 74 68 65 20 65 6e 74 69 72 65 20  nmap the entire 
279a0 66 69 6c 65 29 20 74 68 65 6e 20 74 68 65 72 65  file) then there
279b0 20 6d 75 73 74 20 62 65 20 6e 6f 20 6f 75 74 73   must be no outs
279c0 74 61 6e 64 69 6e 67 20 0a 20 20 2a 2a 20 78 46  tanding .  ** xF
279d0 65 74 63 68 20 72 65 66 65 72 65 6e 63 65 73 2e  etch references.
279e0 20 4f 72 2c 20 69 66 20 70 21 3d 30 20 28 6d 65   Or, if p!=0 (me
279f0 61 6e 69 6e 67 20 69 74 20 69 73 20 61 6e 20 78  aning it is an x
27a00 46 65 74 63 68 20 72 65 66 65 72 65 6e 63 65 29  Fetch reference)
27a10 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72  ,.  ** then ther
27a20 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  e must be at lea
27a30 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69  st one outstandi
27a40 6e 67 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ng.  */.  assert
27a50 28 20 28 70 3d 3d 30 29 3d 3d 28 70 46 64 2d 3e  ( (p==0)==(pFd->
27a60 6e 46 65 74 63 68 4f 75 74 3d 3d 30 29 20 29 3b  nFetchOut==0) );
27a70 0a 0a 20 20 2f 2a 20 49 66 20 70 21 3d 30 2c 20  ..  /* If p!=0, 
27a80 69 74 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68  it must match th
27a90 65 20 69 4f 66 66 20 76 61 6c 75 65 2e 20 2a 2f  e iOff value. */
27aa0 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
27ab0 7c 7c 20 70 3d 3d 26 28 28 75 38 20 2a 29 70 46  || p==&((u8 *)pF
27ac0 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69  d->pMapRegion)[i
27ad0 4f 66 66 5d 20 29 3b 0a 0a 20 20 69 66 28 20 70  Off] );..  if( p
27ae0 20 29 7b 0a 20 20 20 20 70 46 64 2d 3e 6e 46 65   ){.    pFd->nFe
27af0 74 63 68 4f 75 74 2d 2d 3b 0a 20 20 7d 65 6c 73  tchOut--;.  }els
27b00 65 7b 0a 20 20 20 20 75 6e 69 78 55 6e 6d 61 70  e{.    unixUnmap
27b10 66 69 6c 65 28 70 46 64 29 3b 0a 20 20 7d 0a 0a  file(pFd);.  }..
27b20 20 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e    assert( pFd->n
27b30 46 65 74 63 68 4f 75 74 3e 3d 30 20 29 3b 0a 23  FetchOut>=0 );.#
27b40 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41  else.  UNUSED_PA
27b50 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 55  RAMETER(fd);.  U
27b60 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
27b70 70 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  p);.  UNUSED_PAR
27b80 41 4d 45 54 45 52 28 69 4f 66 66 29 3b 0a 23 65  AMETER(iOff);.#e
27b90 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51  ndif.  return SQ
27ba0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
27bb0 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68 65 20  * Here ends the 
27bc0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
27bd0 66 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69  f all sqlite3_fi
27be0 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a  le methods..**.*
27bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27c00 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65  ***** End sqlite
27c10 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a  3_file Methods *
27c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
27c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
27c90 2f 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73  /*.** This divis
27ca0 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 64 65 66  ion contains def
27cb0 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69  initions of sqli
27cc0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
27cd0 62 6a 65 63 74 73 20 74 68 61 74 0a 2a 2a 20 69  bjects that.** i
27ce0 6d 70 6c 65 6d 65 6e 74 20 76 61 72 69 6f 75 73  mplement various
27cf0 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74   file locking st
27d00 72 61 74 65 67 69 65 73 2e 20 20 49 74 20 61 6c  rategies.  It al
27d10 73 6f 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69  so contains defi
27d20 6e 69 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66  nitions.** of "f
27d30 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
27d40 2e 20 20 41 20 66 69 6e 64 65 72 2d 66 75 6e 63  .  A finder-func
27d50 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
27d60 6c 6f 63 61 74 65 20 74 68 65 20 61 70 70 72 6f  locate the appro
27d70 70 72 69 61 74 65 0a 2a 2a 20 73 71 6c 69 74 65  priate.** sqlite
27d80 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
27d90 65 63 74 20 66 6f 72 20 61 20 70 61 72 74 69 63  ect for a partic
27da0 75 6c 61 72 20 64 61 74 61 62 61 73 65 20 66 69  ular database fi
27db0 6c 65 2e 20 20 54 68 65 20 70 41 70 70 44 61 74  le.  The pAppDat
27dc0 61 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68  a.** field of th
27dd0 65 20 73 71 6c 69 74 65 33 5f 76 66 73 20 56 46  e sqlite3_vfs VF
27de0 53 20 6f 62 6a 65 63 74 73 20 61 72 65 20 69 6e  S objects are in
27df0 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 62 65 20  itialized to be 
27e00 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 74  pointers to.** t
27e10 68 65 20 63 6f 72 72 65 63 74 20 66 69 6e 64 65  he correct finde
27e20 72 2d 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74  r-function for t
27e30 68 61 74 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d  hat VFS..**.** M
27e40 6f 73 74 20 66 69 6e 64 65 72 20 66 75 6e 63 74  ost finder funct
27e50 69 6f 6e 73 20 72 65 74 75 72 6e 20 61 20 70 6f  ions return a po
27e60 69 6e 74 65 72 20 74 6f 20 61 20 66 69 78 65 64  inter to a fixed
27e70 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
27e80 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 20  ods.** object.  
27e90 54 68 65 20 6f 6e 6c 79 20 69 6e 74 65 72 65 73  The only interes
27ea0 74 69 6e 67 20 66 69 6e 64 65 72 2d 66 75 6e 63  ting finder-func
27eb0 74 69 6f 6e 20 69 73 20 61 75 74 6f 6c 6f 63 6b  tion is autolock
27ec0 49 6f 46 69 6e 64 65 72 2c 20 77 68 69 63 68 0a  IoFinder, which.
27ed0 2a 2a 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20  ** looks at the 
27ee0 66 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20  filesystem type 
27ef0 61 6e 64 20 74 72 69 65 73 20 74 6f 20 67 75 65  and tries to gue
27f00 73 73 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b  ss the best lock
27f10 69 6e 67 0a 2a 2a 20 73 74 72 61 74 65 67 79 20  ing.** strategy 
27f20 66 72 6f 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a  from that..**.**
27f30 20 46 6f 72 20 66 69 6e 64 65 72 2d 66 75 6e 63   For finder-func
27f40 74 69 6f 6e 20 46 2c 20 74 77 6f 20 6f 62 6a 65  tion F, two obje
27f50 63 74 73 20 61 72 65 20 63 72 65 61 74 65 64 3a  cts are created:
27f60 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 54 68  .**.**    (1) Th
27f70 65 20 72 65 61 6c 20 66 69 6e 64 65 72 2d 66 75  e real finder-fu
27f80 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 46 49  nction named "FI
27f90 6d 70 74 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20  mpt()"..**.**   
27fa0 20 28 32 29 20 41 20 63 6f 6e 73 74 61 6e 74 20   (2) A constant 
27fb0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20  pointer to this 
27fc0 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 6a  function named j
27fd0 75 73 74 20 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a  ust "F"..**.**.*
27fe0 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * A pointer to t
27ff0 68 65 20 46 20 70 6f 69 6e 74 65 72 20 69 73 20  he F pointer is 
28000 75 73 65 64 20 61 73 20 74 68 65 20 70 41 70 70  used as the pApp
28010 44 61 74 61 20 76 61 6c 75 65 20 66 6f 72 20 56  Data value for V
28020 46 53 0a 2a 2a 20 6f 62 6a 65 63 74 73 2e 20 20  FS.** objects.  
28030 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20 74 68  We have to do th
28040 69 73 20 69 6e 73 74 65 61 64 20 6f 66 20 6c 65  is instead of le
28050 74 74 69 6e 67 20 70 41 70 70 44 61 74 61 20 70  tting pAppData p
28060 6f 69 6e 74 0a 2a 2a 20 64 69 72 65 63 74 6c 79  oint.** directly
28070 20 61 74 20 74 68 65 20 66 69 6e 64 65 72 2d 66   at the finder-f
28080 75 6e 63 74 69 6f 6e 20 73 69 6e 63 65 20 43 39  unction since C9
28090 30 20 72 75 6c 65 73 20 70 72 65 76 65 6e 74 20  0 rules prevent 
280a0 61 20 76 6f 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20  a void*.** from 
280b0 62 65 20 63 61 73 74 20 69 6e 74 6f 20 61 20 66  be cast into a f
280c0 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e  unction pointer.
280d0 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 69  .**.**.** Each i
280e0 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
280f0 6d 61 63 72 6f 20 67 65 6e 65 72 61 74 65 73 20  macro generates 
28100 74 77 6f 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a  two objects:.**.
28110 2a 2a 20 20 20 2a 20 20 41 20 63 6f 6e 73 74 61  **   *  A consta
28120 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  nt sqlite3_io_me
28130 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 63 61 6c  thods object cal
28140 6c 20 4d 45 54 48 4f 44 20 74 68 61 74 20 68 61  l METHOD that ha
28150 73 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20  s locking.**    
28160 20 20 6d 65 74 68 6f 64 73 20 43 4c 4f 53 45 2c    methods CLOSE,
28170 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43   LOCK, UNLOCK, C
28180 4b 52 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  KRESLOCK..**.** 
28190 20 20 2a 20 20 41 6e 20 49 2f 4f 20 6d 65 74 68    *  An I/O meth
281a0 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69  od finder functi
281b0 6f 6e 20 63 61 6c 6c 65 64 20 46 49 4e 44 45 52  on called FINDER
281c0 20 74 68 61 74 20 72 65 74 75 72 6e 73 20 61 20   that returns a 
281d0 70 6f 69 6e 74 65 72 0a 2a 2a 20 20 20 20 20 20  pointer.**      
281e0 74 6f 20 74 68 65 20 4d 45 54 48 4f 44 20 6f 62  to the METHOD ob
281f0 6a 65 63 74 20 69 6e 20 74 68 65 20 70 72 65 76  ject in the prev
28200 69 6f 75 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a  ious bullet..*/.
28210 23 64 65 66 69 6e 65 20 49 4f 4d 45 54 48 4f 44  #define IOMETHOD
28220 53 28 46 49 4e 44 45 52 2c 4d 45 54 48 4f 44 2c  S(FINDER,METHOD,
28230 56 45 52 53 49 4f 4e 2c 43 4c 4f 53 45 2c 4c 4f  VERSION,CLOSE,LO
28240 43 4b 2c 55 4e 4c 4f 43 4b 2c 43 4b 4c 4f 43 4b  CK,UNLOCK,CKLOCK
28250 2c 53 48 4d 4d 41 50 29 20 20 20 20 20 5c 0a 73  ,SHMMAP)     \.s
28260 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
28270 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 4d  te3_io_methods M
28280 45 54 48 4f 44 20 3d 20 7b 20 20 20 20 20 20 20  ETHOD = {       
28290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
282a0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
282b0 20 56 45 52 53 49 4f 4e 2c 20 20 20 20 20 20 20   VERSION,       
282c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
282d0 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20  iVersion */     
282e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
282f0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
28300 43 4c 4f 53 45 2c 20 20 20 20 20 20 20 20 20 20  CLOSE,          
28310 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
28320 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20  Close */        
28330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28340 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
28350 6e 69 78 52 65 61 64 2c 20 20 20 20 20 20 20 20  nixRead,        
28360 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
28370 65 61 64 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ead */          
28380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28390 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
283a0 69 78 57 72 69 74 65 2c 20 20 20 20 20 20 20 20  ixWrite,        
283b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72            /* xWr
283c0 69 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ite */          
283d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283e0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
283f0 78 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20  xTruncate,      
28400 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75           /* xTru
28410 6e 63 61 74 65 20 2a 2f 20 20 20 20 20 20 20 20  ncate */        
28420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28430 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
28440 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Sync,           
28450 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63          /* xSync
28460 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
28470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28480 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46        \.   unixF
28490 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20  ileSize,        
284a0 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53         /* xFileS
284b0 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ize */          
284c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284d0 20 20 20 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20       \.   LOCK, 
284e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284f0 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a        /* xLock *
28500 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
28510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28520 20 20 20 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c      \.   UNLOCK,
28530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28540 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
28550 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
28560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28570 20 20 20 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20     \.   CKLOCK, 
28580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28590 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
285a0 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 20 20 20 20  ervedLock */    
285b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285c0 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 43    \.   unixFileC
285d0 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20  ontrol,         
285e0 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72     /* xFileContr
285f0 6f 6c 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ol */           
28600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28610 20 5c 0a 20 20 20 75 6e 69 78 53 65 63 74 6f 72   \.   unixSector
28620 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
28630 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65    /* xSectorSize
28640 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
28650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28660 5c 0a 20 20 20 75 6e 69 78 44 65 76 69 63 65 43  \.   unixDeviceC
28670 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2c 20  haracteristics, 
28680 20 2f 2a 20 78 44 65 76 69 63 65 43 61 70 61 62   /* xDeviceCapab
28690 69 6c 69 74 69 65 73 20 2a 2f 20 20 20 20 20 20  ilities */      
286a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
286b0 0a 20 20 20 53 48 4d 4d 41 50 2c 20 20 20 20 20  .   SHMMAP,     
286c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286d0 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 20 20 20  /* xShmMap */   
286e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
28700 20 20 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20     unixShmLock, 
28710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28720 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 20 20 20  * xShmLock */   
28730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28740 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
28750 20 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72    unixShmBarrier
28760 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
28770 20 78 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 20   xShmBarrier */ 
28780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28790 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
287a0 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 2c 20 20   unixShmUnmap,  
287b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
287c0 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 20 20 20 20  xShmUnmap */    
287d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287e0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
287f0 75 6e 69 78 46 65 74 63 68 2c 20 20 20 20 20 20  unixFetch,      
28800 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
28810 46 65 74 63 68 20 2a 2f 20 20 20 20 20 20 20 20  Fetch */        
28820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28830 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
28840 6e 69 78 55 6e 66 65 74 63 68 2c 20 20 20 20 20  nixUnfetch,     
28850 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
28860 6e 66 65 74 63 68 20 2a 2f 20 20 20 20 20 20 20  nfetch */       
28870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28880 20 20 20 20 20 20 20 20 20 5c 0a 7d 3b 20 20 20           \.};   
28890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 20 20                  
288c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288d0 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63          \.static
288e0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
288f0 6f 5f 6d 65 74 68 6f 64 73 20 2a 46 49 4e 44 45  o_methods *FINDE
28900 52 23 23 49 6d 70 6c 28 63 6f 6e 73 74 20 63 68  R##Impl(const ch
28910 61 72 20 2a 7a 2c 20 75 6e 69 78 46 69 6c 65 20  ar *z, unixFile 
28920 2a 70 29 7b 20 20 20 5c 0a 20 20 55 4e 55 53 45  *p){   \.  UNUSE
28930 44 5f 50 41 52 41 4d 45 54 45 52 28 7a 29 3b 20  D_PARAMETER(z); 
28940 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
28950 28 70 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  (p);            
28960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28970 20 20 20 20 20 20 5c 0a 20 20 72 65 74 75 72 6e        \.  return
28980 20 26 4d 45 54 48 4f 44 3b 20 20 20 20 20 20 20   &METHOD;       
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 20 20 20 20 20                  
289b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289c0 20 20 20 20 20 5c 0a 7d 20 20 20 20 20 20 20 20       \.}        
289d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 20 20 20 20 20 20                  
28a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a10 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e      \.static con
28a20 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
28a30 74 68 6f 64 73 20 2a 28 2a 63 6f 6e 73 74 20 46  thods *(*const F
28a40 49 4e 44 45 52 29 28 63 6f 6e 73 74 20 63 68 61  INDER)(const cha
28a50 72 2a 2c 75 6e 69 78 46 69 6c 65 20 2a 70 29 20  r*,unixFile *p) 
28a60 20 20 20 5c 0a 20 20 20 20 3d 20 46 49 4e 44 45     \.    = FINDE
28a70 52 23 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20  R##Impl;../*.** 
28a80 48 65 72 65 20 61 72 65 20 61 6c 6c 20 6f 66 20  Here are all of 
28a90 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  the sqlite3_io_m
28aa0 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 66  ethods objects f
28ab0 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a  or each of the.*
28ac0 2a 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65  * locking strate
28ad0 67 69 65 73 2e 20 20 46 75 6e 63 74 69 6f 6e 73  gies.  Functions
28ae0 20 74 68 61 74 20 72 65 74 75 72 6e 20 70 6f 69   that return poi
28af0 6e 74 65 72 73 20 74 6f 20 74 68 65 73 65 20 6d  nters to these m
28b00 65 74 68 6f 64 73 0a 2a 2a 20 61 72 65 20 61 6c  ethods.** are al
28b10 73 6f 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 49  so created..*/.I
28b20 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 6f 73 69  OMETHODS(.  posi
28b30 78 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  xIoFinder,      
28b40 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
28b50 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
28b60 0a 20 20 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64  .  posixIoMethod
28b70 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
28b80 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
28b90 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
28ba0 2f 0a 20 20 33 2c 20 20 20 20 20 20 20 20 20 20  /.  3,          
28bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28bc0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61   shared memory a
28bd0 6e 64 20 6d 6d 61 70 20 61 72 65 20 65 6e 61 62  nd mmap are enab
28be0 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f  led */.  unixClo
28bf0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
28c00 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
28c10 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63  hod */.  unixLoc
28c20 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
28c30 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
28c40 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 55 6e 6c 6f  od */.  unixUnlo
28c50 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
28c60 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
28c70 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65  hod */.  unixChe
28c80 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20  ckReservedLock, 
28c90 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
28ca0 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
28cb0 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4d 61 70 20  */.  unixShmMap 
28cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28cd0 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64  * xShmMap method
28ce0 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28   */.).IOMETHODS(
28cf0 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65  .  nolockIoFinde
28d00 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r,           /* 
28d10 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
28d20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  name */.  nolock
28d30 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
28d40 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
28d50 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
28d60 20 6e 61 6d 65 20 2a 2f 0a 20 20 33 2c 20 20 20   name */.  3,   
28d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d80 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
28d90 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
28da0 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 6c 6f  d */.  nolockClo
28db0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
28dc0 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
28dd0 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f 63  d */.  nolockLoc
28de0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
28df0 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
28e00 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f   */.  nolockUnlo
28e10 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
28e20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
28e30 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 68 65  d */.  nolockChe
28e40 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20  ckReservedLock, 
28e50 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
28e60 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
28e70 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20  .  0            
28e80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28e90 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a  xShmMap method *
28ea0 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  /.).IOMETHODS(. 
28eb0 20 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72   dotlockIoFinder
28ec0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ,          /* Fi
28ed0 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
28ee0 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 49  me */.  dotlockI
28ef0 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
28f00 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
28f10 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
28f20 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20  ame */.  1,     
28f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f40 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
28f50 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20  ory is disabled 
28f60 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73  */.  dotlockClos
28f70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
28f80 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
28f90 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b  */.  dotlockLock
28fa0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
28fb0 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
28fc0 2f 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63  /.  dotlockUnloc
28fd0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  k,            /*
28fe0 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
28ff0 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 68 65 63  */.  dotlockChec
29000 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 2f  kReservedLock, /
29010 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
29020 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
29030 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
29040 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
29050 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a  hmMap method */.
29060 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  )..#if SQLITE_EN
29070 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
29080 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  LE.IOMETHODS(.  
29090 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20  flockIoFinder,  
290a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
290b0 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
290c0 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f 4d 65  e */.  flockIoMe
290d0 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
290e0 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
290f0 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
29100 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
29110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29120 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
29130 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
29140 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f 73 65 2c 20  /.  flockClose, 
29150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29160 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
29170 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20 20  /.  flockLock,  
29180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29190 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
291a0 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20  .  flockUnlock, 
291b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
291c0 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
291d0 2f 0a 20 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65  /.  flockCheckRe
291e0 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 2f 2a  servedLock,   /*
291f0 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
29200 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
29210 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
29220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
29230 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  mMap method */.)
29240 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 4f 53 5f  .#endif..#if OS_
29250 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44  VXWORKS.IOMETHOD
29260 53 28 0a 20 20 73 65 6d 49 6f 46 69 6e 64 65 72  S(.  semIoFinder
29270 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
29280 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
29290 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65 6d 49  n name */.  semI
292a0 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
292b0 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
292c0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
292d0 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20  ct name */.  1, 
292e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
292f0 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
29300 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62   memory is disab
29310 6c 65 64 20 2a 2f 0a 20 20 73 65 6d 58 43 6c 6f  led */.  semXClo
29320 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
29330 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
29340 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 58 4c 6f 63  hod */.  semXLoc
29350 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
29360 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
29370 6f 64 20 2a 2f 0a 20 20 73 65 6d 58 55 6e 6c 6f  od */.  semXUnlo
29380 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
29390 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
293a0 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 58 43 68 65  hod */.  semXChe
293b0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20  ckReservedLock, 
293c0 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
293d0 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
293e0 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20  */.  0          
293f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29400 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64  * xShmMap method
29410 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69   */.).#endif..#i
29420 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
29430 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
29440 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
29450 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  YLE.IOMETHODS(. 
29460 20 61 66 70 49 6f 46 69 6e 64 65 72 2c 20 20 20   afpIoFinder,   
29470 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
29480 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
29490 6d 65 20 2a 2f 0a 20 20 61 66 70 49 6f 4d 65 74  me */.  afpIoMet
294a0 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20  hods,           
294b0 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
294c0 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
294d0 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20  ame */.  1,     
294e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
294f0 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
29500 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20  ory is disabled 
29510 2a 2f 0a 20 20 61 66 70 43 6c 6f 73 65 2c 20 20  */.  afpClose,  
29520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29530 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
29540 2a 2f 0a 20 20 61 66 70 4c 6f 63 6b 2c 20 20 20  */.  afpLock,   
29550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29560 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
29570 2f 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 2c 20 20  /.  afpUnlock,  
29580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29590 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
295a0 2a 2f 0a 20 20 61 66 70 43 68 65 63 6b 52 65 73  */.  afpCheckRes
295b0 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 2f  ervedLock,     /
295c0 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
295d0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
295e0 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
295f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
29600 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a  hmMap method */.
29610 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
29620 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  The proxy lockin
29630 67 20 6d 65 74 68 6f 64 20 69 73 20 61 20 22 73  g method is a "s
29640 75 70 65 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20  uper-method" in 
29650 74 68 65 20 73 65 6e 73 65 20 74 68 61 74 20 69  the sense that i
29660 74 0a 2a 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e  t.** opens secon
29670 64 61 72 79 20 66 69 6c 65 20 64 65 73 63 72 69  dary file descri
29680 70 74 6f 72 73 20 66 6f 72 20 74 68 65 20 63 6f  ptors for the co
29690 6e 63 68 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c  nch and lock fil
296a0 65 73 20 61 6e 64 0a 2a 2a 20 69 74 20 75 73 65  es and.** it use
296b0 73 20 70 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c  s proxy, dot-fil
296c0 65 2c 20 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63  e, AFP, and floc
296d0 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  k() locking meth
296e0 6f 64 73 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20  ods on those.** 
296f0 73 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 73 2e  secondary files.
29700 20 20 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f    For this reaso
29710 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20  n, the division 
29720 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0a  that implements.
29730 2a 2a 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ** proxy locking
29740 20 69 73 20 6c 6f 63 61 74 65 64 20 6d 75 63 68   is located much
29750 20 66 75 72 74 68 65 72 20 64 6f 77 6e 20 69 6e   further down in
29760 20 74 68 65 20 66 69 6c 65 2e 20 20 42 75 74 20   the file.  But 
29770 77 65 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 67 6f  we need.** to go
29780 20 61 68 65 61 64 20 61 6e 64 20 64 65 66 69 6e   ahead and defin
29790 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f  e the sqlite3_io
297a0 5f 6d 65 74 68 6f 64 73 20 61 6e 64 20 66 69 6e  _methods and fin
297b0 64 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  der function.** 
297c0 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  for proxy lockin
297d0 67 20 68 65 72 65 2e 20 20 53 6f 20 77 65 20 66  g here.  So we f
297e0 6f 72 77 61 72 64 20 64 65 63 6c 61 72 65 20 74  orward declare t
297f0 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a  he I/O methods..
29800 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  */.#if defined(_
29810 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
29820 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
29830 4e 47 5f 53 54 59 4c 45 0a 73 74 61 74 69 63 20  NG_STYLE.static 
29840 69 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65 28 73  int proxyClose(s
29850 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73  qlite3_file*);.s
29860 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c  tatic int proxyL
29870 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
29880 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20  *, int);.static 
29890 69 6e 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28  int proxyUnlock(
298a0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69  sqlite3_file*, i
298b0 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  nt);.static int 
298c0 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76  proxyCheckReserv
298d0 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
298e0 69 6c 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d  ile*, int*);.IOM
298f0 45 54 48 4f 44 53 28 0a 20 20 70 72 6f 78 79 49  ETHODS(.  proxyI
29900 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
29910 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
29920 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
29930 20 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c   proxyIoMethods,
29940 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
29950 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
29960 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
29970 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
29980 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
29990 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
299a0 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 70 72  disabled */.  pr
299b0 6f 78 79 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  oxyClose,       
299c0 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
299d0 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72  e method */.  pr
299e0 6f 78 79 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  oxyLock,        
299f0 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
29a00 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f   method */.  pro
29a10 78 79 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  xyUnlock,       
29a20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
29a30 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72  k method */.  pr
29a40 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64  oxyCheckReserved
29a50 4c 6f 63 6b 2c 20 20 20 2f 2a 20 78 43 68 65 63  Lock,   /* xChec
29a60 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
29a70 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20  thod */.  0     
29a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a90 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d      /* xShmMap m
29aa0 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69  ethod */.).#endi
29ab0 66 0a 0a 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64 20  f../* nfs lockd 
29ac0 6f 6e 20 4f 53 58 20 31 30 2e 33 2b 20 64 6f 65  on OSX 10.3+ doe
29ad0 73 6e 27 74 20 63 6c 65 61 72 20 77 72 69 74 65  sn't clear write
29ae0 20 6c 6f 63 6b 73 20 77 68 65 6e 20 61 20 72 65   locks when a re
29af0 61 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 20 2a  ad lock is set *
29b00 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  /.#if defined(__
29b10 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
29b20 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
29b30 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44  G_STYLE.IOMETHOD
29b40 53 28 0a 20 20 6e 66 73 49 6f 46 69 6e 64 65 72  S(.  nfsIoFinder
29b50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29b60 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
29b70 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66 73  on name */.  nfs
29b80 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
29b90 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
29ba0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
29bb0 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
29bc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29bd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
29be0 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69  red memory is di
29bf0 73 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78  sabled */.  unix
29c00 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
29c10 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
29c20 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69   method */.  uni
29c30 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  xLock,          
29c40 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
29c50 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 66 73   method */.  nfs
29c60 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
29c70 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
29c80 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75  ck method */.  u
29c90 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  nixCheckReserved
29ca0 4c 6f 63 6b 2c 20 20 20 20 20 2f 2a 20 78 43 68  Lock,     /* xCh
29cb0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
29cc0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20  method */.  0   
29cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ce0 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61         /* xShmMa
29cf0 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65  p method */.).#e
29d00 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65  ndif..#if define
29d10 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
29d20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
29d30 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a  CKING_STYLE./* .
29d40 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72 22  ** This "finder"
29d50 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70   function attemp
29d60 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ts to determine 
29d70 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67  the best locking
29d80 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f   strategy .** fo
29d90 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  r the database f
29da0 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22 2e 20  ile "filePath". 
29db0 20 49 74 20 74 68 65 6e 20 72 65 74 75 72 6e 73   It then returns
29dc0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f   the sqlite3_io_
29dd0 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63  methods.** objec
29de0 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  t that implement
29df0 73 20 74 68 61 74 20 73 74 72 61 74 65 67 79 2e  s that strategy.
29e00 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 66  .**.** This is f
29e10 6f 72 20 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a  or MacOSX only..
29e20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
29e30 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
29e40 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  ds *autolockIoFi
29e50 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73  nderImpl(.  cons
29e60 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68  t char *filePath
29e70 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20  ,    /* name of 
29e80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
29e90 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20  e */.  unixFile 
29ea0 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20 20 20  *pNew           
29eb0 2f 2a 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a  /* open file obj
29ec0 65 63 74 20 66 6f 72 20 74 68 65 20 64 61 74 61  ect for the data
29ed0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a  base file */.){.
29ee0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
29ef0 74 72 75 63 74 20 4d 61 70 70 69 6e 67 20 7b 0a  truct Mapping {.
29f00 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
29f10 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 20 20 20  zFilesystem;    
29f20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
29f30 65 73 79 73 74 65 6d 20 74 79 70 65 20 6e 61 6d  esystem type nam
29f40 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 73  e */.    const s
29f50 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
29f60 73 20 2a 70 4d 65 74 68 6f 64 73 3b 20 20 20 2f  s *pMethods;   /
29f70 2a 20 41 70 70 72 6f 70 72 69 61 74 65 20 6c 6f  * Appropriate lo
29f80 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 2a 2f 0a  cking method */.
29f90 20 20 7d 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20    } aMap[] = {. 
29fa0 20 20 20 7b 20 22 68 66 73 22 2c 20 20 20 20 26     { "hfs",    &
29fb0 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d  posixIoMethods }
29fc0 2c 0a 20 20 20 20 7b 20 22 75 66 73 22 2c 20 20  ,.    { "ufs",  
29fd0 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64    &posixIoMethod
29fe0 73 20 7d 2c 0a 20 20 20 20 7b 20 22 61 66 70 66  s },.    { "afpf
29ff0 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f  s",  &afpIoMetho
2a000 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 62  ds },.    { "smb
2a010 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68  fs",  &afpIoMeth
2a020 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 77 65  ods },.    { "we
2a030 62 64 61 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f  bdav", &nolockIo
2a040 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b  Methods },.    {
2a050 20 30 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20 20 69   0, 0 }.  };.  i
2a060 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73  nt i;.  struct s
2a070 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20  tatfs fsInfo;.  
2a080 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63  struct flock loc
2a090 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66  kInfo;..  if( !f
2a0a0 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f  ilePath ){.    /
2a0b0 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e  * If filePath==N
2a0c0 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77  ULL that means w
2a0d0 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
2a0e0 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66  th a transient f
2a0f0 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ile.    ** that 
2a100 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
2a110 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20   be locked. */. 
2a120 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63     return &noloc
2a130 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a  kIoMethods;.  }.
2a140 20 20 69 66 28 20 73 74 61 74 66 73 28 66 69 6c    if( statfs(fil
2a150 65 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20  ePath, &fsInfo) 
2a160 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 69 66 28  != -1 ){.    if(
2a170 20 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20   fsInfo.f_flags 
2a180 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a  & MNT_RDONLY ){.
2a190 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f        return &no
2a1a0 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
2a1b0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
2a1c0 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73  ; aMap[i].zFiles
2a1d0 79 73 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  ystem; i++){.   
2a1e0 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 66 73     if( strcmp(fs
2a1f0 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d  Info.f_fstypenam
2a200 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65  e, aMap[i].zFile
2a210 73 79 73 74 65 6d 29 3d 3d 30 20 29 7b 0a 20 20  system)==0 ){.  
2a220 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 4d 61        return aMa
2a230 70 5b 69 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a 20  p[i].pMethods;. 
2a240 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2a250 0a 0a 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 63  ..  /* Default c
2a260 61 73 65 2e 20 48 61 6e 64 6c 65 73 2c 20 61 6d  ase. Handles, am
2a270 6f 6e 67 73 74 20 6f 74 68 65 72 73 2c 20 22 6e  ongst others, "n
2a280 66 73 22 2e 0a 20 20 2a 2a 20 54 65 73 74 20 62  fs"..  ** Test b
2a290 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 75  yte-range lock u
2a2a0 73 69 6e 67 20 66 63 6e 74 6c 28 29 2e 20 49 66  sing fcntl(). If
2a2b0 20 74 68 65 20 63 61 6c 6c 20 73 75 63 63 65 65   the call succee
2a2c0 64 73 2c 20 0a 20 20 2a 2a 20 61 73 73 75 6d 65  ds, .  ** assume
2a2d0 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 2d 73   that the file-s
2a2e0 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20 50  ystem supports P
2a2f0 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73  OSIX style locks
2a300 2e 20 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e  . .  */.  lockIn
2a310 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20  fo.l_len = 1;.  
2a320 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74  lockInfo.l_start
2a330 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f   = 0;.  lockInfo
2a340 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
2a350 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f  _SET;.  lockInfo
2a360 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
2a370 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74 6c  K;.  if( osFcntl
2a380 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c  (pNew->h, F_GETL
2a390 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d  K, &lockInfo)!=-
2a3a0 31 20 29 20 7b 0a 20 20 20 20 69 66 28 20 73 74  1 ) {.    if( st
2a3b0 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73  rcmp(fsInfo.f_fs
2a3c0 74 79 70 65 6e 61 6d 65 2c 20 22 6e 66 73 22 29  typename, "nfs")
2a3d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
2a3e0 75 72 6e 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64  urn &nfsIoMethod
2a3f0 73 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  s;.    } else {.
2a400 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 70 6f        return &po
2a410 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  sixIoMethods;.  
2a420 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
2a430 20 72 65 74 75 72 6e 20 26 64 6f 74 6c 6f 63 6b   return &dotlock
2a440 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d  IoMethods;.  }.}
2a450 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
2a460 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2a470 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74   .  *(*const aut
2a480 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28 63  olockIoFinder)(c
2a490 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46  onst char*,unixF
2a4a0 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b  ile*) = autolock
2a4b0 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23  IoFinderImpl;..#
2a4c0 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
2a4d0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
2a4e0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2a4f0 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23  KING_STYLE */..#
2a500 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a  if OS_VXWORKS./*
2a510 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72  .** This "finder
2a520 22 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 56  " function for V
2a530 78 57 6f 72 6b 73 20 63 68 65 63 6b 73 20 74 6f  xWorks checks to
2a540 20 73 65 65 20 69 66 20 70 6f 73 69 78 20 61 64   see if posix ad
2a550 76 69 73 6f 72 79 0a 2a 2a 20 6c 6f 63 6b 69 6e  visory.** lockin
2a560 67 20 77 6f 72 6b 73 2e 20 20 49 66 20 69 74 20  g works.  If it 
2a570 64 6f 65 73 2c 20 74 68 65 6e 20 74 68 61 74 20  does, then that 
2a580 69 73 20 77 68 61 74 20 69 73 20 75 73 65 64 2e  is what is used.
2a590 20 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74    If it does not
2a5a0 0a 2a 2a 20 77 6f 72 6b 2c 20 74 68 65 6e 20 66  .** work, then f
2a5b0 61 6c 6c 62 61 63 6b 20 74 6f 20 6e 61 6d 65 64  allback to named
2a5c0 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69   semaphore locki
2a5d0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ng..*/.static co
2a5e0 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
2a5f0 65 74 68 6f 64 73 20 2a 76 78 77 6f 72 6b 73 49  ethods *vxworksI
2a600 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63  oFinderImpl(.  c
2a610 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50  onst char *fileP
2a620 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20  ath,    /* name 
2a630 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2a640 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69  file */.  unixFi
2a650 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20  le *pNew        
2a660 20 20 20 2f 2a 20 74 68 65 20 6f 70 65 6e 20 66     /* the open f
2a670 69 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  ile object */.){
2a680 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
2a690 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28  lockInfo;..  if(
2a6a0 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20   !filePath ){.  
2a6b0 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68    /* If filePath
2a6c0 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e  ==NULL that mean
2a6d0 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  s we are dealing
2a6e0 20 77 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e   with a transien
2a6f0 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68  t file.    ** th
2a700 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  at does not need
2a710 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a   to be locked. *
2a720 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f  /.    return &no
2a730 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
2a740 20 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20 69 66   }..  /* Test if
2a750 20 66 63 6e 74 6c 28 29 20 69 73 20 73 75 70 70   fcntl() is supp
2a760 6f 72 74 65 64 20 61 6e 64 20 75 73 65 20 50 4f  orted and use PO
2a770 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e  SIX style locks.
2a780 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 20  .  ** Otherwise 
2a790 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65  fall back to the
2a7a0 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   named semaphore
2a7b0 20 6d 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20   method..  */.  
2a7c0 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d  lockInfo.l_len =
2a7d0 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   1;.  lockInfo.l
2a7e0 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f  _start = 0;.  lo
2a7f0 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20  ckInfo.l_whence 
2a800 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f  = SEEK_SET;.  lo
2a810 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20  ckInfo.l_type = 
2a820 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f  F_RDLCK;.  if( o
2a830 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20  sFcntl(pNew->h, 
2a840 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e  F_GETLK, &lockIn
2a850 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20  fo)!=-1 ) {.    
2a860 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d  return &posixIoM
2a870 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b  ethods;.  }else{
2a880 0a 20 20 20 20 72 65 74 75 72 6e 20 26 73 65 6d  .    return &sem
2a890 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d  IoMethods;.  }.}
2a8a0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
2a8b0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2a8c0 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 76 78 77   .  *(*const vxw
2a8d0 6f 72 6b 73 49 6f 46 69 6e 64 65 72 29 28 63 6f  orksIoFinder)(co
2a8e0 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69  nst char*,unixFi
2a8f0 6c 65 2a 29 20 3d 20 76 78 77 6f 72 6b 73 49 6f  le*) = vxworksIo
2a900 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e  FinderImpl;..#en
2a910 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b  dif /* OS_VXWORK
2a920 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61  S */../*.** An a
2a930 62 73 74 72 61 63 74 20 74 79 70 65 20 66 6f 72  bstract type for
2a940 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
2a950 20 49 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65   IO method finde
2a960 72 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74  r function:.*/.t
2a970 79 70 65 64 65 66 20 63 6f 6e 73 74 20 73 71 6c  ypedef const sql
2a980 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2a990 2a 28 2a 66 69 6e 64 65 72 5f 74 79 70 65 29 28  *(*finder_type)(
2a9a0 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78  const char*,unix
2a9b0 46 69 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a  File*);.../*****
2a9c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a9d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a9e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a9f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aa00 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
2aa10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aa20 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73  **** sqlite3_vfs
2aa30 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   methods *******
2aa40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aa50 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
2aa60 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69   division contai
2aa70 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ns the implement
2aa80 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73  ation of methods
2aa90 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74   on the.** sqlit
2aaa0 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a  e3_vfs object..*
2aab0 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  /../*.** Initial
2aac0 69 7a 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ize the contents
2aad0 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65   of the unixFile
2aae0 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74   structure point
2aaf0 65 64 20 74 6f 20 62 79 20 70 49 64 2e 0a 2a 2f  ed to by pId..*/
2ab00 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c  .static int fill
2ab10 49 6e 55 6e 69 78 46 69 6c 65 28 0a 20 20 73 71  InUnixFile(.  sq
2ab20 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
2ab30 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
2ab40 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a   to vfs object *
2ab50 2f 0a 20 20 69 6e 74 20 68 2c 20 20 20 20 20 20  /.  int h,      
2ab60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2ab70 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  pen file descrip
2ab80 74 6f 72 20 6f 66 20 66 69 6c 65 20 62 65 69 6e  tor of file bein
2ab90 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71  g opened */.  sq
2aba0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 49 64 2c  lite3_file *pId,
2abb0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
2abc0 6f 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73  o the unixFile s
2abd0 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
2abe0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2abf0 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61  Filename,  /* Na
2ac00 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 62  me of the file b
2ac10 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  eing opened */. 
2ac20 20 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 20 20   int ctrlFlags  
2ac30 20 20 20 20 20 20 20 20 20 2f 2a 20 5a 65 72 6f           /* Zero
2ac40 20 6f 72 20 6d 6f 72 65 20 55 4e 49 58 46 49 4c   or more UNIXFIL
2ac50 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b  E_* values */.){
2ac60 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  .  const sqlite3
2ac70 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4c 6f  _io_methods *pLo
2ac80 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 75 6e  ckingStyle;.  un
2ac90 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 3d 20 28  ixFile *pNew = (
2aca0 75 6e 69 78 46 69 6c 65 20 2a 29 70 49 64 3b 0a  unixFile *)pId;.
2acb0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2acc0 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
2acd0 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 3d 3d 4e   pNew->pInode==N
2ace0 55 4c 4c 20 29 3b 0a 0a 20 20 2f 2a 20 55 73 75  ULL );..  /* Usu
2acf0 61 6c 6c 79 20 74 68 65 20 70 61 74 68 20 7a 46  ally the path zF
2ad00 69 6c 65 6e 61 6d 65 20 73 68 6f 75 6c 64 20 6e  ilename should n
2ad10 6f 74 20 62 65 20 61 20 72 65 6c 61 74 69 76 65  ot be a relative
2ad20 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65 0a 20   pathname. The. 
2ad30 20 2a 2a 20 65 78 63 65 70 74 69 6f 6e 20 69 73   ** exception is
2ad40 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68   when opening th
2ad50 65 20 70 72 6f 78 79 20 22 63 6f 6e 63 68 22 20  e proxy "conch" 
2ad60 66 69 6c 65 20 69 6e 20 62 75 69 6c 64 73 20 74  file in builds t
2ad70 68 61 74 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 65  hat.  ** include
2ad80 20 74 68 65 20 73 70 65 63 69 61 6c 20 41 70 70   the special App
2ad90 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65  le locking style
2ada0 73 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66 69  s..  */.#if defi
2adb0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
2adc0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
2add0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
2ade0 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d  assert( zFilenam
2adf0 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d  e==0 || zFilenam
2ae00 65 5b 30 5d 3d 3d 27 2f 27 20 0a 20 20 20 20 7c  e[0]=='/' .    |
2ae10 7c 20 70 56 66 73 2d 3e 70 41 70 70 44 61 74 61  | pVfs->pAppData
2ae20 3d 3d 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f  ==(void*)&autolo
2ae30 63 6b 49 6f 46 69 6e 64 65 72 20 29 3b 0a 23 65  ckIoFinder );.#e
2ae40 6c 73 65 0a 20 20 61 73 73 65 72 74 28 20 7a 46  lse.  assert( zF
2ae50 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46  ilename==0 || zF
2ae60 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20  ilename[0]=='/' 
2ae70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
2ae80 4e 6f 20 6c 6f 63 6b 69 6e 67 20 6f 63 63 75 72  No locking occur
2ae90 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 66  s in temporary f
2aea0 69 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  iles */.  assert
2aeb0 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20 7c  ( zFilename!=0 |
2aec0 7c 20 28 63 74 72 6c 46 6c 61 67 73 20 26 20 55  | (ctrlFlags & U
2aed0 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 29 21  NIXFILE_NOLOCK)!
2aee0 3d 30 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45  =0 );..  OSTRACE
2aef0 28 28 22 4f 50 45 4e 20 20 20 20 25 2d 33 64 20  (("OPEN    %-3d 
2af00 25 73 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e  %s\n", h, zFilen
2af10 61 6d 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 68  ame));.  pNew->h
2af20 20 3d 20 68 3b 0a 20 20 70 4e 65 77 2d 3e 70 56   = h;.  pNew->pV
2af30 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 4e 65  fs = pVfs;.  pNe
2af40 77 2d 3e 7a 50 61 74 68 20 3d 20 7a 46 69 6c 65  w->zPath = zFile
2af50 6e 61 6d 65 3b 0a 20 20 70 4e 65 77 2d 3e 63 74  name;.  pNew->ct
2af60 72 6c 46 6c 61 67 73 20 3d 20 28 75 38 29 63 74  rlFlags = (u8)ct
2af70 72 6c 46 6c 61 67 73 3b 0a 23 69 66 20 53 51 4c  rlFlags;.#if SQL
2af80 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
2af90 45 3e 30 0a 20 20 70 4e 65 77 2d 3e 6d 6d 61 70  E>0.  pNew->mmap
2afa0 53 69 7a 65 4d 61 78 20 3d 20 73 71 6c 69 74 65  SizeMax = sqlite
2afb0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
2afc0 4d 6d 61 70 3b 0a 23 65 6e 64 69 66 0a 20 20 69  Mmap;.#endif.  i
2afd0 66 28 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62  f( sqlite3_uri_b
2afe0 6f 6f 6c 65 61 6e 28 28 28 63 74 72 6c 46 6c 61  oolean(((ctrlFla
2aff0 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 55 52  gs & UNIXFILE_UR
2b000 49 29 20 3f 20 7a 46 69 6c 65 6e 61 6d 65 20 3a  I) ? zFilename :
2b010 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20   0),.           
2b020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b030 22 70 73 6f 77 22 2c 20 53 51 4c 49 54 45 5f 50  "psow", SQLITE_P
2b040 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
2b050 54 45 29 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d  TE) ){.    pNew-
2b060 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e  >ctrlFlags |= UN
2b070 49 58 46 49 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d  IXFILE_PSOW;.  }
2b080 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 70 56  .  if( strcmp(pV
2b090 66 73 2d 3e 7a 4e 61 6d 65 2c 22 75 6e 69 78 2d  fs->zName,"unix-
2b0a0 65 78 63 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20  excl")==0 ){.   
2b0b0 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73   pNew->ctrlFlags
2b0c0 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 45 58 43   |= UNIXFILE_EXC
2b0d0 4c 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56  L;.  }..#if OS_V
2b0e0 58 57 4f 52 4b 53 0a 20 20 70 4e 65 77 2d 3e 70  XWORKS.  pNew->p
2b0f0 49 64 20 3d 20 76 78 77 6f 72 6b 73 46 69 6e 64  Id = vxworksFind
2b100 46 69 6c 65 49 64 28 7a 46 69 6c 65 6e 61 6d 65  FileId(zFilename
2b110 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 70  );.  if( pNew->p
2b120 49 64 3d 3d 30 20 29 7b 0a 20 20 20 20 63 74 72  Id==0 ){.    ctr
2b130 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
2b140 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20 20 20 72  LE_NOLOCK;.    r
2b150 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2b160 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
2b170 69 66 28 20 63 74 72 6c 46 6c 61 67 73 20 26 20  if( ctrlFlags & 
2b180 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20  UNIXFILE_NOLOCK 
2b190 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53  ){.    pLockingS
2b1a0 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f  tyle = &nolockIo
2b1b0 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65  Methods;.  }else
2b1c0 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74  {.    pLockingSt
2b1d0 79 6c 65 20 3d 20 28 2a 2a 28 66 69 6e 64 65 72  yle = (**(finder
2b1e0 5f 74 79 70 65 2a 29 70 56 66 73 2d 3e 70 41 70  _type*)pVfs->pAp
2b1f0 70 44 61 74 61 29 28 7a 46 69 6c 65 6e 61 6d 65  pData)(zFilename
2b200 2c 20 70 4e 65 77 29 3b 0a 23 69 66 20 53 51 4c  , pNew);.#if SQL
2b210 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2b220 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 2f 2a 20  NG_STYLE.    /* 
2b230 43 61 63 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20  Cache zFilename 
2b240 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63  in the locking c
2b250 6f 6e 74 65 78 74 20 28 41 46 50 20 61 6e 64 20  ontext (AFP and 
2b260 64 6f 74 6c 6f 63 6b 20 6f 76 65 72 72 69 64 65  dotlock override
2b270 29 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 72 6f  ) for.    ** pro
2b280 78 79 4c 6f 63 6b 20 61 63 74 69 76 61 74 69 6f  xyLock activatio
2b290 6e 20 69 73 20 70 6f 73 73 69 62 6c 65 20 28 72  n is possible (r
2b2a0 65 6d 6f 74 65 20 70 72 6f 78 79 20 69 73 20 62  emote proxy is b
2b2b0 61 73 65 64 20 6f 6e 20 64 62 20 6e 61 6d 65 29  ased on db name)
2b2c0 0a 20 20 20 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d  .    ** zFilenam
2b2d0 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20  e remains valid 
2b2e0 75 6e 74 69 6c 20 66 69 6c 65 20 69 73 20 63 6c  until file is cl
2b2f0 6f 73 65 64 2c 20 74 6f 20 73 75 70 70 6f 72 74  osed, to support
2b300 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f   */.    pNew->lo
2b310 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 28  ckingContext = (
2b320 76 6f 69 64 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b  void*)zFilename;
2b330 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69  .#endif.  }..  i
2b340 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  f( pLockingStyle
2b350 20 3d 3d 20 26 70 6f 73 69 78 49 6f 4d 65 74 68   == &posixIoMeth
2b360 6f 64 73 0a 23 69 66 20 64 65 66 69 6e 65 64 28  ods.#if defined(
2b370 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
2b380 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2b390 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 7c 7c  ING_STYLE.    ||
2b3a0 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
2b3b0 3d 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 0a  = &nfsIoMethods.
2b3c0 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20 20  #endif.  ){.    
2b3d0 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
2b3e0 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49  ;.    rc = findI
2b3f0 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26  nodeInfo(pNew, &
2b400 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20  pNew->pInode);. 
2b410 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2b420 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
2b430 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
2b440 75 72 72 65 64 20 69 6e 20 66 69 6e 64 49 6e 6f  urred in findIno
2b450 64 65 49 6e 66 6f 28 29 2c 20 63 6c 6f 73 65 20  deInfo(), close 
2b460 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
2b470 74 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 6d 6d  tor.      ** imm
2b480 65 64 69 61 74 65 6c 79 2c 20 62 65 66 6f 72 65  ediately, before
2b490 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 6d   releasing the m
2b4a0 75 74 65 78 2e 20 66 69 6e 64 49 6e 6f 64 65 49  utex. findInodeI
2b4b0 6e 66 6f 28 29 20 6d 61 79 20 66 61 69 6c 0a 20  nfo() may fail. 
2b4c0 20 20 20 20 20 2a 2a 20 69 6e 20 74 77 6f 20 73       ** in two s
2b4d0 63 65 6e 61 72 69 6f 73 3a 0a 20 20 20 20 20 20  cenarios:.      
2b4e0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 61  **.      **   (a
2b4f0 29 20 41 20 63 61 6c 6c 20 74 6f 20 66 73 74 61  ) A call to fsta
2b500 74 28 29 20 66 61 69 6c 65 64 2e 0a 20 20 20 20  t() failed..    
2b510 20 20 2a 2a 20 20 20 28 62 29 20 41 20 6d 61 6c    **   (b) A mal
2b520 6c 6f 63 20 66 61 69 6c 65 64 2e 0a 20 20 20 20  loc failed..    
2b530 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53 63    **.      ** Sc
2b540 65 6e 61 72 69 6f 20 28 62 29 20 6d 61 79 20 6f  enario (b) may o
2b550 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 74 68 65  nly occur if the
2b560 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64   process is hold
2b570 69 6e 67 20 6e 6f 20 6f 74 68 65 72 0a 20 20 20  ing no other.   
2b580 20 20 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72     ** file descr
2b590 69 70 74 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  iptors open on t
2b5a0 68 65 20 73 61 6d 65 20 66 69 6c 65 2e 20 49 66  he same file. If
2b5b0 20 74 68 65 72 65 20 77 65 72 65 20 6f 74 68 65   there were othe
2b5c0 72 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  r file.      ** 
2b5d0 64 65 73 63 72 69 70 74 6f 72 73 20 6f 6e 20 74  descriptors on t
2b5e0 68 69 73 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e  his file, then n
2b5f0 6f 20 6d 61 6c 6c 6f 63 20 77 6f 75 6c 64 20 62  o malloc would b
2b600 65 20 72 65 71 75 69 72 65 64 20 62 79 0a 20 20  e required by.  
2b610 20 20 20 20 2a 2a 20 66 69 6e 64 49 6e 6f 64 65      ** findInode
2b620 49 6e 66 6f 28 29 2e 20 49 66 20 74 68 69 73 20  Info(). If this 
2b630 69 73 20 74 68 65 20 63 61 73 65 2c 20 69 74 20  is the case, it 
2b640 69 73 20 71 75 69 74 65 20 73 61 66 65 20 74 6f  is quite safe to
2b650 20 63 6c 6f 73 65 0a 20 20 20 20 20 20 2a 2a 20   close.      ** 
2b660 68 61 6e 64 6c 65 20 68 20 2d 20 61 73 20 69 74  handle h - as it
2b670 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
2b680 68 61 74 20 6e 6f 20 70 6f 73 69 78 20 6c 6f 63  hat no posix loc
2b690 6b 73 20 77 69 6c 6c 20 62 65 20 72 65 6c 65 61  ks will be relea
2b6a0 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20  sed.      ** by 
2b6b0 64 6f 69 6e 67 20 73 6f 2e 0a 20 20 20 20 20 20  doing so..      
2b6c0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 73  **.      ** If s
2b6d0 63 65 6e 61 72 69 6f 20 28 61 29 20 63 61 75 73  cenario (a) caus
2b6e0 65 64 20 74 68 65 20 65 72 72 6f 72 20 74 68 65  ed the error the
2b6f0 6e 20 74 68 69 6e 67 73 20 61 72 65 20 6e 6f 74  n things are not
2b700 20 73 6f 20 73 61 66 65 2e 20 54 68 65 0a 20 20   so safe. The.  
2b710 20 20 20 20 2a 2a 20 69 6d 70 6c 69 63 69 74 20      ** implicit 
2b720 61 73 73 75 6d 70 74 69 6f 6e 20 68 65 72 65 20  assumption here 
2b730 69 73 20 74 68 61 74 20 69 66 20 66 73 74 61 74  is that if fstat
2b740 28 29 20 66 61 69 6c 73 2c 20 74 68 69 6e 67 73  () fails, things
2b750 20 61 72 65 20 69 6e 0a 20 20 20 20 20 20 2a 2a   are in.      **
2b760 20 73 75 63 68 20 62 61 64 20 73 68 61 70 65 20   such bad shape 
2b770 74 68 61 74 20 64 72 6f 70 70 69 6e 67 20 61 20  that dropping a 
2b780 6c 6f 63 6b 20 6f 72 20 74 77 6f 20 64 6f 65 73  lock or two does
2b790 6e 27 74 20 6d 61 74 74 65 72 20 6d 75 63 68 2e  n't matter much.
2b7a0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2b7b0 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65  robust_close(pNe
2b7c0 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  w, h, __LINE__);
2b7d0 0a 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20  .      h = -1;. 
2b7e0 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61     }.    unixLea
2b7f0 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a  veMutex();.  }..
2b800 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
2b810 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
2b820 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
2b830 4c 45 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66 28  LE__).  else if(
2b840 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
2b850 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20  = &afpIoMethods 
2b860 29 7b 0a 20 20 20 20 2f 2a 20 41 46 50 20 6c 6f  ){.    /* AFP lo
2b870 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66  cking uses the f
2b880 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e  ile path so it n
2b890 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75  eeds to be inclu
2b8a0 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  ded in.    ** th
2b8b0 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  e afpLockingCont
2b8c0 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ext..    */.    
2b8d0 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
2b8e0 74 20 2a 70 43 74 78 3b 0a 20 20 20 20 70 4e 65  t *pCtx;.    pNe
2b8f0 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
2b900 74 20 3d 20 70 43 74 78 20 3d 20 73 71 6c 69 74  t = pCtx = sqlit
2b910 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a  e3_malloc64( siz
2b920 65 6f 66 28 2a 70 43 74 78 29 20 29 3b 0a 20 20  eof(*pCtx) );.  
2b930 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29 7b    if( pCtx==0 ){
2b940 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
2b950 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
2b960 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 42  lse{.      /* NB
2b970 3a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 78 69 73  : zFilename exis
2b980 74 73 20 61 6e 64 20 72 65 6d 61 69 6e 73 20 76  ts and remains v
2b990 61 6c 69 64 20 75 6e 74 69 6c 20 74 68 65 20 66  alid until the f
2b9a0 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 0a 20 20  ile is closed.  
2b9b0 20 20 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67      ** according
2b9c0 20 74 6f 20 72 65 71 75 69 72 65 6d 65 6e 74 20   to requirement 
2b9d0 46 31 31 31 34 31 2e 20 20 53 6f 20 77 65 20 64  F11141.  So we d
2b9e0 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61  o not need to ma
2b9f0 6b 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f  ke a.      ** co
2ba00 70 79 20 6f 66 20 74 68 65 20 66 69 6c 65 6e 61  py of the filena
2ba10 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70 43 74  me. */.      pCt
2ba20 78 2d 3e 64 62 50 61 74 68 20 3d 20 7a 46 69 6c  x->dbPath = zFil
2ba30 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 70 43 74  ename;.      pCt
2ba40 78 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b  x->reserved = 0;
2ba50 0a 20 20 20 20 20 20 73 72 61 6e 64 6f 6d 64 65  .      srandomde
2ba60 76 28 29 3b 0a 20 20 20 20 20 20 75 6e 69 78 45  v();.      unixE
2ba70 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
2ba80 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64     rc = findInod
2ba90 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65  eInfo(pNew, &pNe
2baa0 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20  w->pInode);.    
2bab0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2bac0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
2bad0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
2bae0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
2baf0 29 3b 0a 20 20 20 20 20 20 20 20 72 6f 62 75 73  );.        robus
2bb00 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c  t_close(pNew, h,
2bb10 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
2bb20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20      h = -1;.    
2bb30 20 20 7d 0a 20 20 20 20 20 20 75 6e 69 78 4c 65    }.      unixLe
2bb40 61 76 65 4d 75 74 65 78 28 29 3b 20 20 20 20 20  aveMutex();     
2bb50 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65     .    }.  }.#e
2bb60 6e 64 69 66 0a 0a 20 20 65 6c 73 65 20 69 66 28  ndif..  else if(
2bb70 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
2bb80 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68  = &dotlockIoMeth
2bb90 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f  ods ){.    /* Do
2bba0 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73  tfile locking us
2bbb0 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68  es the file path
2bbc0 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20   so it needs to 
2bbd0 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20  be included in. 
2bbe0 20 20 20 2a 2a 20 74 68 65 20 64 6f 74 6c 6f 63     ** the dotloc
2bbf0 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  kLockingContext 
2bc00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72  .    */.    char
2bc10 20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 20   *zLockFile;.   
2bc20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a   int nFilename;.
2bc30 20 20 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c      assert( zFil
2bc40 65 6e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20  ename!=0 );.    
2bc50 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 28 69 6e 74  nFilename = (int
2bc60 29 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d  )strlen(zFilenam
2bc70 65 29 20 2b 20 36 3b 0a 20 20 20 20 7a 4c 6f 63  e) + 6;.    zLoc
2bc80 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29  kFile = (char *)
2bc90 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
2bca0 28 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  (nFilename);.   
2bcb0 20 69 66 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d   if( zLockFile==
2bcc0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
2bcd0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2bce0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
2bcf0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2bd00 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63 6b  nFilename, zLock
2bd10 46 69 6c 65 2c 20 22 25 73 22 20 44 4f 54 4c 4f  File, "%s" DOTLO
2bd20 43 4b 5f 53 55 46 46 49 58 2c 20 7a 46 69 6c 65  CK_SUFFIX, zFile
2bd30 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  name);.    }.   
2bd40 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f   pNew->lockingCo
2bd50 6e 74 65 78 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c  ntext = zLockFil
2bd60 65 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56  e;.  }..#if OS_V
2bd70 58 57 4f 52 4b 53 0a 20 20 65 6c 73 65 20 69 66  XWORKS.  else if
2bd80 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  ( pLockingStyle 
2bd90 3d 3d 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73  == &semIoMethods
2bda0 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d 65 64   ){.    /* Named
2bdb0 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69   semaphore locki
2bdc0 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65  ng uses the file
2bdd0 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64   path so it need
2bde0 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 69  s to be.    ** i
2bdf0 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 73  ncluded in the s
2be00 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  emLockingContext
2be10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 69 78  .    */.    unix
2be20 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
2be30 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65    rc = findInode
2be40 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77  Info(pNew, &pNew
2be50 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69  ->pInode);.    i
2be60 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  f( (rc==SQLITE_O
2be70 4b 29 20 26 26 20 28 70 4e 65 77 2d 3e 70 49 6e  K) && (pNew->pIn
2be80 6f 64 65 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29  ode->pSem==NULL)
2be90 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
2bea0 7a 53 65 6d 4e 61 6d 65 20 3d 20 70 4e 65 77 2d  zSemName = pNew-
2beb0 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d  >pInode->aSemNam
2bec0 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a  e;.      int n;.
2bed0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
2bee0 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e  printf(MAX_PATHN
2bef0 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20 22  AME, zSemName, "
2bf00 2f 25 73 2e 73 65 6d 22 2c 0a 20 20 20 20 20 20  /%s.sem",.      
2bf10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf20 20 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e   pNew->pId->zCan
2bf30 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20  onicalName);.   
2bf40 20 20 20 66 6f 72 28 20 6e 3d 31 3b 20 7a 53 65     for( n=1; zSe
2bf50 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a  mName[n]; n++ ).
2bf60 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 65 6d          if( zSem
2bf70 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a  Name[n]=='/' ) z
2bf80 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27  SemName[n] = '_'
2bf90 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49  ;.      pNew->pI
2bfa0 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 20 73 65 6d  node->pSem = sem
2bfb0 5f 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20  _open(zSemName, 
2bfc0 4f 5f 43 52 45 41 54 2c 20 30 36 36 36 2c 20 31  O_CREAT, 0666, 1
2bfd0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
2bfe0 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20  w->pInode->pSem 
2bff0 3d 3d 20 53 45 4d 5f 46 41 49 4c 45 44 20 29 7b  == SEM_FAILED ){
2c000 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
2c010 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2c020 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65      pNew->pInode
2c030 2d 3e 61 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20  ->aSemName[0] = 
2c040 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20  '\0';.      }.  
2c050 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76    }.    unixLeav
2c060 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65  eMutex();.  }.#e
2c070 6e 64 69 66 0a 20 20 0a 20 20 73 74 6f 72 65 4c  ndif.  .  storeL
2c080 61 73 74 45 72 72 6e 6f 28 70 4e 65 77 2c 20 30  astErrno(pNew, 0
2c090 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  );.#if OS_VXWORK
2c0a0 53 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  S.  if( rc!=SQLI
2c0b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
2c0c0 20 68 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f 63   h>=0 ) robust_c
2c0d0 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f  lose(pNew, h, __
2c0e0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 68 20 3d  LINE__);.    h =
2c0f0 20 2d 31 3b 0a 20 20 20 20 6f 73 55 6e 6c 69 6e   -1;.    osUnlin
2c100 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  k(zFilename);.  
2c110 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67    pNew->ctrlFlag
2c120 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44 45  s |= UNIXFILE_DE
2c130 4c 45 54 45 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  LETE;.  }.#endif
2c140 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2c150 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
2c160 68 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f 63 6c  h>=0 ) robust_cl
2c170 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c  ose(pNew, h, __L
2c180 49 4e 45 5f 5f 29 3b 0a 20 20 7d 65 6c 73 65 7b  INE__);.  }else{
2c190 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68  .    pNew->pMeth
2c1a0 6f 64 20 3d 20 70 4c 6f 63 6b 69 6e 67 53 74 79  od = pLockingSty
2c1b0 6c 65 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e  le;.    OpenCoun
2c1c0 74 65 72 28 2b 31 29 3b 0a 20 20 20 20 76 65 72  ter(+1);.    ver
2c1d0 69 66 79 44 62 46 69 6c 65 28 70 4e 65 77 29 3b  ifyDbFile(pNew);
2c1e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2c1f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2c200 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  n the name of a 
2c210 64 69 72 65 63 74 6f 72 79 20 69 6e 20 77 68 69  directory in whi
2c220 63 68 20 74 6f 20 70 75 74 20 74 65 6d 70 6f 72  ch to put tempor
2c230 61 72 79 20 66 69 6c 65 73 2e 0a 2a 2a 20 49 66  ary files..** If
2c240 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 74 65 6d   no suitable tem
2c250 70 6f 72 61 72 79 20 66 69 6c 65 20 64 69 72 65  porary file dire
2c260 63 74 6f 72 79 20 63 61 6e 20 62 65 20 66 6f 75  ctory can be fou
2c270 6e 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  nd, return NULL.
2c280 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
2c290 20 63 68 61 72 20 2a 75 6e 69 78 54 65 6d 70 46   char *unixTempF
2c2a0 69 6c 65 44 69 72 28 76 6f 69 64 29 7b 0a 20 20  ileDir(void){.  
2c2b0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
2c2c0 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a  r *azDirs[] = {.
2c2d0 20 20 20 20 20 30 2c 0a 20 20 20 20 20 30 2c 0a       0,.     0,.
2c2e0 20 20 20 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c       "/var/tmp",
2c2f0 0a 20 20 20 20 20 22 2f 75 73 72 2f 74 6d 70 22  .     "/usr/tmp"
2c300 2c 0a 20 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20  ,.     "/tmp",. 
2c310 20 20 20 20 22 2e 22 0a 20 20 7d 3b 0a 20 20 75      ".".  };.  u
2c320 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20  nsigned int i;. 
2c330 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
2c340 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
2c350 7a 44 69 72 20 3d 20 73 71 6c 69 74 65 33 5f 74  zDir = sqlite3_t
2c360 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 0a  emp_directory;..
2c370 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 30 5d    if( !azDirs[0]
2c380 20 29 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 67   ) azDirs[0] = g
2c390 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 54 4d  etenv("SQLITE_TM
2c3a0 50 44 49 52 22 29 3b 0a 20 20 69 66 28 20 21 61  PDIR");.  if( !a
2c3b0 7a 44 69 72 73 5b 31 5d 20 29 20 61 7a 44 69 72  zDirs[1] ) azDir
2c3c0 73 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28 22 54  s[1] = getenv("T
2c3d0 4d 50 44 49 52 22 29 3b 0a 20 20 66 6f 72 28 69  MPDIR");.  for(i
2c3e0 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44  =0; i<sizeof(azD
2c3f0 69 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69  irs)/sizeof(azDi
2c400 72 73 5b 30 5d 29 3b 20 7a 44 69 72 3d 61 7a 44  rs[0]); zDir=azD
2c410 69 72 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20 69  irs[i++]){.    i
2c420 66 28 20 7a 44 69 72 3d 3d 30 20 29 20 63 6f 6e  f( zDir==0 ) con
2c430 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6f  tinue;.    if( o
2c440 73 53 74 61 74 28 7a 44 69 72 2c 20 26 62 75 66  sStat(zDir, &buf
2c450 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
2c460 20 20 69 66 28 20 21 53 5f 49 53 44 49 52 28 62    if( !S_ISDIR(b
2c470 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f  uf.st_mode) ) co
2c480 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
2c490 6f 73 41 63 63 65 73 73 28 7a 44 69 72 2c 20 30  osAccess(zDir, 0
2c4a0 37 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  7) ) continue;. 
2c4b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
2c4c0 72 65 74 75 72 6e 20 7a 44 69 72 3b 0a 7d 0a 0a  return zDir;.}..
2c4d0 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74  /*.** Create a t
2c4e0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61  emporary file na
2c4f0 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75  me in zBuf.  zBu
2c500 66 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61  f must be alloca
2c510 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 61  ted.** by the ca
2c520 6c 6c 69 6e 67 20 70 72 6f 63 65 73 73 20 61 6e  lling process an
2c530 64 20 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e  d must be big en
2c540 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 61 74 20  ough to hold at 
2c550 6c 65 61 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d  least.** pVfs->m
2c560 78 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73 2e  xPathname bytes.
2c570 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
2c580 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 69  nixGetTempname(i
2c590 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
2c5a0 42 75 66 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  Buf){.  const ch
2c5b0 61 72 20 2a 7a 44 69 72 3b 0a 20 20 69 6e 74 20  ar *zDir;.  int 
2c5c0 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 2f  iLimit = 0;..  /
2c5d0 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69  * It's odd to si
2c5e0 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72  mulate an io-err
2c5f0 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61  or here, but rea
2c600 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74  lly this is just
2c610 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  .  ** using the 
2c620 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74  io-error infrast
2c630 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20  ructure to test 
2c640 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64  that SQLite hand
2c650 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75  les this.  ** fu
2c660 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20  nction failing. 
2c670 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
2c680 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
2c690 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a  SQLITE_IOERR );.
2c6a0 0a 20 20 7a 44 69 72 20 3d 20 75 6e 69 78 54 65  .  zDir = unixTe
2c6b0 6d 70 46 69 6c 65 44 69 72 28 29 3b 0a 20 20 64  mpFileDir();.  d
2c6c0 6f 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20  o{.    u64 r;.  
2c6d0 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
2c6e0 6e 65 73 73 28 73 69 7a 65 6f 66 28 72 29 2c 20  ness(sizeof(r), 
2c6f0 26 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  &r);.    assert(
2c700 20 6e 42 75 66 3e 32 20 29 3b 0a 20 20 20 20 7a   nBuf>2 );.    z
2c710 42 75 66 5b 6e 42 75 66 2d 32 5d 20 3d 20 30 3b  Buf[nBuf-2] = 0;
2c720 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
2c730 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66  rintf(nBuf, zBuf
2c740 2c 20 22 25 73 2f 22 53 51 4c 49 54 45 5f 54 45  , "%s/"SQLITE_TE
2c750 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 22 25  MP_FILE_PREFIX"%
2c760 6c 6c 78 25 63 22 2c 0a 20 20 20 20 20 20 20 20  llx%c",.        
2c770 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 44 69               zDi
2c780 72 2c 20 72 2c 20 30 29 3b 0a 20 20 20 20 69 66  r, r, 0);.    if
2c790 28 20 7a 42 75 66 5b 6e 42 75 66 2d 32 5d 21 3d  ( zBuf[nBuf-2]!=
2c7a0 30 20 7c 7c 20 28 69 4c 69 6d 69 74 2b 2b 29 3e  0 || (iLimit++)>
2c7b0 31 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  10 ) return SQLI
2c7c0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 77 68 69  TE_ERROR;.  }whi
2c7d0 6c 65 28 20 6f 73 41 63 63 65 73 73 28 7a 42 75  le( osAccess(zBu
2c7e0 66 2c 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74  f,0)==0 );.  ret
2c7f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2c800 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ..#if SQLITE_ENA
2c810 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2c820 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  E && defined(__A
2c830 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 52 6f  PPLE__)./*.** Ro
2c840 75 74 69 6e 65 20 74 6f 20 74 72 61 6e 73 66 6f  utine to transfo
2c850 72 6d 20 61 20 75 6e 69 78 46 69 6c 65 20 69 6e  rm a unixFile in
2c860 74 6f 20 61 20 70 72 6f 78 79 2d 6c 6f 63 6b 69  to a proxy-locki
2c870 6e 67 20 75 6e 69 78 46 69 6c 65 2e 0a 2a 2a 20  ng unixFile..** 
2c880 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  Implementation i
2c890 6e 20 74 68 65 20 70 72 6f 78 79 2d 6c 6f 63 6b  n the proxy-lock
2c8a0 20 64 69 76 69 73 69 6f 6e 2c 20 62 75 74 20 75   division, but u
2c8b0 73 65 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28  sed by unixOpen(
2c8c0 29 0a 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f 50  ).** if SQLITE_P
2c8d0 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b  REFER_PROXY_LOCK
2c8e0 49 4e 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a  ING is defined..
2c8f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
2c900 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78  oxyTransformUnix
2c910 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 2a 2c 20  File(unixFile*, 
2c920 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 23 65  const char*);.#e
2c930 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72  ndif../*.** Sear
2c940 63 68 20 66 6f 72 20 61 6e 20 75 6e 75 73 65 64  ch for an unused
2c950 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2c960 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 65 64   that was opened
2c970 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2c980 20 0a 2a 2a 20 66 69 6c 65 20 28 6e 6f 74 20 61   .** file (not a
2c990 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 6d 61 73 74   journal or mast
2c9a0 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29  er-journal file)
2c9b0 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70   identified by p
2c9c0 61 74 68 6e 61 6d 65 0a 2a 2a 20 7a 50 61 74 68  athname.** zPath
2c9d0 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f 50 45   with SQLITE_OPE
2c9e0 4e 5f 58 58 58 20 66 6c 61 67 73 20 6d 61 74 63  N_XXX flags matc
2c9f0 68 69 6e 67 20 74 68 6f 73 65 20 70 61 73 73 65  hing those passe
2ca00 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 0a  d as the second.
2ca10 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  ** argument to t
2ca20 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
2ca30 0a 2a 2a 20 53 75 63 68 20 61 20 66 69 6c 65 20  .** Such a file 
2ca40 64 65 73 63 72 69 70 74 6f 72 20 6d 61 79 20 65  descriptor may e
2ca50 78 69 73 74 20 69 66 20 61 20 64 61 74 61 62 61  xist if a databa
2ca60 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61  se connection wa
2ca70 73 20 63 6c 6f 73 65 64 0a 2a 2a 20 62 75 74 20  s closed.** but 
2ca80 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66  the associated f
2ca90 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 63  ile descriptor c
2caa0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 6c 6f 73  ould not be clos
2cab0 65 64 20 62 65 63 61 75 73 65 20 73 6f 6d 65 0a  ed because some.
2cac0 2a 2a 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65  ** other file de
2cad0 73 63 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e  scriptor open on
2cae0 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 69   the same file i
2caf0 73 20 68 6f 6c 64 69 6e 67 20 61 20 66 69 6c 65  s holding a file
2cb00 2d 6c 6f 63 6b 2e 0a 2a 2a 20 52 65 66 65 72 20  -lock..** Refer 
2cb10 74 6f 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74  to comments in t
2cb20 68 65 20 75 6e 69 78 43 6c 6f 73 65 28 29 20 66  he unixClose() f
2cb30 75 6e 63 74 69 6f 6e 20 61 6e 64 20 74 68 65 20  unction and the 
2cb40 6c 65 6e 67 74 68 79 20 63 6f 6d 6d 65 6e 74 0a  lengthy comment.
2cb50 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20 22 50  ** describing "P
2cb60 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
2cb70 63 6b 69 6e 67 22 20 61 74 20 74 68 65 20 73 74  cking" at the st
2cb80 61 72 74 20 6f 66 20 74 68 69 73 20 66 69 6c 65  art of this file
2cb90 20 66 6f 72 20 0a 2a 2a 20 66 75 72 74 68 65 72   for .** further
2cba0 20 64 65 74 61 69 6c 73 2e 20 41 6c 73 6f 2c 20   details. Also, 
2cbb0 74 69 63 6b 65 74 20 23 34 30 31 38 2e 0a 2a 2a  ticket #4018..**
2cbc0 0a 2a 2a 20 49 66 20 61 20 73 75 69 74 61 62 6c  .** If a suitabl
2cbd0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
2cbe0 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 6e  r is found, then
2cbf0 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e   it is returned.
2cc00 20 49 66 20 6e 6f 0a 2a 2a 20 73 75 63 68 20 66   If no.** such f
2cc10 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
2cc20 73 20 6c 6f 63 61 74 65 64 2c 20 2d 31 20 69 73  s located, -1 is
2cc30 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
2cc40 61 74 69 63 20 55 6e 69 78 55 6e 75 73 65 64 46  atic UnixUnusedF
2cc50 64 20 2a 66 69 6e 64 52 65 75 73 61 62 6c 65 46  d *findReusableF
2cc60 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  d(const char *zP
2cc70 61 74 68 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  ath, int flags){
2cc80 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
2cc90 2a 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 0a 20  *pUnused = 0;.. 
2cca0 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 65 61 72 63   /* Do not searc
2ccb0 68 20 66 6f 72 20 61 6e 20 75 6e 75 73 65 64 20  h for an unused 
2ccc0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2ccd0 6f 6e 20 76 78 77 6f 72 6b 73 2e 20 4e 6f 74 20  on vxworks. Not 
2cce0 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 76 78 77  because.  ** vxw
2ccf0 6f 72 6b 73 20 77 6f 75 6c 64 20 6e 6f 74 20 62  orks would not b
2cd00 65 6e 65 66 69 74 20 66 72 6f 6d 20 74 68 65 20  enefit from the 
2cd10 63 68 61 6e 67 65 20 28 69 74 20 6d 69 67 68 74  change (it might
2cd20 2c 20 77 65 27 72 65 20 6e 6f 74 20 73 75 72 65  , we're not sure
2cd30 29 2c 0a 20 20 2a 2a 20 62 75 74 20 62 65 63 61  ),.  ** but beca
2cd40 75 73 65 20 6e 6f 20 77 61 79 20 74 6f 20 74 65  use no way to te
2cd50 73 74 20 69 74 20 69 73 20 63 75 72 72 65 6e 74  st it is current
2cd60 6c 79 20 61 76 61 69 6c 61 62 6c 65 2e 20 49 74  ly available. It
2cd70 20 69 73 20 62 65 74 74 65 72 20 0a 20 20 2a 2a   is better .  **
2cd80 20 6e 6f 74 20 74 6f 20 72 69 73 6b 20 62 72 65   not to risk bre
2cd90 61 6b 69 6e 67 20 76 78 77 6f 72 6b 73 20 73 75  aking vxworks su
2cda0 70 70 6f 72 74 20 66 6f 72 20 74 68 65 20 73 61  pport for the sa
2cdb0 6b 65 20 6f 66 20 73 75 63 68 20 61 6e 20 6f 62  ke of such an ob
2cdc0 73 63 75 72 65 20 0a 20 20 2a 2a 20 66 65 61 74  scure .  ** feat
2cdd0 75 72 65 2e 20 20 2a 2f 0a 23 69 66 20 21 4f 53  ure.  */.#if !OS
2cde0 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63  _VXWORKS.  struc
2cdf0 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20  t stat sStat;   
2ce00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce10 2f 2a 20 52 65 73 75 6c 74 73 20 6f 66 20 73 74  /* Results of st
2ce20 61 74 28 29 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20  at() call */..  
2ce30 2f 2a 20 41 20 73 74 61 74 28 29 20 63 61 6c 6c  /* A stat() call
2ce40 20 6d 61 79 20 66 61 69 6c 20 66 6f 72 20 76 61   may fail for va
2ce50 72 69 6f 75 73 20 72 65 61 73 6f 6e 73 2e 20 49  rious reasons. I
2ce60 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20  f this happens, 
2ce70 69 74 20 69 73 0a 20 20 2a 2a 20 61 6c 6d 6f 73  it is.  ** almos
2ce80 74 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 61  t certain that a
2ce90 6e 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20 6f 6e  n open() call on
2cea0 20 74 68 65 20 73 61 6d 65 20 70 61 74 68 20 77   the same path w
2ceb0 69 6c 6c 20 61 6c 73 6f 20 66 61 69 6c 2e 0a 20  ill also fail.. 
2cec0 20 2a 2a 20 46 6f 72 20 74 68 69 73 20 72 65 61   ** For this rea
2ced0 73 6f 6e 2c 20 69 66 20 61 6e 20 65 72 72 6f 72  son, if an error
2cee0 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 73   occurs in the s
2cef0 74 61 74 28 29 20 63 61 6c 6c 20 68 65 72 65 2c  tat() call here,
2cf00 20 69 74 20 69 73 0a 20 20 2a 2a 20 69 67 6e 6f   it is.  ** igno
2cf10 72 65 64 20 61 6e 64 20 2d 31 20 69 73 20 72 65  red and -1 is re
2cf20 74 75 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c  turned. The call
2cf30 65 72 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 6f  er will try to o
2cf40 70 65 6e 20 61 20 6e 65 77 20 66 69 6c 65 0a 20  pen a new file. 
2cf50 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 6f   ** descriptor o
2cf60 6e 20 74 68 65 20 73 61 6d 65 20 70 61 74 68 2c  n the same path,
2cf70 20 66 61 69 6c 2c 20 61 6e 64 20 72 65 74 75 72   fail, and retur
2cf80 6e 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 53 51  n an error to SQ
2cf90 4c 69 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Lite..  **.  ** 
2cfa0 45 76 65 6e 20 69 66 20 61 20 73 75 62 73 65 71  Even if a subseq
2cfb0 75 65 6e 74 20 6f 70 65 6e 28 29 20 63 61 6c 6c  uent open() call
2cfc0 20 64 6f 65 73 20 73 75 63 63 65 65 64 2c 20 74   does succeed, t
2cfd0 68 65 20 63 6f 6e 73 65 71 75 65 6e 63 65 73 20  he consequences 
2cfe0 6f 66 0a 20 20 2a 2a 20 6e 6f 74 20 73 65 61 72  of.  ** not sear
2cff0 63 68 69 6e 67 20 66 6f 72 20 61 20 72 65 75 73  ching for a reus
2d000 61 62 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69  able file descri
2d010 70 74 6f 72 20 61 72 65 20 6e 6f 74 20 64 69 72  ptor are not dir
2d020 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d  e.  */.  if( 0==
2d030 6f 73 53 74 61 74 28 7a 50 61 74 68 2c 20 26 73  osStat(zPath, &s
2d040 53 74 61 74 29 20 29 7b 0a 20 20 20 20 75 6e 69  Stat) ){.    uni
2d050 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
2d060 64 65 3b 0a 0a 20 20 20 20 75 6e 69 78 45 6e 74  de;..    unixEnt
2d070 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 70  erMutex();.    p
2d080 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c 69 73  Inode = inodeLis
2d090 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 49  t;.    while( pI
2d0a0 6e 6f 64 65 20 26 26 20 28 70 49 6e 6f 64 65 2d  node && (pInode-
2d0b0 3e 66 69 6c 65 49 64 2e 64 65 76 21 3d 73 53 74  >fileId.dev!=sSt
2d0c0 61 74 2e 73 74 5f 64 65 76 0a 20 20 20 20 20 20  at.st_dev.      
2d0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
2d0e0 7c 20 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64  | pInode->fileId
2d0f0 2e 69 6e 6f 21 3d 73 53 74 61 74 2e 73 74 5f 69  .ino!=sStat.st_i
2d100 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 70 49  no) ){.       pI
2d110 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70  node = pInode->p
2d120 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
2d130 69 66 28 20 70 49 6e 6f 64 65 20 29 7b 0a 20 20  if( pInode ){.  
2d140 20 20 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64      UnixUnusedFd
2d150 20 2a 2a 70 70 3b 0a 20 20 20 20 20 20 66 6f 72   **pp;.      for
2d160 28 70 70 3d 26 70 49 6e 6f 64 65 2d 3e 70 55 6e  (pp=&pInode->pUn
2d170 75 73 65 64 3b 20 2a 70 70 20 26 26 20 28 2a 70  used; *pp && (*p
2d180 70 29 2d 3e 66 6c 61 67 73 21 3d 66 6c 61 67 73  p)->flags!=flags
2d190 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e  ; pp=&((*pp)->pN
2d1a0 65 78 74 29 29 3b 0a 20 20 20 20 20 20 70 55 6e  ext));.      pUn
2d1b0 75 73 65 64 20 3d 20 2a 70 70 3b 0a 20 20 20 20  used = *pp;.    
2d1c0 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b    if( pUnused ){
2d1d0 0a 20 20 20 20 20 20 20 20 2a 70 70 20 3d 20 70  .        *pp = p
2d1e0 55 6e 75 73 65 64 2d 3e 70 4e 65 78 74 3b 0a 20  Unused->pNext;. 
2d1f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2d200 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
2d210 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 20 20  );.  }.#endif   
2d220 20 2f 2a 20 69 66 20 21 4f 53 5f 56 58 57 4f 52   /* if !OS_VXWOR
2d230 4b 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70  KS */.  return p
2d240 55 6e 75 73 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Unused;.}../*.**
2d250 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2d260 73 20 63 61 6c 6c 65 64 20 62 79 20 75 6e 69 78  s called by unix
2d270 4f 70 65 6e 28 29 20 74 6f 20 64 65 74 65 72 6d  Open() to determ
2d280 69 6e 65 20 74 68 65 20 75 6e 69 78 20 70 65 72  ine the unix per
2d290 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 74 6f 20 63  missions.** to c
2d2a0 72 65 61 74 65 20 6e 65 77 20 66 69 6c 65 73 20  reate new files 
2d2b0 77 69 74 68 2e 20 49 66 20 6e 6f 20 65 72 72 6f  with. If no erro
2d2c0 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53  r occurs, then S
2d2d0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2d2e0 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 61 20 76 61  rned.** and a va
2d2f0 6c 75 65 20 73 75 69 74 61 62 6c 65 20 66 6f 72  lue suitable for
2d300 20 70 61 73 73 69 6e 67 20 61 73 20 74 68 65 20   passing as the 
2d310 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 74  third argument t
2d320 6f 20 6f 70 65 6e 28 32 29 20 69 73 0a 2a 2a 20  o open(2) is.** 
2d330 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 4d 6f 64  written to *pMod
2d340 65 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  e. If an IO erro
2d350 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c  r occurs, an SQL
2d360 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
2d370 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61  s .** returned a
2d380 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  nd the value of 
2d390 2a 70 4d 6f 64 65 20 69 73 20 6e 6f 74 20 6d 6f  *pMode is not mo
2d3a0 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e  dified..**.** In
2d3b0 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 74 68 69   most cases, thi
2d3c0 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 2a  s routine sets *
2d3d0 70 4d 6f 64 65 20 74 6f 20 30 2c 20 77 68 69 63  pMode to 0, whic
2d3e0 68 20 77 69 6c 6c 20 62 65 63 6f 6d 65 0a 2a 2a  h will become.**
2d3f0 20 61 6e 20 69 6e 64 69 63 61 74 69 6f 6e 20 74   an indication t
2d400 6f 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 29 20  o robust_open() 
2d410 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 66 69  to create the fi
2d420 6c 65 20 75 73 69 6e 67 0a 2a 2a 20 53 51 4c 49  le using.** SQLI
2d430 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
2d440 50 45 52 4d 49 53 53 49 4f 4e 53 20 61 64 6a 75  PERMISSIONS adju
2d450 73 74 65 64 20 62 79 20 74 68 65 20 75 6d 61 73  sted by the umas
2d460 6b 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65  k..** But if the
2d470 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e   file being open
2d480 65 64 20 69 73 20 61 20 57 41 4c 20 6f 72 20 72  ed is a WAL or r
2d490 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66  egular journal f
2d4a0 69 6c 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68  ile, then .** th
2d4b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 71 75 65 72  is function quer
2d4c0 69 65 73 20 74 68 65 20 66 69 6c 65 2d 73 79 73  ies the file-sys
2d4d0 74 65 6d 20 66 6f 72 20 74 68 65 20 70 65 72 6d  tem for the perm
2d4e0 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20 0a  issions on the .
2d4f0 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
2d500 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
2d510 6e 64 20 73 65 74 73 20 2a 70 4d 6f 64 65 20 74  nd sets *pMode t
2d520 6f 20 74 68 69 73 20 76 61 6c 75 65 2e 20 57 68  o this value. Wh
2d530 65 6e 65 76 65 72 20 0a 2a 2a 20 70 6f 73 73 69  enever .** possi
2d540 62 6c 65 2c 20 57 41 4c 20 61 6e 64 20 6a 6f 75  ble, WAL and jou
2d550 72 6e 61 6c 20 66 69 6c 65 73 20 61 72 65 20 63  rnal files are c
2d560 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65  reated using the
2d570 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e   same permission
2d580 73 20 0a 2a 2a 20 61 73 20 74 68 65 20 61 73 73  s .** as the ass
2d590 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65  ociated database
2d5a0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
2d5b0 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  the SQLITE_ENABL
2d5c0 45 5f 38 5f 33 5f 4e 41 4d 45 53 20 6f 70 74 69  E_8_3_NAMES opti
2d5d0 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74  on is enabled, t
2d5e0 68 65 6e 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69  hen the.** origi
2d5f0 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  nal filename is 
2d600 75 6e 61 76 61 69 6c 61 62 6c 65 2e 20 20 42 75  unavailable.  Bu
2d610 74 20 38 5f 33 5f 4e 41 4d 45 53 20 69 73 20 6f  t 8_3_NAMES is o
2d620 6e 6c 79 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20  nly used for.** 
2d630 46 41 54 20 66 69 6c 65 73 79 73 74 65 6d 73 20  FAT filesystems 
2d640 61 6e 64 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  and permissions 
2d650 64 6f 20 6e 6f 74 20 6d 61 74 74 65 72 20 74 68  do not matter th
2d660 65 72 65 2c 20 73 6f 20 6a 75 73 74 20 75 73 65  ere, so just use
2d670 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20  .** the default 
2d680 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 2a 2f 0a  permissions..*/.
2d690 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 43  static int findC
2d6a0 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28 0a 20  reateFileMode(. 
2d6b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
2d6c0 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
2d6d0 20 2f 2a 20 50 61 74 68 20 6f 66 20 66 69 6c 65   /* Path of file
2d6e0 20 28 70 6f 73 73 69 62 6c 79 29 20 62 65 69 6e   (possibly) bein
2d6f0 67 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 69  g created */.  i
2d700 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
2d710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d720 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 61  * Flags passed a
2d730 73 20 34 74 68 20 61 72 67 75 6d 65 6e 74 20 74  s 4th argument t
2d740 6f 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 6d  o xOpen() */.  m
2d750 6f 64 65 5f 74 20 2a 70 4d 6f 64 65 2c 20 20 20  ode_t *pMode,   
2d760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d770 2a 20 4f 55 54 3a 20 50 65 72 6d 69 73 73 69 6f  * OUT: Permissio
2d780 6e 73 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 20  ns to open file 
2d790 77 69 74 68 20 2a 2f 0a 20 20 75 69 64 5f 74 20  with */.  uid_t 
2d7a0 2a 70 55 69 64 2c 20 20 20 20 20 20 20 20 20 20  *pUid,          
2d7b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
2d7c0 3a 20 75 69 64 20 74 6f 20 73 65 74 20 6f 6e 20  : uid to set on 
2d7d0 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 67 69  the file */.  gi
2d7e0 64 5f 74 20 2a 70 47 69 64 20 20 20 20 20 20 20  d_t *pGid       
2d7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d800 20 4f 55 54 3a 20 67 69 64 20 74 6f 20 73 65 74   OUT: gid to set
2d810 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a   on the file */.
2d820 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
2d830 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
2d840 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
2d850 6f 64 65 20 2a 2f 0a 20 20 2a 70 4d 6f 64 65 20  ode */.  *pMode 
2d860 3d 20 30 3b 0a 20 20 2a 70 55 69 64 20 3d 20 30  = 0;.  *pUid = 0
2d870 3b 0a 20 20 2a 70 47 69 64 20 3d 20 30 3b 0a 20  ;.  *pGid = 0;. 
2d880 20 69 66 28 20 66 6c 61 67 73 20 26 20 28 53 51   if( flags & (SQ
2d890 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51  LITE_OPEN_WAL|SQ
2d8a0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
2d8b0 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20 63  OURNAL) ){.    c
2d8c0 68 61 72 20 7a 44 62 5b 4d 41 58 5f 50 41 54 48  har zDb[MAX_PATH
2d8d0 4e 41 4d 45 2b 31 5d 3b 20 20 20 20 20 2f 2a 20  NAME+1];     /* 
2d8e0 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 61  Database file pa
2d8f0 74 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 44  th */.    int nD
2d900 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
2d910 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2d920 72 20 6f 66 20 76 61 6c 69 64 20 62 79 74 65 73  r of valid bytes
2d930 20 69 6e 20 7a 44 62 20 2a 2f 0a 20 20 20 20 73   in zDb */.    s
2d940 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74  truct stat sStat
2d950 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2d960 4f 75 74 70 75 74 20 6f 66 20 73 74 61 74 28 29  Output of stat()
2d970 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   on database fil
2d980 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 7a 50 61  e */..    /* zPa
2d990 74 68 20 69 73 20 61 20 70 61 74 68 20 74 6f 20  th is a path to 
2d9a0 61 20 57 41 4c 20 6f 72 20 6a 6f 75 72 6e 61 6c  a WAL or journal
2d9b0 20 66 69 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f   file. The follo
2d9c0 77 69 6e 67 20 62 6c 6f 63 6b 20 64 65 72 69 76  wing block deriv
2d9d0 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61  es.    ** the pa
2d9e0 74 68 20 74 6f 20 74 68 65 20 61 73 73 6f 63 69  th to the associ
2d9f0 61 74 65 64 20 64 61 74 61 62 61 73 65 20 66 69  ated database fi
2da00 6c 65 20 66 72 6f 6d 20 7a 50 61 74 68 2e 20 54  le from zPath. T
2da10 68 69 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65  his block handle
2da20 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c  s.    ** the fol
2da30 6c 6f 77 69 6e 67 20 6e 61 6d 69 6e 67 20 63 6f  lowing naming co
2da40 6e 76 65 6e 74 69 6f 6e 73 3a 0a 20 20 20 20 2a  nventions:.    *
2da50 2a 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74  *.    **   "<pat
2da60 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c  h to db>-journal
2da70 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74  ".    **   "<pat
2da80 68 20 74 6f 20 64 62 3e 2d 77 61 6c 22 0a 20 20  h to db>-wal".  
2da90 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f    **   "<path to
2daa0 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 4e 4e 22 0a   db>-journalNN".
2dab0 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20      **   "<path 
2dac0 74 6f 20 64 62 3e 2d 77 61 6c 4e 4e 22 0a 20 20  to db>-walNN".  
2dad0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 77 68 65 72    **.    ** wher
2dae0 65 20 4e 4e 20 69 73 20 61 20 64 65 63 69 6d 61  e NN is a decima
2daf0 6c 20 6e 75 6d 62 65 72 2e 20 54 68 65 20 4e 4e  l number. The NN
2db00 20 6e 61 6d 69 6e 67 20 73 63 68 65 6d 65 73 20   naming schemes 
2db10 61 72 65 20 0a 20 20 20 20 2a 2a 20 75 73 65 64  are .    ** used
2db20 20 62 79 20 74 68 65 20 74 65 73 74 5f 6d 75 6c   by the test_mul
2db30 74 69 70 6c 65 78 2e 63 20 6d 6f 64 75 6c 65 2e  tiplex.c module.
2db40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 44 62 20  .    */.    nDb 
2db50 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
2db60 30 28 7a 50 61 74 68 29 20 2d 20 31 3b 20 0a 23  0(zPath) - 1; .#
2db70 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
2db80 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 0a 20 20  BLE_8_3_NAMES.  
2db90 20 20 77 68 69 6c 65 28 20 6e 44 62 3e 30 20 26    while( nDb>0 &
2dba0 26 20 73 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d  & sqlite3Isalnum
2dbb0 28 7a 50 61 74 68 5b 6e 44 62 5d 29 20 29 20 6e  (zPath[nDb]) ) n
2dbc0 44 62 2d 2d 3b 0a 20 20 20 20 69 66 28 20 6e 44  Db--;.    if( nD
2dbd0 62 3d 3d 30 20 7c 7c 20 7a 50 61 74 68 5b 6e 44  b==0 || zPath[nD
2dbe0 62 5d 21 3d 27 2d 27 20 29 20 72 65 74 75 72 6e  b]!='-' ) return
2dbf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73   SQLITE_OK;.#els
2dc00 65 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 50 61  e.    while( zPa
2dc10 74 68 5b 6e 44 62 5d 21 3d 27 2d 27 20 29 7b 0a  th[nDb]!='-' ){.
2dc20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 44        assert( nD
2dc30 62 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  b>0 );.      ass
2dc40 65 72 74 28 20 7a 50 61 74 68 5b 6e 44 62 5d 21  ert( zPath[nDb]!
2dc50 3d 27 5c 6e 27 20 29 3b 0a 20 20 20 20 20 20 6e  ='\n' );.      n
2dc60 44 62 2d 2d 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Db--;.    }.#end
2dc70 69 66 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44  if.    memcpy(zD
2dc80 62 2c 20 7a 50 61 74 68 2c 20 6e 44 62 29 3b 0a  b, zPath, nDb);.
2dc90 20 20 20 20 7a 44 62 5b 6e 44 62 5d 20 3d 20 27      zDb[nDb] = '
2dca0 5c 30 27 3b 0a 0a 20 20 20 20 69 66 28 20 30 3d  \0';..    if( 0=
2dcb0 3d 6f 73 53 74 61 74 28 7a 44 62 2c 20 26 73 53  =osStat(zDb, &sS
2dcc0 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20 2a 70  tat) ){.      *p
2dcd0 4d 6f 64 65 20 3d 20 73 53 74 61 74 2e 73 74 5f  Mode = sStat.st_
2dce0 6d 6f 64 65 20 26 20 30 37 37 37 3b 0a 20 20 20  mode & 0777;.   
2dcf0 20 20 20 2a 70 55 69 64 20 3d 20 73 53 74 61 74     *pUid = sStat
2dd00 2e 73 74 5f 75 69 64 3b 0a 20 20 20 20 20 20 2a  .st_uid;.      *
2dd10 70 47 69 64 20 3d 20 73 53 74 61 74 2e 73 74 5f  pGid = sStat.st_
2dd20 67 69 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  gid;.    }else{.
2dd30 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2dd40 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20  E_IOERR_FSTAT;. 
2dd50 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
2dd60 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
2dd70 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
2dd80 53 45 20 29 7b 0a 20 20 20 20 2a 70 4d 6f 64 65  SE ){.    *pMode
2dd90 20 3d 20 30 36 30 30 3b 0a 20 20 7d 0a 20 20 72   = 0600;.  }.  r
2dda0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2ddb0 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66 69 6c 65  ** Open the file
2ddc0 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50   zPath..** .** P
2ddd0 72 65 76 69 6f 75 73 6c 79 2c 20 74 68 65 20 53  reviously, the S
2dde0 51 4c 69 74 65 20 4f 53 20 6c 61 79 65 72 20 75  QLite OS layer u
2ddf0 73 65 64 20 74 68 72 65 65 20 66 75 6e 63 74 69  sed three functi
2de00 6f 6e 73 20 69 6e 20 70 6c 61 63 65 20 6f 66 20  ons in place of 
2de10 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a  this.** one:.**.
2de20 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  **     sqlite3Os
2de30 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 29 3b  OpenReadWrite();
2de40 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f  .**     sqlite3O
2de50 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 29 3b  sOpenReadOnly();
2de60 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f  .**     sqlite3O
2de70 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29  sOpenExclusive()
2de80 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61  ;.**.** These ca
2de90 6c 6c 73 20 63 6f 72 72 65 73 70 6f 6e 64 20 74  lls correspond t
2dea0 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
2deb0 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20  combinations of 
2dec0 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  flags:.**.**    
2ded0 20 52 65 61 64 57 72 69 74 65 28 29 20 2d 3e 20   ReadWrite() -> 
2dee0 20 20 20 20 28 52 45 41 44 57 52 49 54 45 20 7c      (READWRITE |
2def0 20 43 52 45 41 54 45 29 0a 2a 2a 20 20 20 20 20   CREATE).**     
2df00 52 65 61 64 4f 6e 6c 79 28 29 20 20 2d 3e 20 20  ReadOnly()  ->  
2df10 20 20 20 28 52 45 41 44 4f 4e 4c 59 29 20 0a 2a     (READONLY) .*
2df20 2a 20 20 20 20 20 4f 70 65 6e 45 78 63 6c 75 73  *     OpenExclus
2df30 69 76 65 28 29 20 2d 3e 20 28 52 45 41 44 57 52  ive() -> (READWR
2df40 49 54 45 20 7c 20 43 52 45 41 54 45 20 7c 20 45  ITE | CREATE | E
2df50 58 43 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20  XCLUSIVE).**.** 
2df60 54 68 65 20 6f 6c 64 20 4f 70 65 6e 45 78 63 6c  The old OpenExcl
2df70 75 73 69 76 65 28 29 20 61 63 63 65 70 74 65 64  usive() accepted
2df80 20 61 20 62 6f 6f 6c 65 61 6e 20 61 72 67 75 6d   a boolean argum
2df90 65 6e 74 20 2d 20 22 64 65 6c 46 6c 61 67 22 2e  ent - "delFlag".
2dfa0 20 49 66 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65   If.** true, the
2dfb0 20 66 69 6c 65 20 77 61 73 20 63 6f 6e 66 69 67   file was config
2dfc0 75 72 65 64 20 74 6f 20 62 65 20 61 75 74 6f 6d  ured to be autom
2dfd0 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
2dfe0 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 66 69 6c   when the.** fil
2dff0 65 20 68 61 6e 64 6c 65 20 63 6c 6f 73 65 64 2e  e handle closed.
2e000 20 54 6f 20 61 63 68 69 65 76 65 20 74 68 65 20   To achieve the 
2e010 73 61 6d 65 20 65 66 66 65 63 74 20 75 73 69 6e  same effect usin
2e020 67 20 74 68 69 73 20 6e 65 77 20 0a 2a 2a 20 69  g this new .** i
2e030 6e 74 65 72 66 61 63 65 2c 20 61 64 64 20 74 68  nterface, add th
2e040 65 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20  e DELETEONCLOSE 
2e050 66 6c 61 67 20 74 6f 20 74 68 6f 73 65 20 73 70  flag to those sp
2e060 65 63 69 66 69 65 64 20 61 62 6f 76 65 20 66 6f  ecified above fo
2e070 72 20 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c 75 73  r .** OpenExclus
2e080 69 76 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ive()..*/.static
2e090 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 28 0a 20   int unixOpen(. 
2e0a0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
2e0b0 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fs,           /*
2e0c0 20 54 68 65 20 56 46 53 20 66 6f 72 20 77 68 69   The VFS for whi
2e0d0 63 68 20 74 68 69 73 20 69 73 20 74 68 65 20 78  ch this is the x
2e0e0 4f 70 65 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Open method */. 
2e0f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
2e100 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  th,           /*
2e110 20 50 61 74 68 6e 61 6d 65 20 6f 66 20 66 69 6c   Pathname of fil
2e120 65 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a  e to be opened *
2e130 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
2e140 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20   *pFile,        
2e150 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
2e160 63 72 69 70 74 6f 72 20 74 6f 20 62 65 20 66 69  criptor to be fi
2e170 6c 6c 65 64 20 69 6e 20 2a 2f 0a 20 20 69 6e 74  lled in */.  int
2e180 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
2e190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70            /* Inp
2e1a0 75 74 20 66 6c 61 67 73 20 74 6f 20 63 6f 6e 74  ut flags to cont
2e1b0 72 6f 6c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20  rol the opening 
2e1c0 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c  */.  int *pOutFl
2e1d0 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ags             
2e1e0 20 20 2f 2a 20 4f 75 74 70 75 74 20 66 6c 61 67    /* Output flag
2e1f0 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51  s returned to SQ
2e200 4c 69 74 65 20 63 6f 72 65 20 2a 2f 0a 29 7b 0a  Lite core */.){.
2e210 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d 20    unixFile *p = 
2e220 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 46 69 6c  (unixFile *)pFil
2e230 65 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31  e;.  int fd = -1
2e240 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e250 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
2e260 72 69 70 74 6f 72 20 72 65 74 75 72 6e 65 64 20  riptor returned 
2e270 62 79 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69  by open() */.  i
2e280 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 30  nt openFlags = 0
2e290 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2e2a0 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74   Flags to pass t
2e2b0 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e  o open() */.  in
2e2c0 74 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26  t eType = flags&
2e2d0 30 78 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20  0xFFFFFF00;  /* 
2e2e0 54 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  Type of file to 
2e2f0 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  open */.  int no
2e300 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Lock;           
2e310 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2e320 20 74 6f 20 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67   to omit locking
2e330 20 70 72 69 6d 69 74 69 76 65 73 20 2a 2f 0a 20   primitives */. 
2e340 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2e350 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
2e360 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 75  /* Function Retu
2e370 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn Code */.  int
2e380 20 63 74 72 6c 46 6c 61 67 73 20 3d 20 30 3b 20   ctrlFlags = 0; 
2e390 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
2e3a0 4e 49 58 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20  NIXFILE_* flags 
2e3b0 2a 2f 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c  */..  int isExcl
2e3c0 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20  usive  = (flags 
2e3d0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58  & SQLITE_OPEN_EX
2e3e0 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20  CLUSIVE);.  int 
2e3f0 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28  isDelete     = (
2e400 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
2e410 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
2e420 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61  E);.  int isCrea
2e430 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20  te     = (flags 
2e440 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  & SQLITE_OPEN_CR
2e450 45 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73 52  EATE);.  int isR
2e460 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61  eadonly   = (fla
2e470 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
2e480 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e  _READONLY);.  in
2e490 74 20 69 73 52 65 61 64 57 72 69 74 65 20 20 3d  t isReadWrite  =
2e4a0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
2e4b0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29  _OPEN_READWRITE)
2e4c0 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ;.#if SQLITE_ENA
2e4d0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2e4e0 45 0a 20 20 69 6e 74 20 69 73 41 75 74 6f 50 72  E.  int isAutoPr
2e4f0 6f 78 79 20 20 3d 20 28 66 6c 61 67 73 20 26 20  oxy  = (flags & 
2e500 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f  SQLITE_OPEN_AUTO
2e510 50 52 4f 58 59 29 3b 0a 23 65 6e 64 69 66 0a 23  PROXY);.#endif.#
2e520 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
2e530 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f  LE__) || SQLITE_
2e540 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2e550 54 59 4c 45 0a 20 20 73 74 72 75 63 74 20 73 74  TYLE.  struct st
2e560 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 23 65 6e  atfs fsInfo;.#en
2e570 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 63 72 65  dif..  /* If cre
2e580 61 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6f  ating a master o
2e590 72 20 6d 61 69 6e 2d 66 69 6c 65 20 6a 6f 75 72  r main-file jour
2e5a0 6e 61 6c 2c 20 74 68 69 73 20 66 75 6e 63 74 69  nal, this functi
2e5b0 6f 6e 20 77 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a  on will open.  *
2e5c0 2a 20 61 20 66 69 6c 65 2d 64 65 73 63 72 69 70  * a file-descrip
2e5d0 74 6f 72 20 6f 6e 20 74 68 65 20 64 69 72 65 63  tor on the direc
2e5e0 74 6f 72 79 20 74 6f 6f 2e 20 54 68 65 20 66 69  tory too. The fi
2e5f0 72 73 74 20 74 69 6d 65 20 75 6e 69 78 53 79 6e  rst time unixSyn
2e600 63 28 29 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c  c().  ** is call
2e610 65 64 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ed the directory
2e620 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2e630 20 77 69 6c 6c 20 62 65 20 66 73 79 6e 63 28 29   will be fsync()
2e640 65 64 20 61 6e 64 20 63 6c 6f 73 65 28 29 64 2e  ed and close()d.
2e650 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63  .  */.  int sync
2e660 44 69 72 20 3d 20 28 69 73 43 72 65 61 74 65 20  Dir = (isCreate 
2e670 26 26 20 28 0a 20 20 20 20 20 20 20 20 65 54 79  && (.        eTy
2e680 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
2e690 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a  MASTER_JOURNAL .
2e6a0 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
2e6b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
2e6c0 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c  JOURNAL .     ||
2e6d0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2e6e0 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a 0a 20  PEN_WAL.  ));.. 
2e6f0 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20   /* If argument 
2e700 7a 50 61 74 68 20 69 73 20 61 20 4e 55 4c 4c 20  zPath is a NULL 
2e710 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75  pointer, this fu
2e720 6e 63 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72  nction is requir
2e730 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20  ed to open.  ** 
2e740 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
2e750 2e 20 55 73 65 20 74 68 69 73 20 62 75 66 66 65  . Use this buffe
2e760 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66  r to store the f
2e770 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a  ile name in..  *
2e780 2f 0a 20 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d  /.  char zTmpnam
2e790 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32  e[MAX_PATHNAME+2
2e7a0 5d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ];.  const char 
2e7b0 2a 7a 4e 61 6d 65 20 3d 20 7a 50 61 74 68 3b 0a  *zName = zPath;.
2e7c0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20  .  /* Check the 
2e7d0 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d  following statem
2e7e0 65 6e 74 73 20 61 72 65 20 74 72 75 65 3a 20 0a  ents are true: .
2e7f0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20    **.  **   (a) 
2e800 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74  Exactly one of t
2e810 68 65 20 52 45 41 44 57 52 49 54 45 20 61 6e 64  he READWRITE and
2e820 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20   READONLY flags 
2e830 6d 75 73 74 20 62 65 20 73 65 74 2c 20 61 6e 64  must be set, and
2e840 20 0a 20 20 2a 2a 20 20 20 28 62 29 20 69 66 20   .  **   (b) if 
2e850 43 52 45 41 54 45 20 69 73 20 73 65 74 2c 20 74  CREATE is set, t
2e860 68 65 6e 20 52 45 41 44 57 52 49 54 45 20 6d 75  hen READWRITE mu
2e870 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2c 20  st also be set, 
2e880 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 69  and.  **   (c) i
2e890 66 20 45 58 43 4c 55 53 49 56 45 20 69 73 20 73  f EXCLUSIVE is s
2e8a0 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20  et, then CREATE 
2e8b0 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74  must also be set
2e8c0 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20 69 66 20  ..  **   (d) if 
2e8d0 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73  DELETEONCLOSE is
2e8e0 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54   set, then CREAT
2e8f0 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73  E must also be s
2e900 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  et..  */.  asser
2e910 74 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30  t((isReadonly==0
2e920 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 3d   || isReadWrite=
2e930 3d 30 29 20 26 26 20 28 69 73 52 65 61 64 57 72  =0) && (isReadWr
2e940 69 74 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c  ite || isReadonl
2e950 79 29 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  y));.  assert(is
2e960 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52  Create==0 || isR
2e970 65 61 64 57 72 69 74 65 29 3b 0a 20 20 61 73 73  eadWrite);.  ass
2e980 65 72 74 28 69 73 45 78 63 6c 75 73 69 76 65 3d  ert(isExclusive=
2e990 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b  =0 || isCreate);
2e9a0 0a 20 20 61 73 73 65 72 74 28 69 73 44 65 6c 65  .  assert(isDele
2e9b0 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74  te==0 || isCreat
2e9c0 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61  e);..  /* The ma
2e9d0 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72  in DB, main jour
2e9e0 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e  nal, WAL file an
2e9f0 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  d master journal
2ea00 20 61 72 65 20 6e 65 76 65 72 20 0a 20 20 2a 2a   are never .  **
2ea10 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
2ea20 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72 65 20  eleted. Nor are 
2ea30 74 68 65 79 20 65 76 65 72 20 74 65 6d 70 6f 72  they ever tempor
2ea40 61 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20  ary files.  */. 
2ea50 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
2ea60 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
2ea70 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
2ea80 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20  PEN_MAIN_DB );. 
2ea90 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
2eaa0 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
2eab0 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
2eac0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
2ead0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21   );.  assert( (!
2eae0 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
2eaf0 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
2eb00 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
2eb10 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73  JOURNAL );.  ass
2eb20 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
2eb30 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
2eb40 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
2eb50 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73  WAL );..  /* Ass
2eb60 65 72 74 20 74 68 61 74 20 74 68 65 20 75 70 70  ert that the upp
2eb70 65 72 20 6c 61 79 65 72 20 68 61 73 20 73 65 74  er layer has set
2eb80 20 6f 6e 65 20 6f 66 20 74 68 65 20 22 66 69 6c   one of the "fil
2eb90 65 2d 74 79 70 65 22 20 66 6c 61 67 73 2e 20 2a  e-type" flags. *
2eba0 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  /.  assert( eTyp
2ebb0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
2ebc0 41 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 65  AIN_DB      || e
2ebd0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
2ebe0 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20 20 20  N_TEMP_DB .     
2ebf0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
2ec00 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
2ec10 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53  RNAL || eType==S
2ec20 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
2ec30 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20  JOURNAL .       
2ec40 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
2ec50 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c  _OPEN_SUBJOURNAL
2ec60 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
2ec70 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
2ec80 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20  JOURNAL .       
2ec90 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
2eca0 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f  _OPEN_TRANSIENT_
2ecb0 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c  DB || eType==SQL
2ecc0 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29  ITE_OPEN_WAL.  )
2ecd0 3b 0a 0a 20 20 2f 2a 20 44 65 74 65 63 74 20 61  ;..  /* Detect a
2ece0 20 70 69 64 20 63 68 61 6e 67 65 20 61 6e 64 20   pid change and 
2ecf0 72 65 73 65 74 20 74 68 65 20 50 52 4e 47 2e 20  reset the PRNG. 
2ed00 20 54 68 65 72 65 20 69 73 20 61 20 72 61 63 65   There is a race
2ed10 20 63 6f 6e 64 69 74 69 6f 6e 0a 20 20 2a 2a 20   condition.  ** 
2ed20 68 65 72 65 20 73 75 63 68 20 74 68 61 74 20 74  here such that t
2ed30 77 6f 20 6f 72 20 6d 6f 72 65 20 74 68 72 65 61  wo or more threa
2ed40 64 73 20 61 6c 6c 20 74 72 79 69 6e 67 20 74 6f  ds all trying to
2ed50 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 73 20   open databases 
2ed60 61 74 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d 65  at.  ** the same
2ed70 20 69 6e 73 74 61 6e 74 20 6d 69 67 68 74 20 61   instant might a
2ed80 6c 6c 20 72 65 73 65 74 20 74 68 65 20 50 52 4e  ll reset the PRN
2ed90 47 2e 20 20 42 75 74 20 6d 75 6c 74 69 70 6c 65  G.  But multiple
2eda0 20 72 65 73 65 74 73 0a 20 20 2a 2a 20 61 72 65   resets.  ** are
2edb0 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a   harmless..  */.
2edc0 20 20 69 66 28 20 72 61 6e 64 6f 6d 6e 65 73 73    if( randomness
2edd0 50 69 64 21 3d 6f 73 47 65 74 70 69 64 28 30 29  Pid!=osGetpid(0)
2ede0 20 29 7b 0a 20 20 20 20 72 61 6e 64 6f 6d 6e 65   ){.    randomne
2edf0 73 73 50 69 64 20 3d 20 6f 73 47 65 74 70 69 64  ssPid = osGetpid
2ee00 28 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (0);.    sqlite3
2ee10 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 30 2c 30 29  _randomness(0,0)
2ee20 3b 0a 20 20 7d 0a 0a 20 20 6d 65 6d 73 65 74 28  ;.  }..  memset(
2ee30 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69  p, 0, sizeof(uni
2ee40 78 46 69 6c 65 29 29 3b 0a 0a 20 20 69 66 28 20  xFile));..  if( 
2ee50 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2ee60 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20  EN_MAIN_DB ){.  
2ee70 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
2ee80 70 55 6e 75 73 65 64 3b 0a 20 20 20 20 70 55 6e  pUnused;.    pUn
2ee90 75 73 65 64 20 3d 20 66 69 6e 64 52 65 75 73 61  used = findReusa
2eea0 62 6c 65 46 64 28 7a 4e 61 6d 65 2c 20 66 6c 61  bleFd(zName, fla
2eeb0 67 73 29 3b 0a 20 20 20 20 69 66 28 20 70 55 6e  gs);.    if( pUn
2eec0 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 66 64  used ){.      fd
2eed0 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b 0a   = pUnused->fd;.
2eee0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2eef0 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69 74   pUnused = sqlit
2ef00 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 69 7a 65  e3_malloc64(size
2ef10 6f 66 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20  of(*pUnused));. 
2ef20 20 20 20 20 20 69 66 28 20 21 70 55 6e 75 73 65       if( !pUnuse
2ef30 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  d ){.        ret
2ef40 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2ef50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2ef60 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 20 3d      p->pUnused =
2ef70 20 70 55 6e 75 73 65 64 3b 0a 0a 20 20 20 20 2f   pUnused;..    /
2ef80 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e  * Database filen
2ef90 61 6d 65 73 20 61 72 65 20 64 6f 75 62 6c 65 2d  ames are double-
2efa0 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74 65 64 20  zero terminated 
2efb0 69 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a  if they are not.
2efc0 20 20 20 20 2a 2a 20 55 52 49 73 20 77 69 74 68      ** URIs with
2efd0 20 70 61 72 61 6d 65 74 65 72 73 2e 20 20 48 65   parameters.  He
2efe0 6e 63 65 2c 20 74 68 65 79 20 63 61 6e 20 61 6c  nce, they can al
2eff0 77 61 79 73 20 62 65 20 70 61 73 73 65 64 20 69  ways be passed i
2f000 6e 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  nto.    ** sqlit
2f010 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72  e3_uri_parameter
2f020 28 29 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  (). */.    asser
2f030 74 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  t( (flags & SQLI
2f040 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20 7c 7c 20  TE_OPEN_URI) || 
2f050 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e 61  zName[strlen(zNa
2f060 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20  me)+1]==0 );..  
2f070 7d 65 6c 73 65 20 69 66 28 20 21 7a 4e 61 6d 65  }else if( !zName
2f080 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e   ){.    /* If zN
2f090 61 6d 65 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ame is NULL, the
2f0a0 20 75 70 70 65 72 20 6c 61 79 65 72 20 69 73 20   upper layer is 
2f0b0 72 65 71 75 65 73 74 69 6e 67 20 61 20 74 65 6d  requesting a tem
2f0c0 70 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61  p file. */.    a
2f0d0 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 20 26  ssert(isDelete &
2f0e0 26 20 21 73 79 6e 63 44 69 72 29 3b 0a 20 20 20  & !syncDir);.   
2f0f0 20 72 63 20 3d 20 75 6e 69 78 47 65 74 54 65 6d   rc = unixGetTem
2f100 70 6e 61 6d 65 28 70 56 66 73 2d 3e 6d 78 50 61  pname(pVfs->mxPa
2f110 74 68 6e 61 6d 65 2c 20 7a 54 6d 70 6e 61 6d 65  thname, zTmpname
2f120 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2f130 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2f140 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2f150 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a   }.    zName = z
2f160 54 6d 70 6e 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a  Tmpname;..    /*
2f170 20 47 65 6e 65 72 61 74 65 64 20 74 65 6d 70 6f   Generated tempo
2f180 72 61 72 79 20 66 69 6c 65 6e 61 6d 65 73 20 61  rary filenames a
2f190 72 65 20 61 6c 77 61 79 73 20 64 6f 75 62 6c 65  re always double
2f1a0 2d 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74 65 64  -zero terminated
2f1b0 0a 20 20 20 20 2a 2a 20 66 6f 72 20 75 73 65 20  .    ** for use 
2f1c0 62 79 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70  by sqlite3_uri_p
2f1d0 61 72 61 6d 65 74 65 72 28 29 2e 20 2a 2f 0a 20  arameter(). */. 
2f1e0 20 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65     assert( zName
2f1f0 5b 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31  [strlen(zName)+1
2f200 5d 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ]==0 );.  }..  /
2f210 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20  * Determine the 
2f220 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66 6c 61  value of the fla
2f230 67 73 20 70 61 72 61 6d 65 74 65 72 20 70 61 73  gs parameter pas
2f240 73 65 64 20 74 6f 20 50 4f 53 49 58 20 66 75 6e  sed to POSIX fun
2f250 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65 6e 28  ction.  ** open(
2f260 29 2e 20 54 68 65 73 65 20 6d 75 73 74 20 62 65  ). These must be
2f270 20 63 61 6c 63 75 6c 61 74 65 64 20 65 76 65 6e   calculated even
2f280 20 69 66 20 6f 70 65 6e 28 29 20 69 73 20 6e 6f   if open() is no
2f290 74 20 63 61 6c 6c 65 64 2c 20 61 73 0a 20 20 2a  t called, as.  *
2f2a0 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20 73 74  * they may be st
2f2b0 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  ored as part of 
2f2c0 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  the file handle 
2f2d0 61 6e 64 20 75 73 65 64 20 62 79 20 74 68 65 20  and used by the 
2f2e0 0a 20 20 2a 2a 20 27 63 6f 6e 63 68 20 66 69 6c  .  ** 'conch fil
2f2f0 65 27 20 6c 6f 63 6b 69 6e 67 20 66 75 6e 63 74  e' locking funct
2f300 69 6f 6e 73 20 6c 61 74 65 72 20 6f 6e 2e 20 20  ions later on.  
2f310 2a 2f 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f  */.  if( isReado
2f320 6e 6c 79 20 29 20 20 6f 70 65 6e 46 6c 61 67 73  nly )  openFlags
2f330 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20   |= O_RDONLY;.  
2f340 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20  if( isReadWrite 
2f350 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f  ) openFlags |= O
2f360 5f 52 44 57 52 3b 0a 20 20 69 66 28 20 69 73 43  _RDWR;.  if( isC
2f370 72 65 61 74 65 20 29 20 20 20 20 6f 70 65 6e 46  reate )    openF
2f380 6c 61 67 73 20 7c 3d 20 4f 5f 43 52 45 41 54 3b  lags |= O_CREAT;
2f390 0a 20 20 69 66 28 20 69 73 45 78 63 6c 75 73 69  .  if( isExclusi
2f3a0 76 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c  ve ) openFlags |
2f3b0 3d 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f  = (O_EXCL|O_NOFO
2f3c0 4c 4c 4f 57 29 3b 0a 20 20 6f 70 65 6e 46 6c 61  LLOW);.  openFla
2f3d0 67 73 20 7c 3d 20 28 4f 5f 4c 41 52 47 45 46 49  gs |= (O_LARGEFI
2f3e0 4c 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 0a 20  LE|O_BINARY);.. 
2f3f0 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
2f400 20 6d 6f 64 65 5f 74 20 6f 70 65 6e 4d 6f 64 65   mode_t openMode
2f410 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2f420 2a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f  * Permissions to
2f430 20 63 72 65 61 74 65 20 66 69 6c 65 20 77 69 74   create file wit
2f440 68 20 2a 2f 0a 20 20 20 20 75 69 64 5f 74 20 75  h */.    uid_t u
2f450 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
2f460 20 20 20 20 20 20 20 2f 2a 20 55 73 65 72 69 64         /* Userid
2f470 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 2a 2f   for the file */
2f480 0a 20 20 20 20 67 69 64 5f 74 20 67 69 64 3b 20  .    gid_t gid; 
2f490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f4a0 20 20 20 2f 2a 20 47 72 6f 75 70 69 64 20 66 6f     /* Groupid fo
2f4b0 72 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  r the file */.  
2f4c0 20 20 72 63 20 3d 20 66 69 6e 64 43 72 65 61 74    rc = findCreat
2f4d0 65 46 69 6c 65 4d 6f 64 65 28 7a 4e 61 6d 65 2c  eFileMode(zName,
2f4e0 20 66 6c 61 67 73 2c 20 26 6f 70 65 6e 4d 6f 64   flags, &openMod
2f4f0 65 2c 20 26 75 69 64 2c 20 26 67 69 64 29 3b 0a  e, &uid, &gid);.
2f500 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2f510 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
2f520 73 73 65 72 74 28 20 21 70 2d 3e 70 55 6e 75 73  ssert( !p->pUnus
2f530 65 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ed );.      asse
2f540 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54  rt( eType==SQLIT
2f550 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c 7c 20 65 54  E_OPEN_WAL || eT
2f560 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
2f570 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b  _MAIN_JOURNAL );
2f580 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
2f590 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 64 20 3d  ;.    }.    fd =
2f5a0 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61   robust_open(zNa
2f5b0 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f  me, openFlags, o
2f5c0 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 4f 53  penMode);.    OS
2f5d0 54 52 41 43 45 28 28 22 4f 50 45 4e 58 20 20 20  TRACE(("OPENX   
2f5e0 25 2d 33 64 20 25 73 20 30 25 6f 5c 6e 22 2c 20  %-3d %s 0%o\n", 
2f5f0 66 64 2c 20 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46  fd, zName, openF
2f600 6c 61 67 73 29 29 3b 0a 20 20 20 20 61 73 73 65  lags));.    asse
2f610 72 74 28 20 21 69 73 45 78 63 6c 75 73 69 76 65  rt( !isExclusive
2f620 20 7c 7c 20 28 6f 70 65 6e 46 6c 61 67 73 20 26   || (openFlags &
2f630 20 4f 5f 43 52 45 41 54 29 21 3d 30 20 29 3b 0a   O_CREAT)!=0 );.
2f640 20 20 20 20 69 66 28 20 66 64 3c 30 20 26 26 20      if( fd<0 && 
2f650 65 72 72 6e 6f 21 3d 45 49 53 44 49 52 20 26 26  errno!=EISDIR &&
2f660 20 69 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a   isReadWrite ){.
2f670 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 65 64 20        /* Failed 
2f680 74 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65  to open the file
2f690 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
2f6a0 61 63 63 65 73 73 2e 20 54 72 79 20 72 65 61 64  access. Try read
2f6b0 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20  -only. */.      
2f6c0 66 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c 49 54  flags &= ~(SQLIT
2f6d0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
2f6e0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
2f6f0 41 54 45 29 3b 0a 20 20 20 20 20 20 6f 70 65 6e  ATE);.      open
2f700 46 6c 61 67 73 20 26 3d 20 7e 28 4f 5f 52 44 57  Flags &= ~(O_RDW
2f710 52 7c 4f 5f 43 52 45 41 54 29 3b 0a 20 20 20 20  R|O_CREAT);.    
2f720 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
2f730 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b  E_OPEN_READONLY;
2f740 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73  .      openFlags
2f750 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20   |= O_RDONLY;.  
2f760 20 20 20 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d      isReadonly =
2f770 20 31 3b 0a 20 20 20 20 20 20 66 64 20 3d 20 72   1;.      fd = r
2f780 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65  obust_open(zName
2f790 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65  , openFlags, ope
2f7a0 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20  nMode);.    }.  
2f7b0 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
2f7c0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
2f7d0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
2f7e0 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65  TOPEN_BKPT, "ope
2f7f0 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  n", zName);.    
2f800 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69    goto open_fini
2f810 73 68 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  shed;.    }..   
2f820 20 2f 2a 20 49 66 20 74 68 69 73 20 70 72 6f 63   /* If this proc
2f830 65 73 73 20 69 73 20 72 75 6e 6e 69 6e 67 20 61  ess is running a
2f840 73 20 72 6f 6f 74 20 61 6e 64 20 69 66 20 63 72  s root and if cr
2f850 65 61 74 69 6e 67 20 61 20 6e 65 77 20 72 6f 6c  eating a new rol
2f860 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6a 6f 75  lback.    ** jou
2f870 72 6e 61 6c 20 6f 72 20 57 41 4c 20 66 69 6c 65  rnal or WAL file
2f880 2c 20 73 65 74 20 74 68 65 20 6f 77 6e 65 72 73  , set the owners
2f890 68 69 70 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  hip of the journ
2f8a0 61 6c 20 6f 72 20 57 41 4c 20 74 6f 20 62 65 0a  al or WAL to be.
2f8b0 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20      ** the same 
2f8c0 61 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  as the original 
2f8d0 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f  database..    */
2f8e0 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26  .    if( flags &
2f8f0 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41   (SQLITE_OPEN_WA
2f900 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  L|SQLITE_OPEN_MA
2f910 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20  IN_JOURNAL) ){. 
2f920 20 20 20 20 20 72 6f 62 75 73 74 46 63 68 6f 77       robustFchow
2f930 6e 28 66 64 2c 20 75 69 64 2c 20 67 69 64 29 3b  n(fd, uid, gid);
2f940 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
2f950 65 72 74 28 20 66 64 3e 3d 30 20 29 3b 0a 20 20  ert( fd>=0 );.  
2f960 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29 7b  if( pOutFlags ){
2f970 0a 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20  .    *pOutFlags 
2f980 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20  = flags;.  }..  
2f990 69 66 28 20 70 2d 3e 70 55 6e 75 73 65 64 20 29  if( p->pUnused )
2f9a0 7b 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64  {.    p->pUnused
2f9b0 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 20 20 70  ->fd = fd;.    p
2f9c0 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73  ->pUnused->flags
2f9d0 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20   = flags;.  }.. 
2f9e0 20 69 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b   if( isDelete ){
2f9f0 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
2fa00 20 20 20 20 7a 50 61 74 68 20 3d 20 7a 4e 61 6d      zPath = zNam
2fa10 65 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  e;.#elif defined
2fa20 28 53 51 4c 49 54 45 5f 55 4e 4c 49 4e 4b 5f 41  (SQLITE_UNLINK_A
2fa30 46 54 45 52 5f 43 4c 4f 53 45 29 0a 20 20 20 20  FTER_CLOSE).    
2fa40 7a 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 5f  zPath = sqlite3_
2fa50 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 4e  mprintf("%s", zN
2fa60 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 50  ame);.    if( zP
2fa70 61 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ath==0 ){.      
2fa80 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20  robust_close(p, 
2fa90 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
2faa0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2fab0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
2fac0 23 65 6c 73 65 0a 20 20 20 20 6f 73 55 6e 6c 69  #else.    osUnli
2fad0 6e 6b 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e 64 69  nk(zName);.#endi
2fae0 66 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45  f.  }.#if SQLITE
2faf0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2fb00 53 54 59 4c 45 0a 20 20 65 6c 73 65 7b 0a 20 20  STYLE.  else{.  
2fb10 20 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d    p->openFlags =
2fb20 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a   openFlags;.  }.
2fb30 23 65 6e 64 69 66 0a 0a 20 20 6e 6f 4c 6f 63 6b  #endif..  noLock
2fb40 20 3d 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45   = eType!=SQLITE
2fb50 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 0a  _OPEN_MAIN_DB;..
2fb60 20 20 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f    .#if defined(_
2fb70 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c  _APPLE__) || SQL
2fb80 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2fb90 4e 47 5f 53 54 59 4c 45 0a 20 20 69 66 28 20 66  NG_STYLE.  if( f
2fba0 73 74 61 74 66 73 28 66 64 2c 20 26 66 73 49 6e  statfs(fd, &fsIn
2fbb0 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20  fo) == -1 ){.   
2fbc0 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
2fbd0 70 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72  p, errno);.    r
2fbe0 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66  obust_close(p, f
2fbf0 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  d, __LINE__);.  
2fc00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2fc10 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20  IOERR_ACCESS;.  
2fc20 7d 0a 20 20 69 66 20 28 30 20 3d 3d 20 73 74 72  }.  if (0 == str
2fc30 6e 63 6d 70 28 22 6d 73 64 6f 73 22 2c 20 66 73  ncmp("msdos", fs
2fc40 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d  Info.f_fstypenam
2fc50 65 2c 20 35 29 29 20 7b 0a 20 20 20 20 28 28 75  e, 5)) {.    ((u
2fc60 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d  nixFile*)pFile)-
2fc70 3e 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49  >fsFlags |= SQLI
2fc80 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53  TE_FSFLAGS_IS_MS
2fc90 44 4f 53 3b 0a 20 20 7d 0a 20 20 69 66 20 28 30  DOS;.  }.  if (0
2fca0 20 3d 3d 20 73 74 72 6e 63 6d 70 28 22 65 78 66   == strncmp("exf
2fcb0 61 74 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66 73  at", fsInfo.f_fs
2fcc0 74 79 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b 0a  typename, 5)) {.
2fcd0 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29      ((unixFile*)
2fce0 70 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67 73 20  pFile)->fsFlags 
2fcf0 7c 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47  |= SQLITE_FSFLAG
2fd00 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a  S_IS_MSDOS;.  }.
2fd10 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74  #endif..  /* Set
2fd20 20 75 70 20 61 70 70 72 6f 70 72 69 61 74 65 20   up appropriate 
2fd30 63 74 72 6c 46 6c 61 67 73 20 2a 2f 0a 20 20 69  ctrlFlags */.  i
2fd40 66 28 20 69 73 44 65 6c 65 74 65 20 29 20 20 20  f( isDelete )   
2fd50 20 20 20 20 20 20 20 20 20 20 20 20 20 63 74 72               ctr
2fd60 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
2fd70 4c 45 5f 44 45 4c 45 54 45 3b 0a 20 20 69 66 28  LE_DELETE;.  if(
2fd80 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20 20 20   isReadonly )   
2fd90 20 20 20 20 20 20 20 20 20 20 20 63 74 72 6c 46             ctrlF
2fda0 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
2fdb0 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 6e  _RDONLY;.  if( n
2fdc0 6f 4c 6f 63 6b 20 29 20 20 20 20 20 20 20 20 20  oLock )         
2fdd0 20 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61           ctrlFla
2fde0 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 4e  gs |= UNIXFILE_N
2fdf0 4f 4c 4f 43 4b 3b 0a 20 20 69 66 28 20 73 79 6e  OLOCK;.  if( syn
2fe00 63 44 69 72 20 29 20 20 20 20 20 20 20 20 20 20  cDir )          
2fe10 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73         ctrlFlags
2fe20 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44 49 52   |= UNIXFILE_DIR
2fe30 53 59 4e 43 3b 0a 20 20 69 66 28 20 66 6c 61 67  SYNC;.  if( flag
2fe40 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
2fe50 55 52 49 20 29 20 63 74 72 6c 46 6c 61 67 73 20  URI ) ctrlFlags 
2fe60 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 3b  |= UNIXFILE_URI;
2fe70 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ..#if SQLITE_ENA
2fe80 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2fe90 45 0a 23 69 66 20 53 51 4c 49 54 45 5f 50 52 45  E.#if SQLITE_PRE
2fea0 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  FER_PROXY_LOCKIN
2feb0 47 0a 20 20 69 73 41 75 74 6f 50 72 6f 78 79 20  G.  isAutoProxy 
2fec0 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  = 1;.#endif.  if
2fed0 28 20 69 73 41 75 74 6f 50 72 6f 78 79 20 26 26  ( isAutoProxy &&
2fee0 20 28 7a 50 61 74 68 21 3d 4e 55 4c 4c 29 20 26   (zPath!=NULL) &
2fef0 26 20 28 21 6e 6f 4c 6f 63 6b 29 20 26 26 20 70  & (!noLock) && p
2ff00 56 66 73 2d 3e 78 4f 70 65 6e 20 29 7b 0a 20 20  Vfs->xOpen ){.  
2ff10 20 20 63 68 61 72 20 2a 65 6e 76 66 6f 72 63 65    char *envforce
2ff20 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54   = getenv("SQLIT
2ff30 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f  E_FORCE_PROXY_LO
2ff40 43 4b 49 4e 47 22 29 3b 0a 20 20 20 20 69 6e 74  CKING");.    int
2ff50 20 75 73 65 50 72 6f 78 79 20 3d 20 30 3b 0a 0a   useProxy = 0;..
2ff60 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f      /* SQLITE_FO
2ff70 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  RCE_PROXY_LOCKIN
2ff80 47 3d 3d 31 20 6d 65 61 6e 73 20 66 6f 72 63 65  G==1 means force
2ff90 20 61 6c 77 61 79 73 20 75 73 65 20 70 72 6f 78   always use prox
2ffa0 79 2c 20 30 20 6d 65 61 6e 73 20 0a 20 20 20 20  y, 0 means .    
2ffb0 2a 2a 20 6e 65 76 65 72 20 75 73 65 20 70 72 6f  ** never use pro
2ffc0 78 79 2c 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 75  xy, NULL means u
2ffd0 73 65 20 70 72 6f 78 79 20 66 6f 72 20 6e 6f 6e  se proxy for non
2ffe0 2d 6c 6f 63 61 6c 20 66 69 6c 65 73 20 6f 6e 6c  -local files onl
2fff0 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65  y.  */.    if( e
30000 6e 76 66 6f 72 63 65 21 3d 4e 55 4c 4c 20 29 7b  nvforce!=NULL ){
30010 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78 79 20  .      useProxy 
30020 3d 20 61 74 6f 69 28 65 6e 76 66 6f 72 63 65 29  = atoi(envforce)
30030 3e 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  >0;.    }else{. 
30040 20 20 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20       useProxy = 
30050 21 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73  !(fsInfo.f_flags
30060 26 4d 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20 20 20  &MNT_LOCAL);.   
30070 20 7d 0a 20 20 20 20 69 66 28 20 75 73 65 50 72   }.    if( usePr
30080 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20  oxy ){.      rc 
30090 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  = fillInUnixFile
300a0 28 70 56 66 73 2c 20 66 64 2c 20 70 46 69 6c 65  (pVfs, fd, pFile
300b0 2c 20 7a 50 61 74 68 2c 20 63 74 72 6c 46 6c 61  , zPath, ctrlFla
300c0 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  gs);.      if( r
300d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
300e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f          rc = pro
300f0 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46  xyTransformUnixF
30100 69 6c 65 28 28 75 6e 69 78 46 69 6c 65 2a 29 70  ile((unixFile*)p
30110 46 69 6c 65 2c 20 22 3a 61 75 74 6f 3a 22 29 3b  File, ":auto:");
30120 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
30130 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30140 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 75          /* Use u
30150 6e 69 78 43 6c 6f 73 65 20 74 6f 20 63 6c 65 61  nixClose to clea
30160 6e 20 75 70 20 74 68 65 20 72 65 73 6f 75 72 63  n up the resourc
30170 65 73 20 61 64 64 65 64 20 69 6e 20 66 69 6c 6c  es added in fill
30180 49 6e 55 6e 69 78 46 69 6c 65 20 0a 20 20 20 20  InUnixFile .    
30190 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 63 6c 65        ** and cle
301a0 61 72 20 61 6c 6c 20 74 68 65 20 73 74 72 75 63  ar all the struc
301b0 74 75 72 65 27 73 20 72 65 66 65 72 65 6e 63 65  ture's reference
301c0 73 2e 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79  s.  Specifically
301d0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  , .          ** 
301e0 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20  pFile->pMethods 
301f0 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 73 6f 20  will be NULL so 
30200 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 20 77  sqlite3OsClose w
30210 69 6c 6c 20 62 65 20 61 20 6e 6f 2d 6f 70 20 0a  ill be a no-op .
30220 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
30230 20 20 20 20 20 20 20 75 6e 69 78 43 6c 6f 73 65         unixClose
30240 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20  (pFile);.       
30250 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
30260 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
30270 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f        goto open_
30280 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a  finished;.    }.
30290 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
302a0 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46  rc = fillInUnixF
302b0 69 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 70 46  ile(pVfs, fd, pF
302c0 69 6c 65 2c 20 7a 50 61 74 68 2c 20 63 74 72 6c  ile, zPath, ctrl
302d0 46 6c 61 67 73 29 3b 0a 0a 6f 70 65 6e 5f 66 69  Flags);..open_fi
302e0 6e 69 73 68 65 64 3a 0a 20 20 69 66 28 20 72 63  nished:.  if( rc
302f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
30300 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
30310 70 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20 7d  p->pUnused);.  }
30320 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
30330 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
30340 68 65 20 66 69 6c 65 20 61 74 20 7a 50 61 74 68  he file at zPath
30350 2e 20 49 66 20 74 68 65 20 64 69 72 53 79 6e 63  . If the dirSync
30360 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75   argument is tru
30370 65 2c 20 66 73 79 6e 63 28 29 0a 2a 2a 20 74 68  e, fsync().** th
30380 65 20 64 69 72 65 63 74 6f 72 79 20 61 66 74 65  e directory afte
30390 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66  r deleting the f
303a0 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
303b0 6e 74 20 75 6e 69 78 44 65 6c 65 74 65 28 0a 20  nt unixDelete(. 
303c0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f   sqlite3_vfs *No
303d0 74 55 73 65 64 2c 20 20 20 20 20 2f 2a 20 56 46  tUsed,     /* VF
303e0 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69  S containing thi
303f0 73 20 61 73 20 74 68 65 20 78 44 65 6c 65 74 65  s as the xDelete
30400 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e   method */.  con
30410 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
30420 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
30430 66 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c  f file to be del
30440 65 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69  eted */.  int di
30450 72 53 79 6e 63 20 20 20 20 20 20 20 20 20 20 20  rSync           
30460 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
30470 66 73 79 6e 63 28 29 20 64 69 72 65 63 74 6f 72  fsync() director
30480 79 20 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67  y after deleting
30490 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   file */.){.  in
304a0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
304b0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
304c0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
304d0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
304e0 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49  (return SQLITE_I
304f0 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20  OERR_DELETE);.  
30500 69 66 28 20 6f 73 55 6e 6c 69 6e 6b 28 7a 50 61  if( osUnlink(zPa
30510 74 68 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  th)==(-1) ){.   
30520 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45   if( errno==ENOE
30530 4e 54 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  NT.#if OS_VXWORK
30540 53 0a 20 20 20 20 20 20 20 20 7c 7c 20 6f 73 41  S.        || osA
30550 63 63 65 73 73 28 7a 50 61 74 68 2c 30 29 21 3d  ccess(zPath,0)!=
30560 30 0a 23 65 6e 64 69 66 0a 20 20 20 20 29 7b 0a  0.#endif.    ){.
30570 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
30580 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
30590 4f 45 4e 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OENT;.    }else{
305a0 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78  .      rc = unix
305b0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
305c0 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 22 75  IOERR_DELETE, "u
305d0 6e 6c 69 6e 6b 22 2c 20 7a 50 61 74 68 29 3b 0a  nlink", zPath);.
305e0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
305f0 20 72 63 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66   rc;.  }.#ifndef
30600 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f   SQLITE_DISABLE_
30610 44 49 52 53 59 4e 43 0a 20 20 69 66 28 20 28 64  DIRSYNC.  if( (d
30620 69 72 53 79 6e 63 20 26 20 31 29 21 3d 30 20 29  irSync & 1)!=0 )
30630 7b 0a 20 20 20 20 69 6e 74 20 66 64 3b 0a 20 20  {.    int fd;.  
30640 20 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72    rc = osOpenDir
30650 65 63 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 66  ectory(zPath, &f
30660 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
30670 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66  SQLITE_OK ){.#if
30680 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20   OS_VXWORKS.    
30690 20 20 69 66 28 20 66 73 79 6e 63 28 66 64 29 3d    if( fsync(fd)=
306a0 3d 2d 31 20 29 0a 23 65 6c 73 65 0a 20 20 20 20  =-1 ).#else.    
306b0 20 20 69 66 28 20 66 73 79 6e 63 28 66 64 29 20    if( fsync(fd) 
306c0 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b  ).#endif.      {
306d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e  .        rc = un
306e0 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
306f0 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e  E_IOERR_DIR_FSYN
30700 43 2c 20 22 66 73 79 6e 63 22 2c 20 7a 50 61 74  C, "fsync", zPat
30710 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  h);.      }.    
30720 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 30    robust_close(0
30730 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  , fd, __LINE__);
30740 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
30750 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
30760 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 3b  LITE_CANTOPEN );
30770 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
30780 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
30790 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
307a0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65   rc;.}../*.** Te
307b0 73 74 20 74 68 65 20 65 78 69 73 74 65 6e 63 65  st the existence
307c0 20 6f 66 20 6f 72 20 61 63 63 65 73 73 20 70 65   of or access pe
307d0 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20 66 69 6c  rmissions of fil
307e0 65 20 7a 50 61 74 68 2e 20 54 68 65 0a 2a 2a 20  e zPath. The.** 
307f0 74 65 73 74 20 70 65 72 66 6f 72 6d 65 64 20 64  test performed d
30800 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61  epends on the va
30810 6c 75 65 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a  lue of flags:.**
30820 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41  .**     SQLITE_A
30830 43 43 45 53 53 5f 45 58 49 53 54 53 3a 20 52 65  CCESS_EXISTS: Re
30840 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69  turn 1 if the fi
30850 6c 65 20 65 78 69 73 74 73 0a 2a 2a 20 20 20 20  le exists.**    
30860 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
30870 45 41 44 57 52 49 54 45 3a 20 52 65 74 75 72 6e  EADWRITE: Return
30880 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 69   1 if the file i
30890 73 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 61  s read and writa
308a0 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 53 51 4c 49  ble..**     SQLI
308b0 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 4f 4e  TE_ACCESS_READON
308c0 4c 59 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20  LY: Return 1 if 
308d0 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 61 64  the file is read
308e0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  able..**.** Othe
308f0 72 77 69 73 65 20 72 65 74 75 72 6e 20 30 2e 0a  rwise return 0..
30900 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
30910 69 78 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69  ixAccess(.  sqli
30920 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
30930 2c 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 63  ,   /* The VFS c
30940 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 78  ontaining this x
30950 41 63 63 65 73 73 20 6d 65 74 68 6f 64 20 2a 2f  Access method */
30960 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
30970 50 61 74 68 2c 20 20 20 20 20 20 2f 2a 20 50 61  Path,      /* Pa
30980 74 68 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74  th of the file t
30990 6f 20 65 78 61 6d 69 6e 65 20 2a 2f 0a 20 20 69  o examine */.  i
309a0 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
309b0 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 64         /* What d
309c0 6f 20 77 65 20 77 61 6e 74 20 74 6f 20 6c 65 61  o we want to lea
309d0 72 6e 20 61 62 6f 75 74 20 74 68 65 20 7a 50 61  rn about the zPa
309e0 74 68 20 66 69 6c 65 3f 20 2a 2f 0a 20 20 69 6e  th file? */.  in
309f0 74 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20  t *pResOut      
30a00 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72        /* Write r
30a10 65 73 75 6c 74 20 62 6f 6f 6c 65 61 6e 20 68 65  esult boolean he
30a20 72 65 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45  re */.){.  UNUSE
30a30 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
30a40 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  sed);.  Simulate
30a50 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
30a60 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43  SQLITE_IOERR_ACC
30a70 45 53 53 3b 20 29 3b 0a 20 20 61 73 73 65 72 74  ESS; );.  assert
30a80 28 20 70 52 65 73 4f 75 74 21 3d 30 20 29 3b 0a  ( pResOut!=0 );.
30a90 0a 20 20 2f 2a 20 54 68 65 20 73 70 65 63 20 73  .  /* The spec s
30aa0 61 79 73 20 74 68 65 72 65 20 61 72 65 20 74 68  ays there are th
30ab0 72 65 65 20 70 6f 73 73 69 62 6c 65 20 76 61 6c  ree possible val
30ac0 75 65 73 20 66 6f 72 20 66 6c 61 67 73 2e 20 20  ues for flags.  
30ad0 42 75 74 20 6f 6e 6c 79 0a 20 20 2a 2a 20 74 77  But only.  ** tw
30ae0 6f 20 6f 66 20 74 68 65 6d 20 61 72 65 20 61 63  o of them are ac
30af0 74 75 61 6c 6c 79 20 75 73 65 64 20 2a 2f 0a 20  tually used */. 
30b00 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
30b10 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
30b20 49 53 54 53 20 7c 7c 20 66 6c 61 67 73 3d 3d 53  ISTS || flags==S
30b30 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
30b40 44 57 52 49 54 45 20 29 3b 0a 0a 20 20 69 66 28  DWRITE );..  if(
30b50 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41   flags==SQLITE_A
30b60 43 43 45 53 53 5f 45 58 49 53 54 53 20 29 7b 0a  CCESS_EXISTS ){.
30b70 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
30b80 62 75 66 3b 0a 20 20 20 20 2a 70 52 65 73 4f 75  buf;.    *pResOu
30b90 74 20 3d 20 28 30 3d 3d 6f 73 53 74 61 74 28 7a  t = (0==osStat(z
30ba0 50 61 74 68 2c 20 26 62 75 66 29 20 26 26 20 62  Path, &buf) && b
30bb0 75 66 2e 73 74 5f 73 69 7a 65 3e 30 29 3b 0a 20  uf.st_size>0);. 
30bc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 52 65   }else{.    *pRe
30bd0 73 4f 75 74 20 3d 20 6f 73 41 63 63 65 73 73 28  sOut = osAccess(
30be0 7a 50 61 74 68 2c 20 57 5f 4f 4b 7c 52 5f 4f 4b  zPath, W_OK|R_OK
30bf0 29 3d 3d 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  )==0;.  }.  retu
30c00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
30c10 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72  ../*.** Turn a r
30c20 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65  elative pathname
30c30 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74   into a full pat
30c40 68 6e 61 6d 65 2e 20 54 68 65 20 72 65 6c 61 74  hname. The relat
30c50 69 76 65 20 70 61 74 68 0a 2a 2a 20 69 73 20 73  ive path.** is s
30c60 74 6f 72 65 64 20 61 73 20 61 20 6e 75 6c 2d 74  tored as a nul-t
30c70 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
30c80 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 70   in the buffer p
30c90 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a 20  ointed to by.** 
30ca0 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f  zPath. .**.** zO
30cb0 75 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62  ut points to a b
30cc0 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73  uffer of at leas
30cd0 74 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78  t sqlite3_vfs.mx
30ce0 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73 20 0a  Pathname bytes .
30cf0 2a 2a 20 28 69 6e 20 74 68 69 73 20 63 61 73 65  ** (in this case
30d00 2c 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 62  , MAX_PATHNAME b
30d10 79 74 65 73 29 2e 20 54 68 65 20 66 75 6c 6c 2d  ytes). The full-
30d20 70 61 74 68 20 69 73 20 77 72 69 74 74 65 6e 20  path is written 
30d30 74 6f 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65  to.** this buffe
30d40 72 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  r before returni
30d50 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
30d60 74 20 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61  t unixFullPathna
30d70 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  me(.  sqlite3_vf
30d80 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
30d90 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
30da0 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a  o vfs object */.
30db0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
30dc0 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
30dd0 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61  /* Possibly rela
30de0 74 69 76 65 20 69 6e 70 75 74 20 70 61 74 68 20  tive input path 
30df0 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20 20  */.  int nOut,  
30e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e10 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75     /* Size of ou
30e20 74 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62  tput buffer in b
30e30 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ytes */.  char *
30e40 7a 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  zOut            
30e50 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
30e60 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 20  t buffer */.){. 
30e70 20 69 6e 74 20 6e 42 79 74 65 3b 0a 0a 20 20 2f   int nByte;..  /
30e80 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69  * It's odd to si
30e90 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72  mulate an io-err
30ea0 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61  or here, but rea
30eb0 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74  lly this is just
30ec0 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  .  ** using the 
30ed0 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74  io-error infrast
30ee0 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20  ructure to test 
30ef0 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64  that SQLite hand
30f00 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75  les this.  ** fu
30f10 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20  nction failing. 
30f20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
30f30 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f 72  uld fail if, for
30f40 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20   example, the.  
30f50 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69  ** current worki
30f60 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68 61 73  ng directory has
30f70 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a   been unlinked..
30f80 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49    */.  SimulateI
30f90 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
30fa0 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a  QLITE_ERROR );..
30fb0 20 20 61 73 73 65 72 74 28 20 70 56 66 73 2d 3e    assert( pVfs->
30fc0 6d 78 50 61 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f  mxPathname==MAX_
30fd0 50 41 54 48 4e 41 4d 45 20 29 3b 0a 20 20 55 4e  PATHNAME );.  UN
30fe0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
30ff0 56 66 73 29 3b 0a 0a 20 20 2f 2a 20 41 74 74 65  Vfs);..  /* Atte
31000 6d 70 74 20 74 6f 20 72 65 73 6f 6c 76 65 20 74  mpt to resolve t
31010 68 65 20 70 61 74 68 20 61 73 20 69 66 20 69 74  he path as if it
31020 20 77 65 72 65 20 61 20 73 79 6d 62 6f 6c 69 63   were a symbolic
31030 20 6c 69 6e 6b 2e 20 49 66 20 69 74 20 69 73 0a   link. If it is.
31040 20 20 2a 2a 20 61 20 73 79 6d 62 6f 6c 69 63 20    ** a symbolic 
31050 6c 69 6e 6b 2c 20 74 68 65 20 72 65 73 6f 6c 76  link, the resolv
31060 65 64 20 70 61 74 68 20 69 73 20 73 74 6f 72 65  ed path is store
31070 64 20 69 6e 20 62 75 66 66 65 72 20 7a 4f 75 74  d in buffer zOut
31080 5b 5d 2e 20 4f 72 2c 20 69 66 0a 20 20 2a 2a 20  []. Or, if.  ** 
31090 74 68 65 20 69 64 65 6e 74 69 66 69 65 64 20 66  the identified f
310a0 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 73 79 6d  ile is not a sym
310b0 62 6f 6c 69 63 20 6c 69 6e 6b 20 6f 72 20 64 6f  bolic link or do
310c0 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68  es not exist, th
310d0 65 6e 0a 20 20 2a 2a 20 7a 50 61 74 68 20 69 73  en.  ** zPath is
310e0 20 63 6f 70 69 65 64 20 64 69 72 65 63 74 6c 79   copied directly
310f0 20 69 6e 74 6f 20 7a 4f 75 74 2e 20 45 69 74 68   into zOut. Eith
31100 65 72 20 77 61 79 2c 20 6e 42 79 74 65 20 69 73  er way, nByte is
31110 20 6c 65 66 74 20 73 65 74 20 74 6f 0a 20 20 2a   left set to.  *
31120 2a 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * the size of th
31130 65 20 73 74 72 69 6e 67 20 63 6f 70 69 65 64 20  e string copied 
31140 69 6e 74 6f 20 7a 4f 75 74 5b 5d 20 69 6e 20 62  into zOut[] in b
31150 79 74 65 73 2e 20 20 2a 2f 0a 20 20 6e 42 79 74  ytes.  */.  nByt
31160 65 20 3d 20 6f 73 52 65 61 64 6c 69 6e 6b 28 7a  e = osReadlink(z
31170 50 61 74 68 2c 20 7a 4f 75 74 2c 20 6e 4f 75 74  Path, zOut, nOut
31180 2d 31 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65  -1);.  if( nByte
31190 3c 30 20 29 7b 0a 20 20 20 20 69 66 28 20 65 72  <0 ){.    if( er
311a0 72 6e 6f 21 3d 45 49 4e 56 41 4c 20 26 26 20 65  rno!=EINVAL && e
311b0 72 72 6e 6f 21 3d 45 4e 4f 45 4e 54 20 29 7b 0a  rrno!=ENOENT ){.
311c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69        return uni
311d0 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
311e0 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20  _CANTOPEN_BKPT, 
311f0 22 72 65 61 64 6c 69 6e 6b 22 2c 20 7a 50 61 74  "readlink", zPat
31200 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  h);.    }.    sq
31210 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
31220 4f 75 74 2c 20 7a 4f 75 74 2c 20 22 25 73 22 2c  Out, zOut, "%s",
31230 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 6e 42 79   zPath);.    nBy
31240 74 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  te = sqlite3Strl
31250 65 6e 33 30 28 7a 4f 75 74 29 3b 0a 20 20 7d 65  en30(zOut);.  }e
31260 6c 73 65 7b 0a 20 20 20 20 7a 4f 75 74 5b 6e 42  lse{.    zOut[nB
31270 79 74 65 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d  yte] = '\0';.  }
31280 0a 0a 20 20 2f 2a 20 49 66 20 62 75 66 66 65 72  ..  /* If buffer
31290 20 7a 4f 75 74 5b 5d 20 6e 6f 77 20 63 6f 6e 74   zOut[] now cont
312a0 61 69 6e 73 20 61 6e 20 61 62 73 6f 6c 75 74 65  ains an absolute
312b0 20 70 61 74 68 20 74 68 65 72 65 20 69 73 20 6e   path there is n
312c0 6f 74 68 69 6e 67 20 6d 6f 72 65 0a 20 20 2a 2a  othing more.  **
312d0 20 74 6f 20 64 6f 2e 20 49 66 20 69 74 20 63 6f   to do. If it co
312e0 6e 74 61 69 6e 73 20 61 20 72 65 6c 61 74 69 76  ntains a relativ
312f0 65 20 70 61 74 68 2c 20 64 6f 20 74 68 65 20 66  e path, do the f
31300 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20  ollowing:.  **. 
31310 20 2a 2a 20 20 20 2a 20 6d 6f 76 65 20 74 68 65   **   * move the
31320 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 73   relative path s
31330 74 72 69 6e 67 20 73 6f 20 74 68 61 74 20 69 74  tring so that it
31340 20 69 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f   is at the end o
31350 66 20 74 68 0a 20 20 2a 2a 20 20 20 20 20 7a 4f  f th.  **     zO
31360 75 74 5b 5d 20 62 75 66 66 65 72 2e 0a 20 20 2a  ut[] buffer..  *
31370 2a 20 20 20 2a 20 43 61 6c 6c 20 67 65 74 63 77  *   * Call getcw
31380 64 28 29 20 74 6f 20 72 65 61 64 20 74 68 65 20  d() to read the 
31390 70 61 74 68 20 6f 66 20 74 68 65 20 63 75 72 72  path of the curr
313a0 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65  ent working dire
313b0 63 74 6f 72 79 20 0a 20 20 2a 2a 20 20 20 20 20  ctory .  **     
313c0 69 6e 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  into the start o
313d0 66 20 74 68 65 20 7a 4f 75 74 5b 5d 20 62 75 66  f the zOut[] buf
313e0 66 65 72 2e 0a 20 20 2a 2a 20 20 20 2a 20 41 70  fer..  **   * Ap
313f0 70 65 6e 64 20 61 20 27 2f 27 20 63 68 61 72 61  pend a '/' chara
31400 63 74 65 72 20 74 6f 20 74 68 65 20 63 77 64 20  cter to the cwd 
31410 73 74 72 69 6e 67 20 61 6e 64 20 6d 6f 76 65 20  string and move 
31420 74 68 65 20 0a 20 20 2a 2a 20 20 20 20 20 72 65  the .  **     re
31430 6c 61 74 69 76 65 20 70 61 74 68 20 62 61 63 6b  lative path back
31440 20 77 69 74 68 69 6e 20 74 68 65 20 62 75 66 66   within the buff
31450 65 72 20 73 6f 20 74 68 61 74 20 69 74 20 69 6d  er so that it im
31460 6d 65 64 69 61 74 65 6c 79 20 0a 20 20 2a 2a 20  mediately .  ** 
31470 20 20 20 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20      follows the 
31480 27 2f 27 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  '/'..  **.  ** T
31490 68 69 73 20 63 6f 64 65 20 69 73 20 77 72 69 74  his code is writ
314a0 74 65 6e 20 73 6f 20 74 68 61 74 20 69 66 20 74  ten so that if t
314b0 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f  he combination o
314c0 66 20 74 68 65 20 43 57 44 20 61 6e 64 20 72 65  f the CWD and re
314d0 6c 61 74 69 76 65 0a 20 20 2a 2a 20 70 61 74 68  lative.  ** path
314e0 20 61 72 65 20 6c 61 72 67 65 72 20 74 68 61 6e   are larger than
314f0 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 73   the allocated s
31500 69 7a 65 20 6f 66 20 7a 4f 75 74 5b 5d 20 74 68  ize of zOut[] th
31510 65 20 43 57 44 20 69 73 20 73 69 6c 65 6e 74 6c  e CWD is silentl
31520 79 0a 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64  y.  ** truncated
31530 20 74 6f 20 6d 61 6b 65 20 69 74 20 66 69 74 2e   to make it fit.
31540 20 54 68 69 73 20 69 73 20 4f 6b 2c 20 61 73 20   This is Ok, as 
31550 53 51 4c 69 74 65 20 72 65 66 75 73 65 73 20 74  SQLite refuses t
31560 6f 20 6f 70 65 6e 20 61 6e 79 0a 20 20 2a 2a 20  o open any.  ** 
31570 66 69 6c 65 20 66 6f 72 20 77 68 69 63 68 20 74  file for which t
31580 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
31590 75 72 6e 73 20 61 20 66 75 6c 6c 20 70 61 74 68  urns a full path
315a0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 28 6e 4f   larger than (nO
315b0 75 74 2d 38 29 0a 20 20 2a 2a 20 62 79 74 65 73  ut-8).  ** bytes
315c0 20 69 6e 20 73 69 7a 65 2e 20 20 2a 2f 0a 20 20   in size.  */.  
315d0 74 65 73 74 63 61 73 65 28 20 6e 42 79 74 65 3d  testcase( nByte=
315e0 3d 6e 4f 75 74 2d 35 20 29 3b 0a 20 20 74 65 73  =nOut-5 );.  tes
315f0 74 63 61 73 65 28 20 6e 42 79 74 65 3d 3d 6e 4f  tcase( nByte==nO
31600 75 74 2d 34 20 29 3b 0a 20 20 69 66 28 20 7a 4f  ut-4 );.  if( zO
31610 75 74 5b 30 5d 21 3d 27 2f 27 20 26 26 20 6e 42  ut[0]!='/' && nB
31620 79 74 65 3c 6e 4f 75 74 2d 34 20 29 7b 0a 20 20  yte<nOut-4 ){.  
31630 20 20 69 6e 74 20 6e 43 77 64 3b 0a 20 20 20 20    int nCwd;.    
31640 69 6e 74 20 6e 52 65 6d 20 3d 20 6e 4f 75 74 2d  int nRem = nOut-
31650 6e 42 79 74 65 2d 31 3b 0a 20 20 20 20 6d 65 6d  nByte-1;.    mem
31660 6d 6f 76 65 28 26 7a 4f 75 74 5b 6e 52 65 6d 5d  move(&zOut[nRem]
31670 2c 20 7a 4f 75 74 2c 20 6e 42 79 74 65 2b 31 29  , zOut, nByte+1)
31680 3b 0a 20 20 20 20 7a 4f 75 74 5b 6e 52 65 6d 2d  ;.    zOut[nRem-
31690 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 69  1] = '\0';.    i
316a0 66 28 20 6f 73 47 65 74 63 77 64 28 7a 4f 75 74  f( osGetcwd(zOut
316b0 2c 20 6e 52 65 6d 2d 31 29 3d 3d 30 20 29 7b 0a  , nRem-1)==0 ){.
316c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69        return uni
316d0 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
316e0 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20  _CANTOPEN_BKPT, 
316f0 22 67 65 74 63 77 64 22 2c 20 7a 50 61 74 68 29  "getcwd", zPath)
31700 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 77 64  ;.    }.    nCwd
31710 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
31720 33 30 28 7a 4f 75 74 29 3b 0a 20 20 20 20 61 73  30(zOut);.    as
31730 73 65 72 74 28 20 6e 43 77 64 3c 3d 6e 52 65 6d  sert( nCwd<=nRem
31740 2d 31 20 29 3b 0a 20 20 20 20 7a 4f 75 74 5b 6e  -1 );.    zOut[n
31750 43 77 64 5d 20 3d 20 27 2f 27 3b 0a 20 20 20 20  Cwd] = '/';.    
31760 6d 65 6d 6d 6f 76 65 28 26 7a 4f 75 74 5b 6e 43  memmove(&zOut[nC
31770 77 64 2b 31 5d 2c 20 26 7a 4f 75 74 5b 6e 52 65  wd+1], &zOut[nRe
31780 6d 5d 2c 20 6e 42 79 74 65 2b 31 29 3b 0a 20 20  m], nByte+1);.  
31790 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
317a0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64  TE_OK;.}...#ifnd
317b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
317c0 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a  OAD_EXTENSION./*
317d0 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66  .** Interfaces f
317e0 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61  or opening a sha
317f0 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e  red library, fin
31800 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74  ding entry point
31810 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  s.** within the 
31820 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20  shared library, 
31830 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20  and closing the 
31840 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a  shared library..
31850 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 64 6c 66  */.#include <dlf
31860 63 6e 2e 68 3e 0a 73 74 61 74 69 63 20 76 6f 69  cn.h>.static voi
31870 64 20 2a 75 6e 69 78 44 6c 4f 70 65 6e 28 73 71  d *unixDlOpen(sq
31880 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
31890 65 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ed, const char *
318a0 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 55 4e  zFilename){.  UN
318b0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
318c0 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
318d0 6e 20 64 6c 6f 70 65 6e 28 7a 46 69 6c 65 6e 61  n dlopen(zFilena
318e0 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c 20 52  me, RTLD_NOW | R
318f0 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a  TLD_GLOBAL);.}..
31900 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 61 6c  /*.** SQLite cal
31910 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ls this function
31920 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
31930 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 75 6e 69  er a call to uni
31940 78 44 6c 53 79 6d 28 29 20 6f 72 0a 2a 2a 20 75  xDlSym() or.** u
31950 6e 69 78 44 6c 4f 70 65 6e 28 29 20 66 61 69 6c  nixDlOpen() fail
31960 73 20 28 72 65 74 75 72 6e 73 20 61 20 6e 75 6c  s (returns a nul
31970 6c 20 70 6f 69 6e 74 65 72 29 2e 20 49 66 20 61  l pointer). If a
31980 20 6d 6f 72 65 20 64 65 74 61 69 6c 65 64 20 65   more detailed e
31990 72 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65 20  rror.** message 
319a0 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 69 74  is available, it
319b0 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 7a   is written to z
319c0 42 75 66 4f 75 74 2e 20 49 66 20 6e 6f 20 65 72  BufOut. If no er
319d0 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69  ror message.** i
319e0 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 7a 42 75  s available, zBu
319f0 66 4f 75 74 20 69 73 20 6c 65 66 74 20 75 6e 6d  fOut is left unm
31a00 6f 64 69 66 69 65 64 20 61 6e 64 20 53 51 4c 69  odified and SQLi
31a10 74 65 20 75 73 65 73 20 61 20 64 65 66 61 75 6c  te uses a defaul
31a20 74 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61  t.** error messa
31a30 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
31a40 69 64 20 75 6e 69 78 44 6c 45 72 72 6f 72 28 73  id unixDlError(s
31a50 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
31a60 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  sed, int nBuf, c
31a70 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20  har *zBufOut){. 
31a80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72   const char *zEr
31a90 72 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  r;.  UNUSED_PARA
31aa0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
31ab0 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
31ac0 28 29 3b 0a 20 20 7a 45 72 72 20 3d 20 64 6c 65  ();.  zErr = dle
31ad0 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 7a 45  rror();.  if( zE
31ae0 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rr ){.    sqlite
31af0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c  3_snprintf(nBuf,
31b00 20 7a 42 75 66 4f 75 74 2c 20 22 25 73 22 2c 20   zBufOut, "%s", 
31b10 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20 75 6e 69  zErr);.  }.  uni
31b20 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d  xLeaveMutex();.}
31b30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a 75  .static void (*u
31b40 6e 69 78 44 6c 53 79 6d 28 73 71 6c 69 74 65 33  nixDlSym(sqlite3
31b50 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76  _vfs *NotUsed, v
31b60 6f 69 64 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  oid *p, const ch
31b70 61 72 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b  ar*zSym))(void){
31b80 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 47 43 43 20  .  /* .  ** GCC 
31b90 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65  with -pedantic-e
31ba0 72 72 6f 72 73 20 73 61 79 73 20 74 68 61 74 20  rrors says that 
31bb0 43 39 30 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c  C90 does not all
31bc0 6f 77 20 61 20 76 6f 69 64 2a 20 74 6f 20 62 65  ow a void* to be
31bd0 0a 20 20 2a 2a 20 63 61 73 74 20 69 6e 74 6f 20  .  ** cast into 
31be0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
31bf0 75 6e 63 74 69 6f 6e 2e 20 20 41 6e 64 20 79 65  unction.  And ye
31c00 74 20 74 68 65 20 6c 69 62 72 61 72 79 20 64 6c  t the library dl
31c10 73 79 6d 28 29 20 72 6f 75 74 69 6e 65 0a 20 20  sym() routine.  
31c20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 76 6f 69  ** returns a voi
31c30 64 2a 20 77 68 69 63 68 20 69 73 20 72 65 61 6c  d* which is real
31c40 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ly a pointer to 
31c50 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 20  a function.  So 
31c60 68 6f 77 20 64 6f 20 77 65 0a 20 20 2a 2a 20 75  how do we.  ** u
31c70 73 65 20 64 6c 73 79 6d 28 29 20 77 69 74 68 20  se dlsym() with 
31c80 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73  -pedantic-errors
31c90 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 72 69  ?.  **.  ** Vari
31ca0 61 62 6c 65 20 78 20 62 65 6c 6f 77 20 69 73 20  able x below is 
31cb0 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20 61 20  defined to be a 
31cc0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
31cd0 63 74 69 6f 6e 20 74 61 6b 69 6e 67 0a 20 20 2a  ction taking.  *
31ce0 2a 20 70 61 72 61 6d 65 74 65 72 73 20 76 6f 69  * parameters voi
31cf0 64 2a 20 61 6e 64 20 63 6f 6e 73 74 20 63 68 61  d* and const cha
31d00 72 2a 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67  r* and returning
31d10 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
31d20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 57  function..  ** W
31d30 65 20 69 6e 69 74 69 61 6c 69 7a 65 20 78 20 62  e initialize x b
31d40 79 20 61 73 73 69 67 6e 69 6e 67 20 69 74 20 61  y assigning it a
31d50 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
31d60 64 6c 73 79 6d 28 29 20 66 75 6e 63 74 69 6f 6e  dlsym() function
31d70 2e 0a 20 20 2a 2a 20 28 54 68 61 74 20 61 73 73  ..  ** (That ass
31d80 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 73  ignment requires
31d90 20 61 20 63 61 73 74 2e 29 20 20 54 68 65 6e 20   a cast.)  Then 
31da0 77 65 20 63 61 6c 6c 20 74 68 65 20 66 75 6e 63  we call the func
31db0 74 69 6f 6e 20 74 68 61 74 0a 20 20 2a 2a 20 78  tion that.  ** x
31dc0 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 0a 20 20   points to.  .  
31dd0 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 77 6f 72  **.  ** This wor
31de0 6b 2d 61 72 6f 75 6e 64 20 69 73 20 75 6e 6c 69  k-around is unli
31df0 6b 65 6c 79 20 74 6f 20 77 6f 72 6b 20 63 6f 72  kely to work cor
31e00 72 65 63 74 6c 79 20 6f 6e 20 61 6e 79 20 73 79  rectly on any sy
31e10 73 74 65 6d 20 77 68 65 72 65 0a 20 20 2a 2a 20  stem where.  ** 
31e20 79 6f 75 20 72 65 61 6c 6c 79 20 63 61 6e 6e 6f  you really canno
31e30 74 20 63 61 73 74 20 61 20 66 75 6e 63 74 69 6f  t cast a functio
31e40 6e 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20 76  n pointer into v
31e50 6f 69 64 2a 2e 20 20 42 75 74 20 74 68 65 6e 2c  oid*.  But then,
31e60 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68   on the.  ** oth
31e70 65 72 20 68 61 6e 64 2c 20 64 6c 73 79 6d 28 29  er hand, dlsym()
31e80 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 6f   will not work o
31e90 6e 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 20  n such a system 
31ea0 65 69 74 68 65 72 2c 20 73 6f 20 77 65 20 68 61  either, so we ha
31eb0 76 65 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 61 6c  ve.  ** not real
31ec0 6c 79 20 6c 6f 73 74 20 61 6e 79 74 68 69 6e 67  ly lost anything
31ed0 2e 0a 20 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ..  */.  void (*
31ee0 28 2a 78 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74  (*x)(void*,const
31ef0 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29 3b 0a   char*))(void);.
31f00 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
31f10 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 78  ER(NotUsed);.  x
31f20 20 3d 20 28 76 6f 69 64 28 2a 28 2a 29 28 76 6f   = (void(*(*)(vo
31f30 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  id*,const char*)
31f40 29 28 76 6f 69 64 29 29 64 6c 73 79 6d 3b 0a 20  )(void))dlsym;. 
31f50 20 72 65 74 75 72 6e 20 28 2a 78 29 28 70 2c 20   return (*x)(p, 
31f60 7a 53 79 6d 29 3b 0a 7d 0a 73 74 61 74 69 63 20  zSym);.}.static 
31f70 76 6f 69 64 20 75 6e 69 78 44 6c 43 6c 6f 73 65  void unixDlClose
31f80 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
31f90 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 48 61  tUsed, void *pHa
31fa0 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f  ndle){.  UNUSED_
31fb0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
31fc0 64 29 3b 0a 20 20 64 6c 63 6c 6f 73 65 28 70 48  d);.  dlclose(pH
31fd0 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20  andle);.}.#else 
31fe0 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  /* if SQLITE_OMI
31ff0 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
32000 20 69 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a   is defined: */.
32010 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c    #define unixDl
32020 4f 70 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e  Open  0.  #defin
32030 65 20 75 6e 69 78 44 6c 45 72 72 6f 72 20 30 0a  e unixDlError 0.
32040 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c    #define unixDl
32050 53 79 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e  Sym   0.  #defin
32060 65 20 75 6e 69 78 44 6c 43 6c 6f 73 65 20 30 0a  e unixDlClose 0.
32070 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72  #endif../*.** Wr
32080 69 74 65 20 6e 42 75 66 20 62 79 74 65 73 20 6f  ite nBuf bytes o
32090 66 20 72 61 6e 64 6f 6d 20 64 61 74 61 20 74 6f  f random data to
320a0 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 62 75   the supplied bu
320b0 66 66 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74  ffer zBuf..*/.st
320c0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52 61 6e  atic int unixRan
320d0 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f  domness(sqlite3_
320e0 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  vfs *NotUsed, in
320f0 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
32100 75 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  uf){.  UNUSED_PA
32110 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
32120 3b 0a 20 20 61 73 73 65 72 74 28 28 73 69 7a 65  ;.  assert((size
32130 5f 74 29 6e 42 75 66 3e 3d 28 73 69 7a 65 6f 66  _t)nBuf>=(sizeof
32140 28 74 69 6d 65 5f 74 29 2b 73 69 7a 65 6f 66 28  (time_t)+sizeof(
32150 69 6e 74 29 29 29 3b 0a 0a 20 20 2f 2a 20 57 65  int)));..  /* We
32160 20 68 61 76 65 20 74 6f 20 69 6e 69 74 69 61 6c   have to initial
32170 69 7a 65 20 7a 42 75 66 20 74 6f 20 70 72 65 76  ize zBuf to prev
32180 65 6e 74 20 76 61 6c 67 72 69 6e 64 20 66 72 6f  ent valgrind fro
32190 6d 20 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a  m reporting.  **
321a0 20 65 72 72 6f 72 73 2e 20 20 54 68 65 20 72 65   errors.  The re
321b0 70 6f 72 74 73 20 69 73 73 75 65 64 20 62 79 20  ports issued by 
321c0 76 61 6c 67 72 69 6e 64 20 61 72 65 20 69 6e 63  valgrind are inc
321d0 6f 72 72 65 63 74 20 2d 20 77 65 20 77 6f 75 6c  orrect - we woul
321e0 64 0a 20 20 2a 2a 20 70 72 65 66 65 72 20 74 68  d.  ** prefer th
321f0 61 74 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73  at the randomnes
32200 73 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 62  s be increased b
32210 79 20 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66 20  y making use of 
32220 74 68 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69  the.  ** uniniti
32230 61 6c 69 7a 65 64 20 73 70 61 63 65 20 69 6e 20  alized space in 
32240 7a 42 75 66 20 2d 20 62 75 74 20 76 61 6c 67 72  zBuf - but valgr
32250 69 6e 64 20 65 72 72 6f 72 73 20 74 65 6e 64 20  ind errors tend 
32260 74 6f 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f  to worry.  ** so
32270 6d 65 20 75 73 65 72 73 2e 20 20 52 61 74 68 65  me users.  Rathe
32280 72 20 74 68 61 6e 20 61 72 67 75 65 2c 20 69 74  r than argue, it
32290 20 73 65 65 6d 73 20 65 61 73 69 65 72 20 6a 75   seems easier ju
322a0 73 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  st to initialize
322b0 0a 20 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20  .  ** the whole 
322c0 61 72 72 61 79 20 61 6e 64 20 73 69 6c 65 6e 63  array and silenc
322d0 65 20 76 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e  e valgrind, even
322e0 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 6c   if that means l
322f0 65 73 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20  ess randomness. 
32300 20 2a 2a 20 69 6e 20 74 68 65 20 72 61 6e 64 6f   ** in the rando
32310 6d 20 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  m seed..  **.  *
32320 2a 20 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20  * When testing, 
32330 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75  initializing zBu
32340 66 5b 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20 61  f[] to zero is a
32350 6c 6c 20 77 65 20 64 6f 2e 20 20 54 68 61 74 20  ll we do.  That 
32360 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20  means.  ** that 
32370 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68  we always use th
32380 65 20 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75  e same random nu
32390 6d 62 65 72 20 73 65 71 75 65 6e 63 65 2e 20 20  mber sequence.  
323a0 54 68 69 73 20 6d 61 6b 65 73 20 74 68 65 0a 20  This makes the. 
323b0 20 2a 2a 20 74 65 73 74 73 20 72 65 70 65 61 74   ** tests repeat
323c0 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d  able..  */.  mem
323d0 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75  set(zBuf, 0, nBu
323e0 66 29 3b 0a 20 20 72 61 6e 64 6f 6d 6e 65 73 73  f);.  randomness
323f0 50 69 64 20 3d 20 6f 73 47 65 74 70 69 64 28 30  Pid = osGetpid(0
32400 29 3b 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65  );  .#if !define
32410 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26  d(SQLITE_TEST) &
32420 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
32430 45 5f 4f 4d 49 54 5f 52 41 4e 44 4f 4d 4e 45 53  E_OMIT_RANDOMNES
32440 53 29 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 66  S).  {.    int f
32450 64 2c 20 67 6f 74 3b 0a 20 20 20 20 66 64 20 3d  d, got;.    fd =
32460 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 22 2f 64   robust_open("/d
32470 65 76 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52  ev/urandom", O_R
32480 44 4f 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20 69  DONLY, 0);.    i
32490 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20  f( fd<0 ){.     
324a0 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20 20   time_t t;.     
324b0 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 20   time(&t);.     
324c0 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 26 74   memcpy(zBuf, &t
324d0 2c 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20  , sizeof(t));.  
324e0 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66      memcpy(&zBuf
324f0 5b 73 69 7a 65 6f 66 28 74 29 5d 2c 20 26 72 61  [sizeof(t)], &ra
32500 6e 64 6f 6d 6e 65 73 73 50 69 64 2c 20 73 69 7a  ndomnessPid, siz
32510 65 6f 66 28 72 61 6e 64 6f 6d 6e 65 73 73 50 69  eof(randomnessPi
32520 64 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  d));.      asser
32530 74 28 20 73 69 7a 65 6f 66 28 74 29 2b 73 69 7a  t( sizeof(t)+siz
32540 65 6f 66 28 72 61 6e 64 6f 6d 6e 65 73 73 50 69  eof(randomnessPi
32550 64 29 3c 3d 28 73 69 7a 65 5f 74 29 6e 42 75 66  d)<=(size_t)nBuf
32560 20 29 3b 0a 20 20 20 20 20 20 6e 42 75 66 20 3d   );.      nBuf =
32570 20 73 69 7a 65 6f 66 28 74 29 20 2b 20 73 69 7a   sizeof(t) + siz
32580 65 6f 66 28 72 61 6e 64 6f 6d 6e 65 73 73 50 69  eof(randomnessPi
32590 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
325a0 20 20 20 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f       do{ got = o
325b0 73 52 65 61 64 28 66 64 2c 20 7a 42 75 66 2c 20  sRead(fd, zBuf, 
325c0 6e 42 75 66 29 3b 20 7d 77 68 69 6c 65 28 20 67  nBuf); }while( g
325d0 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  ot<0 && errno==E
325e0 49 4e 54 52 20 29 3b 0a 20 20 20 20 20 20 72 6f  INTR );.      ro
325f0 62 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64  bust_close(0, fd
32600 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
32610 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
32620 72 65 74 75 72 6e 20 6e 42 75 66 3b 0a 7d 0a 0a  return nBuf;.}..
32630 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72  ./*.** Sleep for
32640 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e   a little while.
32650 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f    Return the amo
32660 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70  unt of time slep
32670 74 2e 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  t..** The argume
32680 6e 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  nt is the number
32690 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73   of microseconds
326a0 20 77 65 20 77 61 6e 74 20 74 6f 20 73 6c 65 65   we want to slee
326b0 70 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  p..** The return
326c0 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75   value is the nu
326d0 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63  mber of microsec
326e0 6f 6e 64 73 20 6f 66 20 73 6c 65 65 70 20 61 63  onds of sleep ac
326f0 74 75 61 6c 6c 79 0a 2a 2a 20 72 65 71 75 65 73  tually.** reques
32700 74 65 64 20 66 72 6f 6d 20 74 68 65 20 75 6e 64  ted from the und
32710 65 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e  erlying operatin
32720 67 20 73 79 73 74 65 6d 2c 20 61 20 6e 75 6d 62  g system, a numb
32730 65 72 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68  er which.** migh
32740 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  t be greater tha
32750 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
32760 65 20 61 72 67 75 6d 65 6e 74 2c 20 62 75 74 20  e argument, but 
32770 6e 6f 74 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e  not less.** than
32780 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a   the argument..*
32790 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
327a0 78 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76  xSleep(sqlite3_v
327b0 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  fs *NotUsed, int
327c0 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 7b 0a   microseconds){.
327d0 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
327e0 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63   struct timespec
327f0 20 73 70 3b 0a 0a 20 20 73 70 2e 74 76 5f 73 65   sp;..  sp.tv_se
32800 63 20 3d 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  c = microseconds
32810 20 2f 20 31 30 30 30 30 30 30 3b 0a 20 20 73 70   / 1000000;.  sp
32820 2e 74 76 5f 6e 73 65 63 20 3d 20 28 6d 69 63 72  .tv_nsec = (micr
32830 6f 73 65 63 6f 6e 64 73 20 25 20 31 30 30 30 30  oseconds % 10000
32840 30 30 29 20 2a 20 31 30 30 30 3b 0a 20 20 6e 61  00) * 1000;.  na
32850 6e 6f 73 6c 65 65 70 28 26 73 70 2c 20 4e 55 4c  nosleep(&sp, NUL
32860 4c 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  L);.  UNUSED_PAR
32870 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
32880 0a 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73  .  return micros
32890 65 63 6f 6e 64 73 3b 0a 23 65 6c 69 66 20 64 65  econds;.#elif de
328a0 66 69 6e 65 64 28 48 41 56 45 5f 55 53 4c 45 45  fined(HAVE_USLEE
328b0 50 29 20 26 26 20 48 41 56 45 5f 55 53 4c 45 45  P) && HAVE_USLEE
328c0 50 0a 20 20 75 73 6c 65 65 70 28 6d 69 63 72 6f  P.  usleep(micro
328d0 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53  seconds);.  UNUS
328e0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
328f0 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
32900 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65  microseconds;.#e
32910 6c 73 65 0a 20 20 69 6e 74 20 73 65 63 6f 6e 64  lse.  int second
32920 73 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64  s = (microsecond
32930 73 2b 39 39 39 39 39 39 29 2f 31 30 30 30 30 30  s+999999)/100000
32940 30 3b 0a 20 20 73 6c 65 65 70 28 73 65 63 6f 6e  0;.  sleep(secon
32950 64 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ds);.  UNUSED_PA
32960 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
32970 3b 0a 20 20 72 65 74 75 72 6e 20 73 65 63 6f 6e  ;.  return secon
32980 64 73 2a 31 30 30 30 30 30 30 3b 0a 23 65 6e 64  ds*1000000;.#end
32990 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  if.}../*.** The 
329a0 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
329b0 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20  le, if set to a 
329c0 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20  non-zero value, 
329d0 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
329e0 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20  s.** the number 
329f0 6f 66 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  of seconds since
32a00 20 31 39 37 30 20 61 6e 64 20 69 73 20 75 73 65   1970 and is use
32a10 64 20 74 6f 20 73 65 74 20 74 68 65 20 72 65 73  d to set the res
32a20 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65  ult of.** sqlite
32a30 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29  3OsCurrentTime()
32a40 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2e   during testing.
32a50 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
32a60 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
32a70 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
32a80 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79  = 0;  /* Fake sy
32a90 73 74 65 6d 20 74 69 6d 65 20 69 6e 20 73 65 63  stem time in sec
32aa0 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e  onds since 1970.
32ab0 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   */.#endif../*.*
32ac0 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65  * Find the curre
32ad0 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76  nt time (in Univ
32ae0 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65  ersal Coordinate
32af0 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20  d Time).  Write 
32b00 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74  into *piNow.** t
32b10 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
32b20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75  and date as a Ju
32b30 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20  lian Day number 
32b40 74 69 6d 65 73 20 38 36 5f 34 30 30 5f 30 30 30  times 86_400_000
32b50 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77  .  In.** other w
32b60 6f 72 64 73 2c 20 77 72 69 74 65 20 69 6e 74 6f  ords, write into
32b70 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62   *piNow the numb
32b80 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e  er of millisecon
32b90 64 73 20 73 69 6e 63 65 20 74 68 65 20 4a 75 6c  ds since the Jul
32ba0 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20  ian.** epoch of 
32bb0 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69 63  noon in Greenwic
32bc0 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34  h on November 24
32bd0 2c 20 34 37 31 34 20 42 2e 43 20 61 63 63 6f 72  , 4714 B.C accor
32be0 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70  ding to the.** p
32bf0 72 6f 6c 65 70 74 69 63 20 47 72 65 67 6f 72 69  roleptic Gregori
32c00 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a  an calendar..**.
32c10 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72  ** On success, r
32c20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
32c30 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
32c40 45 52 52 4f 52 20 69 66 20 74 68 65 20 74 69 6d  ERROR if the tim
32c50 65 20 61 6e 64 20 64 61 74 65 20 0a 2a 2a 20 63  e and date .** c
32c60 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a  annot be found..
32c70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
32c80 69 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  ixCurrentTimeInt
32c90 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  64(sqlite3_vfs *
32ca0 4e 6f 74 55 73 65 64 2c 20 73 71 6c 69 74 65 33  NotUsed, sqlite3
32cb0 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a  _int64 *piNow){.
32cc0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
32cd0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 75 6e 69  qlite3_int64 uni
32ce0 78 45 70 6f 63 68 20 3d 20 32 34 34 30 35 38 37  xEpoch = 2440587
32cf0 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  5*(sqlite3_int64
32d00 29 38 36 34 30 30 30 30 3b 0a 20 20 69 6e 74 20  )8640000;.  int 
32d10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
32d20 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 47  #if defined(NO_G
32d30 45 54 54 4f 44 29 0a 20 20 74 69 6d 65 5f 74 20  ETTOD).  time_t 
32d40 74 3b 0a 20 20 74 69 6d 65 28 26 74 29 3b 0a 20  t;.  time(&t);. 
32d50 20 2a 70 69 4e 6f 77 20 3d 20 28 28 73 71 6c 69   *piNow = ((sqli
32d60 74 65 33 5f 69 6e 74 36 34 29 74 29 2a 31 30 30  te3_int64)t)*100
32d70 30 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 23  0 + unixEpoch;.#
32d80 65 6c 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  elif OS_VXWORKS.
32d90 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65    struct timespe
32da0 63 20 73 4e 6f 77 3b 0a 20 20 63 6c 6f 63 6b 5f  c sNow;.  clock_
32db0 67 65 74 74 69 6d 65 28 43 4c 4f 43 4b 5f 52 45  gettime(CLOCK_RE
32dc0 41 4c 54 49 4d 45 2c 20 26 73 4e 6f 77 29 3b 0a  ALTIME, &sNow);.
32dd0 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45    *piNow = unixE
32de0 70 6f 63 68 20 2b 20 31 30 30 30 2a 28 73 71 6c  poch + 1000*(sql
32df0 69 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e  ite3_int64)sNow.
32e00 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76  tv_sec + sNow.tv
32e10 5f 6e 73 65 63 2f 31 30 30 30 30 30 30 3b 0a 23  _nsec/1000000;.#
32e20 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20 74 69  else.  struct ti
32e30 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a 20 20 28 76  meval sNow;.  (v
32e40 6f 69 64 29 67 65 74 74 69 6d 65 6f 66 64 61 79  oid)gettimeofday
32e50 28 26 73 4e 6f 77 2c 20 30 29 3b 20 20 2f 2a 20  (&sNow, 0);  /* 
32e60 43 61 6e 6e 6f 74 20 66 61 69 6c 20 67 69 76 65  Cannot fail give
32e70 6e 20 76 61 6c 69 64 20 61 72 67 75 6d 65 6e 74  n valid argument
32e80 73 20 2a 2f 0a 20 20 2a 70 69 4e 6f 77 20 3d 20  s */.  *piNow = 
32e90 75 6e 69 78 45 70 6f 63 68 20 2b 20 31 30 30 30  unixEpoch + 1000
32ea0 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
32eb0 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e  sNow.tv_sec + sN
32ec0 6f 77 2e 74 76 5f 75 73 65 63 2f 31 30 30 30 3b  ow.tv_usec/1000;
32ed0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
32ee0 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66  SQLITE_TEST.  if
32ef0 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  ( sqlite3_curren
32f00 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70  t_time ){.    *p
32f10 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73 71 6c  iNow = 1000*(sql
32f20 69 74 65 33 5f 69 6e 74 36 34 29 73 71 6c 69 74  ite3_int64)sqlit
32f30 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
32f40 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d  + unixEpoch;.  }
32f50 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44  .#endif.  UNUSED
32f60 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
32f70 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ed);.  return rc
32f80 3b 0a 7d 0a 0a 23 69 66 20 30 20 2f 2a 20 4e 6f  ;.}..#if 0 /* No
32f90 74 20 75 73 65 64 20 2a 2f 0a 2f 2a 0a 2a 2a 20  t used */./*.** 
32fa0 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74  Find the current
32fb0 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72   time (in Univer
32fc0 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20  sal Coordinated 
32fd0 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68  Time).  Write th
32fe0 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d  e.** current tim
32ff0 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20  e and date as a 
33000 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65  Julian Day numbe
33010 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e  r into *prNow an
33020 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20  d.** return 0.  
33030 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
33040 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61  time and date ca
33050 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a  nnot be found..*
33060 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
33070 78 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c  xCurrentTime(sql
33080 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
33090 64 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77  d, double *prNow
330a0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  ){.  sqlite3_int
330b0 36 34 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20  64 i = 0;.  int 
330c0 72 63 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  rc;.  UNUSED_PAR
330d0 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
330e0 0a 20 20 72 63 20 3d 20 75 6e 69 78 43 75 72 72  .  rc = unixCurr
330f0 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 30 2c 20  entTimeInt64(0, 
33100 26 69 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20  &i);.  *prNow = 
33110 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20 20  i/86400000.0;.  
33120 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c  return rc;.}.#el
33130 73 65 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78  se.# define unix
33140 43 75 72 72 65 6e 74 54 69 6d 65 20 30 0a 23 65  CurrentTime 0.#e
33150 6e 64 69 66 0a 0a 23 69 66 20 30 20 20 2f 2a 20  ndif..#if 0  /* 
33160 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 2f 2a 0a 2a  Not used */./*.*
33170 2a 20 57 65 20 61 64 64 65 64 20 74 68 65 20 78  * We added the x
33180 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 6d  GetLastError() m
33190 65 74 68 6f 64 20 77 69 74 68 20 74 68 65 20 69  ethod with the i
331a0 6e 74 65 6e 74 69 6f 6e 20 6f 66 20 70 72 6f 76  ntention of prov
331b0 69 64 69 6e 67 0a 2a 2a 20 62 65 74 74 65 72 20  iding.** better 
331c0 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20  low-level error 
331d0 6d 65 73 73 61 67 65 73 20 77 68 65 6e 20 6f 70  messages when op
331e0 65 72 61 74 69 6e 67 2d 73 79 73 74 65 6d 20 70  erating-system p
331f0 72 6f 62 6c 65 6d 73 20 63 6f 6d 65 20 75 70 0a  roblems come up.
33200 2a 2a 20 64 75 72 69 6e 67 20 53 51 4c 69 74 65  ** during SQLite
33210 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74   operation.  But
33220 20 73 6f 20 66 61 72 2c 20 6e 6f 6e 65 20 6f 66   so far, none of
33230 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 69   that has been i
33240 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 69 6e  mplemented.** in
33250 20 74 68 65 20 63 6f 72 65 2e 20 20 53 6f 20 74   the core.  So t
33260 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
33270 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 46 6f  ever called.  Fo
33280 72 20 6e 6f 77 2c 20 69 74 20 69 73 20 6d 65 72  r now, it is mer
33290 65 6c 79 0a 2a 2a 20 61 20 70 6c 61 63 65 2d 68  ely.** a place-h
332a0 6f 6c 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  older..*/.static
332b0 20 69 6e 74 20 75 6e 69 78 47 65 74 4c 61 73 74   int unixGetLast
332c0 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66  Error(sqlite3_vf
332d0 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  s *NotUsed, int 
332e0 4e 6f 74 55 73 65 64 32 2c 20 63 68 61 72 20 2a  NotUsed2, char *
332f0 4e 6f 74 55 73 65 64 33 29 7b 0a 20 20 55 4e 55  NotUsed3){.  UNU
33300 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
33310 74 55 73 65 64 29 3b 0a 20 20 55 4e 55 53 45 44  tUsed);.  UNUSED
33320 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
33330 65 64 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ed2);.  UNUSED_P
33340 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
33350 33 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  3);.  return 0;.
33360 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
33370 20 75 6e 69 78 47 65 74 4c 61 73 74 45 72 72 6f   unixGetLastErro
33380 72 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  r 0.#endif.../*.
33390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
333a0 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
333b0 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68  sqlite3_vfs meth
333c0 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
333d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
333e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
333f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
33430 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
33440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33480 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
33490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
334a0 6e 20 50 72 6f 78 79 20 4c 6f 63 6b 69 6e 67 20  n Proxy Locking 
334b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
334c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
334d0 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63  .**.** Proxy loc
334e0 6b 69 6e 67 20 69 73 20 61 20 22 75 62 65 72 2d  king is a "uber-
334f0 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68 6f 64 22 20  locking-method" 
33500 69 6e 20 74 68 69 73 20 73 65 6e 73 65 3a 20 20  in this sense:  
33510 49 74 20 75 73 65 73 20 74 68 65 0a 2a 2a 20 6f  It uses the.** o
33520 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  ther locking met
33530 68 6f 64 73 20 6f 6e 20 73 65 63 6f 6e 64 61 72  hods on secondar
33540 79 20 6c 6f 63 6b 20 66 69 6c 65 73 2e 20 20 50  y lock files.  P
33550 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20  roxy locking is 
33560 61 0a 2a 2a 20 6d 65 74 61 2d 6c 61 79 65 72 20  a.** meta-layer 
33570 6f 76 65 72 20 74 6f 70 20 6f 66 20 74 68 65 20  over top of the 
33580 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e  primitive lockin
33590 67 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 62  g implemented ab
335a0 6f 76 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 69  ove.  For.** thi
335b0 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64 69  s reason, the di
335c0 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c  vision that impl
335d0 65 6d 65 6e 74 73 20 6f 66 20 70 72 6f 78 79 20  ements of proxy 
335e0 6c 6f 63 6b 69 6e 67 20 69 73 20 64 65 66 65 72  locking is defer
335f0 72 65 64 0a 2a 2a 20 75 6e 74 69 6c 20 6c 61 74  red.** until lat
33600 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 28 68  e in the file (h
33610 65 72 65 29 20 61 66 74 65 72 20 61 6c 6c 20 6f  ere) after all o
33620 66 20 74 68 65 20 6f 74 68 65 72 20 49 2f 4f 20  f the other I/O 
33630 6d 65 74 68 6f 64 73 20 68 61 76 65 0a 2a 2a 20  methods have.** 
33640 62 65 65 6e 20 64 65 66 69 6e 65 64 20 2d 20 73  been defined - s
33650 6f 20 74 68 61 74 20 74 68 65 20 70 72 69 6d 69  o that the primi
33660 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  tive locking met
33670 68 6f 64 73 20 61 72 65 20 61 76 61 69 6c 61 62  hods are availab
33680 6c 65 0a 2a 2a 20 61 73 20 73 65 72 76 69 63 65  le.** as service
33690 73 20 74 6f 20 68 65 6c 70 20 77 69 74 68 20 74  s to help with t
336a0 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
336b0 6e 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69  n of proxy locki
336c0 6e 67 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ng..**.****.**.*
336d0 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 6c 6f  * The default lo
336e0 63 6b 69 6e 67 20 73 63 68 65 6d 65 73 20 69 6e  cking schemes in
336f0 20 53 51 4c 69 74 65 20 75 73 65 20 62 79 74 65   SQLite use byte
33700 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 6f 6e 20  -range locks on 
33710 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
33720 66 69 6c 65 20 74 6f 20 63 6f 6f 72 64 69 6e 61  file to coordina
33730 74 65 20 73 61 66 65 2c 20 63 6f 6e 63 75 72 72  te safe, concurr
33740 65 6e 74 20 61 63 63 65 73 73 20 62 79 20 6d 75  ent access by mu
33750 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 0a 2a  ltiple readers.*
33760 2a 20 61 6e 64 20 77 72 69 74 65 72 73 20 5b 68  * and writers [h
33770 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67  ttp://sqlite.org
33780 2f 6c 6f 63 6b 69 6e 67 76 33 2e 68 74 6d 6c 5d  /lockingv3.html]
33790 2e 20 20 54 68 65 20 66 69 76 65 20 66 69 6c 65  .  The five file
337a0 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 61 74   locking.** stat
337b0 65 73 20 28 55 4e 4c 4f 43 4b 45 44 2c 20 50 45  es (UNLOCKED, PE
337c0 4e 44 49 4e 47 2c 20 53 48 41 52 45 44 2c 20 52  NDING, SHARED, R
337d0 45 53 45 52 56 45 44 2c 20 45 58 43 4c 55 53 49  ESERVED, EXCLUSI
337e0 56 45 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e  VE) are implemen
337f0 74 65 64 0a 2a 2a 20 61 73 20 50 4f 53 49 58 20  ted.** as POSIX 
33800 72 65 61 64 20 26 20 77 72 69 74 65 20 6c 6f 63  read & write loc
33810 6b 73 20 6f 76 65 72 20 66 69 78 65 64 20 73 65  ks over fixed se
33820 74 20 6f 66 20 6c 6f 63 61 74 69 6f 6e 73 20 28  t of locations (
33830 76 69 61 20 66 73 63 74 6c 29 2c 0a 2a 2a 20 6f  via fsctl),.** o
33840 6e 20 41 46 50 20 61 6e 64 20 53 4d 42 20 6f 6e  n AFP and SMB on
33850 6c 79 20 65 78 63 6c 75 73 69 76 65 20 62 79 74  ly exclusive byt
33860 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72  e-range locks ar
33870 65 20 61 76 61 69 6c 61 62 6c 65 20 76 69 61 20  e available via 
33880 66 73 63 74 6c 0a 2a 2a 20 77 69 74 68 20 5f 49  fsctl.** with _I
33890 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72  OWR('z', 23, str
338a0 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63  uct ByteRangeLoc
338b0 6b 50 42 32 29 20 74 6f 20 74 72 61 63 6b 20 74  kPB2) to track t
338c0 68 65 20 73 61 6d 65 20 35 20 73 74 61 74 65 73  he same 5 states
338d0 2e 0a 2a 2a 20 54 6f 20 73 69 6d 75 6c 61 74 65  ..** To simulate
338e0 20 61 20 46 5f 52 44 4c 43 4b 20 6f 6e 20 74 68   a F_RDLCK on th
338f0 65 20 73 68 61 72 65 64 20 72 61 6e 67 65 2c 20  e shared range, 
33900 6f 6e 20 41 46 50 20 61 20 72 61 6e 64 6f 6d 6c  on AFP a randoml
33910 79 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61 64  y selected.** ad
33920 64 72 65 73 73 20 69 6e 20 74 68 65 20 73 68 61  dress in the sha
33930 72 65 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b  red range is tak
33940 65 6e 20 66 6f 72 20 61 20 53 48 41 52 45 44 20  en for a SHARED 
33950 6c 6f 63 6b 2c 20 74 68 65 20 65 6e 74 69 72 65  lock, the entire
33960 0a 2a 2a 20 73 68 61 72 65 64 20 72 61 6e 67 65  .** shared range
33970 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 6e   is taken for an
33980 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 29   EXCLUSIVE lock)
33990 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 45 4e  :.**.**      PEN
339a0 44 49 4e 47 5f 42 59 54 45 20 20 20 20 20 20 20  DING_BYTE       
339b0 20 30 78 34 30 30 30 30 30 30 30 0a 2a 2a 20 20   0x40000000.**  
339c0 20 20 20 20 52 45 53 45 52 56 45 44 5f 42 59 54      RESERVED_BYT
339d0 45 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30  E       0x400000
339e0 30 31 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45  01.**      SHARE
339f0 44 5f 52 41 4e 47 45 20 20 20 20 20 20 20 20 30  D_RANGE        0
33a00 78 34 30 30 30 30 30 30 32 20 2d 3e 20 30 78 34  x40000002 -> 0x4
33a10 30 30 30 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68  0000200.**.** Th
33a20 69 73 20 77 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e  is works well on
33a30 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20   the local file 
33a40 73 79 73 74 65 6d 2c 20 62 75 74 20 73 68 6f 77  system, but show
33a50 73 20 61 20 6e 65 61 72 6c 79 20 31 30 30 78 0a  s a nearly 100x.
33a60 2a 2a 20 73 6c 6f 77 64 6f 77 6e 20 69 6e 20 72  ** slowdown in r
33a70 65 61 64 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  ead performance 
33a80 6f 6e 20 41 46 50 20 62 65 63 61 75 73 65 20 74  on AFP because t
33a90 68 65 20 41 46 50 20 63 6c 69 65 6e 74 20 64 69  he AFP client di
33aa0 73 61 62 6c 65 73 0a 2a 2a 20 74 68 65 20 72 65  sables.** the re
33ab0 61 64 20 63 61 63 68 65 20 77 68 65 6e 20 62 79  ad cache when by
33ac0 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61  te-range locks a
33ad0 72 65 20 70 72 65 73 65 6e 74 2e 20 20 45 6e 61  re present.  Ena
33ae0 62 6c 69 6e 67 20 74 68 65 20 72 65 61 64 0a 2a  bling the read.*
33af0 2a 20 63 61 63 68 65 20 65 78 70 6f 73 65 73 20  * cache exposes 
33b00 61 20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63  a cache coherenc
33b10 79 20 70 72 6f 62 6c 65 6d 20 74 68 61 74 20 69  y problem that i
33b20 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 61 6c 6c  s present on all
33b30 20 4f 53 20 58 0a 2a 2a 20 73 75 70 70 6f 72 74   OS X.** support
33b40 65 64 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 20  ed network file 
33b50 73 79 73 74 65 6d 73 2e 20 20 4e 46 53 20 61 6e  systems.  NFS an
33b60 64 20 41 46 50 20 62 6f 74 68 20 6f 62 73 65 72  d AFP both obser
33b70 76 65 20 74 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d  ve the.** close-
33b80 74 6f 2d 6f 70 65 6e 20 73 65 6d 61 6e 74 69 63  to-open semantic
33b90 73 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 63  s for ensuring c
33ba0 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 0a 2a  ache coherency.*
33bb0 2a 20 5b 68 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f  * [http://nfs.so
33bc0 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 23 66  urceforge.net/#f
33bd0 61 71 5f 61 38 5d 2c 20 77 68 69 63 68 20 64 6f  aq_a8], which do
33be0 65 73 20 6e 6f 74 20 65 66 66 65 63 74 69 76 65  es not effective
33bf0 6c 79 0a 2a 2a 20 61 64 64 72 65 73 73 20 74 68  ly.** address th
33c00 65 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 66  e requirements f
33c10 6f 72 20 63 6f 6e 63 75 72 72 65 6e 74 20 64 61  or concurrent da
33c20 74 61 62 61 73 65 20 61 63 63 65 73 73 20 62 79  tabase access by
33c30 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 72 65 61   multiple.** rea
33c40 64 65 72 73 20 61 6e 64 20 77 72 69 74 65 72 73  ders and writers
33c50 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 77 77 77 2e  .** [http://www.
33c60 6e 61 62 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74  nabble.com/SQLit
33c70 65 2d 6f 6e 2d 4e 46 53 2d 63 61 63 68 65 2d 63  e-on-NFS-cache-c
33c80 6f 68 65 72 65 6e 63 79 2d 74 64 31 35 36 35 35  oherency-td15655
33c90 37 30 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a  701.html]..**.**
33ca0 20 54 6f 20 61 64 64 72 65 73 73 20 74 68 65 20   To address the 
33cb0 70 65 72 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20  performance and 
33cc0 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20  cache coherency 
33cd0 69 73 73 75 65 73 2c 20 70 72 6f 78 79 20 66 69  issues, proxy fi
33ce0 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68  le locking.** ch
33cf0 61 6e 67 65 73 20 74 68 65 20 77 61 79 20 64 61  anges the way da
33d00 74 61 62 61 73 65 20 61 63 63 65 73 73 20 69 73  tabase access is
33d10 20 63 6f 6e 74 72 6f 6c 6c 65 64 20 62 79 20 6c   controlled by l
33d20 69 6d 69 74 69 6e 67 20 61 63 63 65 73 73 20 74  imiting access t
33d30 6f 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 68 6f  o a.** single ho
33d40 73 74 20 61 74 20 61 20 74 69 6d 65 20 61 6e 64  st at a time and
33d50 20 6d 6f 76 69 6e 67 20 66 69 6c 65 20 6c 6f 63   moving file loc
33d60 6b 73 20 6f 66 66 20 6f 66 20 74 68 65 20 64 61  ks off of the da
33d70 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61  tabase file.** a
33d80 6e 64 20 6f 6e 74 6f 20 61 20 70 72 6f 78 79 20  nd onto a proxy 
33d90 66 69 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61  file on the loca
33da0 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 20  l file system.  
33db0 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20  .**.**.** Using 
33dc0 70 72 6f 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d  proxy locks.** -
33dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33de0 0a 2a 2a 0a 2a 2a 20 43 20 41 50 49 73 0a 2a 2a  .**.** C APIs.**
33df0 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  .**  sqlite3_fil
33e00 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62  e_control(db, db
33e10 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e  name, SQLITE_FCN
33e20 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TL_SET_LOCKPROXY
33e30 46 49 4c 45 2c 0a 2a 2a 20 20 20 20 20 20 20 20  FILE,.**        
33e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3c                 <
33e50 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 22 3a  proxy_path> | ":
33e60 61 75 74 6f 3a 22 29 3b 0a 2a 2a 20 20 73 71 6c  auto:");.**  sql
33e70 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
33e80 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51  l(db, dbname, SQ
33e90 4c 49 54 45 5f 46 43 4e 54 4c 5f 47 45 54 5f 4c  LITE_FCNTL_GET_L
33ea0 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a  OCKPROXYFILE,.**
33eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33ec0 20 20 20 20 20 20 20 26 3c 70 72 6f 78 79 5f 70         &<proxy_p
33ed0 61 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  ath>);.**.**.** 
33ee0 53 51 4c 20 70 72 61 67 6d 61 73 0a 2a 2a 0a 2a  SQL pragmas.**.*
33ef0 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62  *  PRAGMA [datab
33f00 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f  ase.]lock_proxy_
33f10 66 69 6c 65 3d 3c 70 72 6f 78 79 5f 70 61 74 68  file=<proxy_path
33f20 3e 20 7c 20 3a 61 75 74 6f 3a 0a 2a 2a 20 20 50  > | :auto:.**  P
33f30 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e  RAGMA [database.
33f40 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65  ]lock_proxy_file
33f50 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69 66 79 69 6e  .**.** Specifyin
33f60 67 20 22 3a 61 75 74 6f 3a 22 20 6d 65 61 6e 73  g ":auto:" means
33f70 20 74 68 61 74 20 69 66 20 74 68 65 72 65 20 69   that if there i
33f80 73 20 61 20 63 6f 6e 63 68 20 66 69 6c 65 20 77  s a conch file w
33f90 69 74 68 20 61 20 6d 61 74 63 68 69 6e 67 0a 2a  ith a matching.*
33fa0 2a 20 68 6f 73 74 20 49 44 20 69 6e 20 69 74 2c  * host ID in it,
33fb0 20 74 68 65 20 70 72 6f 78 79 20 70 61 74 68 20   the proxy path 
33fc0 69 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  in the conch fil
33fd0 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2c 20  e will be used, 
33fe0 6f 74 68 65 72 77 69 73 65 0a 2a 2a 20 61 20 70  otherwise.** a p
33ff0 72 6f 78 79 20 70 61 74 68 20 62 61 73 65 64 20  roxy path based 
34000 6f 6e 20 74 68 65 20 75 73 65 72 27 73 20 74 65  on the user's te
34010 6d 70 20 64 69 72 0a 2a 2a 20 28 76 69 61 20 63  mp dir.** (via c
34020 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49  onfstr(_CS_DARWI
34030 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c  N_USER_TEMP_DIR,
34040 2e 2e 2e 29 29 20 77 69 6c 6c 20 62 65 20 75 73  ...)) will be us
34050 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 61 63  ed and the.** ac
34060 74 75 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 20  tual proxy file 
34070 6e 61 6d 65 20 69 73 20 67 65 6e 65 72 61 74 65  name is generate
34080 64 20 66 72 6f 6d 20 74 68 65 20 6e 61 6d 65 20  d from the name 
34090 61 6e 64 20 70 61 74 68 20 6f 66 20 74 68 65 0a  and path of the.
340a0 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
340b0 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  .  For example:.
340c0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 46 6f 72 20  **.**       For 
340d0 64 61 74 61 62 61 73 65 20 70 61 74 68 20 22 2f  database path "/
340e0 55 73 65 72 73 2f 6d 65 2f 66 6f 6f 2e 64 62 22  Users/me/foo.db"
340f0 20 0a 2a 2a 20 20 20 20 20 20 20 54 68 65 20 6c   .**       The l
34100 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c 20 62 65  ock path will be
34110 20 22 3c 74 6d 70 64 69 72 3e 2f 73 71 6c 69 74   "<tmpdir>/sqlit
34120 65 70 6c 6f 63 6b 73 2f 5f 55 73 65 72 73 5f 6d  eplocks/_Users_m
34130 65 5f 66 6f 6f 2e 64 62 3a 61 75 74 6f 3a 22 29  e_foo.db:auto:")
34140 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 20 6c 6f  .**.** Once a lo
34150 63 6b 20 70 72 6f 78 79 20 69 73 20 63 6f 6e 66  ck proxy is conf
34160 69 67 75 72 65 64 20 66 6f 72 20 61 20 64 61 74  igured for a dat
34170 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
34180 2c 20 69 74 20 63 61 6e 20 6e 6f 74 0a 2a 2a 20  , it can not.** 
34190 62 65 20 72 65 6d 6f 76 65 64 2c 20 68 6f 77 65  be removed, howe
341a0 76 65 72 20 69 74 20 6d 61 79 20 62 65 20 73 77  ver it may be sw
341b0 69 74 63 68 65 64 20 74 6f 20 61 20 64 69 66 66  itched to a diff
341c0 65 72 65 6e 74 20 70 72 6f 78 79 20 70 61 74 68  erent proxy path
341d0 20 76 69 61 0a 2a 2a 20 74 68 65 20 61 62 6f 76   via.** the abov
341e0 65 20 41 50 49 73 20 28 61 73 73 75 6d 69 6e 67  e APIs (assuming
341f0 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
34200 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 68 65 6c  is not being hel
34210 64 20 62 79 20 61 6e 6f 74 68 65 72 0a 2a 2a 20  d by another.** 
34220 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 70 72  connection or pr
34230 6f 63 65 73 73 29 2e 20 0a 2a 2a 0a 2a 2a 0a 2a  ocess). .**.**.*
34240 2a 20 48 6f 77 20 70 72 6f 78 79 20 6c 6f 63 6b  * How proxy lock
34250 69 6e 67 20 77 6f 72 6b 73 0a 2a 2a 20 2d 2d 2d  ing works.** ---
34260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34270 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79  ----.**.** Proxy
34280 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 72 65   file locking re
34290 6c 69 65 73 20 70 72 69 6d 61 72 69 6c 79 20 6f  lies primarily o
342a0 6e 20 74 77 6f 20 6e 65 77 20 73 75 70 70 6f 72  n two new suppor
342b0 74 69 6e 67 20 66 69 6c 65 73 3a 20 0a 2a 2a 0a  ting files: .**.
342c0 2a 2a 20 20 20 2a 20 20 63 6f 6e 63 68 20 66 69  **   *  conch fi
342d0 6c 65 20 74 6f 20 6c 69 6d 69 74 20 61 63 63 65  le to limit acce
342e0 73 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ss to the databa
342f0 73 65 20 66 69 6c 65 20 74 6f 20 61 20 73 69 6e  se file to a sin
34300 67 6c 65 20 68 6f 73 74 0a 2a 2a 20 20 20 20 20  gle host.**     
34310 20 61 74 20 61 20 74 69 6d 65 0a 2a 2a 0a 2a 2a   at a time.**.**
34320 20 20 20 2a 20 20 70 72 6f 78 79 20 66 69 6c 65     *  proxy file
34330 20 74 6f 20 61 63 74 20 61 73 20 61 20 70 72 6f   to act as a pro
34340 78 79 20 66 6f 72 20 74 68 65 20 61 64 76 69 73  xy for the advis
34350 6f 72 79 20 6c 6f 63 6b 73 20 6e 6f 72 6d 61 6c  ory locks normal
34360 6c 79 0a 2a 2a 20 20 20 20 20 20 74 61 6b 65 6e  ly.**      taken
34370 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
34380 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 63 68  .**.** The conch
34390 20 66 69 6c 65 20 2d 20 74 6f 20 75 73 65 20 61   file - to use a
343a0 20 70 72 6f 78 79 20 66 69 6c 65 2c 20 73 71 6c   proxy file, sql
343b0 69 74 65 20 6d 75 73 74 20 66 69 72 73 74 20 22  ite must first "
343c0 68 6f 6c 64 20 74 68 65 20 63 6f 6e 63 68 22 0a  hold the conch".
343d0 2a 2a 20 62 79 20 74 61 6b 69 6e 67 20 61 6e 20  ** by taking an 
343e0 73 71 6c 69 74 65 2d 73 74 79 6c 65 20 73 68 61  sqlite-style sha
343f0 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  red lock on the 
34400 63 6f 6e 63 68 20 66 69 6c 65 2c 20 72 65 61 64  conch file, read
34410 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  ing the.** conte
34420 6e 74 73 20 61 6e 64 20 63 6f 6d 70 61 72 69 6e  nts and comparin
34430 67 20 74 68 65 20 68 6f 73 74 27 73 20 75 6e 69  g the host's uni
34440 71 75 65 20 68 6f 73 74 20 49 44 20 28 73 65 65  que host ID (see
34450 20 62 65 6c 6f 77 29 20 61 6e 64 20 6c 6f 63 6b   below) and lock
34460 0a 2a 2a 20 70 72 6f 78 79 20 70 61 74 68 20 61  .** proxy path a
34470 67 61 69 6e 73 74 20 74 68 65 20 76 61 6c 75 65  gainst the value
34480 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
34490 63 6f 6e 63 68 2e 20 20 54 68 65 20 63 6f 6e 63  conch.  The conc
344a0 68 20 66 69 6c 65 20 69 73 0a 2a 2a 20 73 74 6f  h file is.** sto
344b0 72 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20  red in the same 
344c0 64 69 72 65 63 74 6f 72 79 20 61 73 20 74 68 65  directory as the
344d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
344e0 6e 64 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65  nd the file name
344f0 0a 2a 2a 20 69 73 20 70 61 74 74 65 72 6e 65 64  .** is patterned
34500 20 61 66 74 65 72 20 74 68 65 20 64 61 74 61 62   after the datab
34510 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 73  ase file name as
34520 20 22 2e 3c 64 61 74 61 62 61 73 65 6e 61 6d 65   ".<databasename
34530 3e 2d 63 6f 6e 63 68 22 2e 0a 2a 2a 20 49 66 20  >-conch"..** If 
34540 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 64  the conch file d
34550 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 6f  oes not exist, o
34560 72 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 20 64  r its contents d
34570 6f 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 0a  o not match the.
34580 2a 2a 20 68 6f 73 74 20 49 44 20 61 6e 64 2f 6f  ** host ID and/o
34590 72 20 70 72 6f 78 79 20 70 61 74 68 2c 20 74 68  r proxy path, th
345a0 65 6e 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 65  en the lock is e
345b0 73 63 61 6c 61 74 65 64 20 74 6f 20 61 6e 20 65  scalated to an e
345c0 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6c 6f 63 6b  xclusive.** lock
345d0 20 61 6e 64 20 74 68 65 20 63 6f 6e 63 68 20 66   and the conch f
345e0 69 6c 65 20 63 6f 6e 74 65 6e 74 73 20 69 73 20  ile contents is 
345f0 75 70 64 61 74 65 64 20 77 69 74 68 20 74 68 65  updated with the
34600 20 68 6f 73 74 20 49 44 20 61 6e 64 20 70 72 6f   host ID and pro
34610 78 79 0a 2a 2a 20 70 61 74 68 20 61 6e 64 20 74  xy.** path and t
34620 68 65 20 6c 6f 63 6b 20 69 73 20 64 6f 77 6e 67  he lock is downg
34630 72 61 64 65 64 20 74 6f 20 61 20 73 68 61 72 65  raded to a share
34640 64 20 6c 6f 63 6b 20 61 67 61 69 6e 2e 20 20 49  d lock again.  I
34650 66 20 74 68 65 20 63 6f 6e 63 68 0a 2a 2a 20 69  f the conch.** i
34660 73 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65  s held by anothe
34670 72 20 70 72 6f 63 65 73 73 20 28 77 69 74 68 20  r process (with 
34680 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 29 2c 20  a shared lock), 
34690 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  the exclusive lo
346a0 63 6b 0a 2a 2a 20 77 69 6c 6c 20 66 61 69 6c 20  ck.** will fail 
346b0 61 6e 64 20 53 51 4c 49 54 45 5f 42 55 53 59 20  and SQLITE_BUSY 
346c0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
346d0 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 66 69 6c  ** The proxy fil
346e0 65 20 2d 20 61 20 73 69 6e 67 6c 65 2d 62 79 74  e - a single-byt
346f0 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20  e file used for 
34700 61 6c 6c 20 61 64 76 69 73 6f 72 79 20 66 69 6c  all advisory fil
34710 65 20 6c 6f 63 6b 73 0a 2a 2a 20 6e 6f 72 6d 61  e locks.** norma
34720 6c 6c 79 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65  lly taken on the
34730 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
34740 20 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 66 6f    This allows fo
34750 72 20 73 61 66 65 20 73 68 61 72 69 6e 67 0a 2a  r safe sharing.*
34760 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
34770 65 20 66 69 6c 65 20 66 6f 72 20 6d 75 6c 74 69  e file for multi
34780 70 6c 65 20 72 65 61 64 65 72 73 20 61 6e 64 20  ple readers and 
34790 77 72 69 74 65 72 73 20 6f 6e 20 74 68 65 20 73  writers on the s
347a0 61 6d 65 0a 2a 2a 20 68 6f 73 74 20 28 74 68 65  ame.** host (the
347b0 20 63 6f 6e 63 68 20 65 6e 73 75 72 65 73 20 74   conch ensures t
347c0 68 61 74 20 74 68 65 79 20 61 6c 6c 20 75 73 65  hat they all use
347d0 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 61 6c 20   the same local 
347e0 6c 6f 63 6b 20 66 69 6c 65 29 2e 0a 2a 2a 0a 2a  lock file)..**.*
347f0 2a 20 52 65 71 75 65 73 74 69 6e 67 20 74 68 65  * Requesting the
34800 20 6c 6f 63 6b 20 70 72 6f 78 79 20 64 6f 65 73   lock proxy does
34810 20 6e 6f 74 20 69 6d 6d 65 64 69 61 74 65 6c 79   not immediately
34820 20 74 61 6b 65 20 74 68 65 20 63 6f 6e 63 68 2c   take the conch,
34830 20 69 74 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 74   it is.** only t
34840 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 66 69  aken when the fi
34850 72 73 74 20 72 65 71 75 65 73 74 20 74 6f 20 6c  rst request to l
34860 6f 63 6b 20 64 61 74 61 62 61 73 65 20 66 69 6c  ock database fil
34870 65 20 69 73 20 6d 61 64 65 2e 20 20 0a 2a 2a 20  e is made.  .** 
34880 54 68 69 73 20 6d 61 74 63 68 65 73 20 74 68 65  This matches the
34890 20 73 65 6d 61 6e 74 69 63 73 20 6f 66 20 74 68   semantics of th
348a0 65 20 74 72 61 64 69 74 69 6f 6e 61 6c 20 6c 6f  e traditional lo
348b0 63 6b 69 6e 67 20 62 65 68 61 76 69 6f 72 2c 20  cking behavior, 
348c0 77 68 65 72 65 0a 2a 2a 20 6f 70 65 6e 69 6e 67  where.** opening
348d0 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f   a connection to
348e0 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
348f0 20 64 6f 65 73 20 6e 6f 74 20 74 61 6b 65 20 61   does not take a
34900 20 6c 6f 63 6b 20 6f 6e 20 69 74 2e 0a 2a 2a 20   lock on it..** 
34910 54 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  The shared lock 
34920 61 6e 64 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65  and an open file
34930 20 64 65 73 63 72 69 70 74 6f 72 20 61 72 65 20   descriptor are 
34940 6d 61 69 6e 74 61 69 6e 65 64 20 75 6e 74 69 6c  maintained until
34950 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 6e 65 63 74   .** the connect
34960 69 6f 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ion to the datab
34970 61 73 65 20 69 73 20 63 6c 6f 73 65 64 2e 20 0a  ase is closed. .
34980 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20  **.** The proxy 
34990 66 69 6c 65 20 61 6e 64 20 74 68 65 20 6c 6f 63  file and the loc
349a0 6b 20 66 69 6c 65 20 61 72 65 20 6e 65 76 65 72  k file are never
349b0 20 64 65 6c 65 74 65 64 20 73 6f 20 74 68 65 79   deleted so they
349c0 20 6f 6e 6c 79 20 6e 65 65 64 0a 2a 2a 20 74 6f   only need.** to
349d0 20 62 65 20 63 72 65 61 74 65 64 20 74 68 65 20   be created the 
349e0 66 69 72 73 74 20 74 69 6d 65 20 74 68 65 79 20  first time they 
349f0 61 72 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  are used..**.** 
34a00 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70  Configuration op
34a10 74 69 6f 6e 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d  tions.** -------
34a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
34a30 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 45  *.**  SQLITE_PRE
34a40 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  FER_PROXY_LOCKIN
34a50 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 44 61  G.**.**       Da
34a60 74 61 62 61 73 65 20 66 69 6c 65 73 20 61 63 63  tabase files acc
34a70 65 73 73 65 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f 63  essed on non-loc
34a80 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 73 20  al file systems 
34a90 61 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 75 74  are.**       aut
34aa0 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f 6e 66 69  omatically confi
34ab0 67 75 72 65 64 20 66 6f 72 20 70 72 6f 78 79 20  gured for proxy 
34ac0 6c 6f 63 6b 69 6e 67 2c 20 6c 6f 63 6b 20 66 69  locking, lock fi
34ad0 6c 65 73 20 61 72 65 0a 2a 2a 20 20 20 20 20 20  les are.**      
34ae0 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63   named automatic
34af0 61 6c 6c 79 20 75 73 69 6e 67 20 74 68 65 20 73  ally using the s
34b00 61 6d 65 20 6c 6f 67 69 63 20 61 73 0a 2a 2a 20  ame logic as.** 
34b10 20 20 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63        PRAGMA loc
34b20 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 22 3a 61  k_proxy_file=":a
34b30 75 74 6f 3a 22 0a 2a 2a 20 20 20 20 0a 2a 2a 20  uto:".**    .** 
34b40 20 53 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45   SQLITE_PROXY_DE
34b50 42 55 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  BUG.**.**       
34b60 45 6e 61 62 6c 65 73 20 74 68 65 20 6c 6f 67 67  Enables the logg
34b70 69 6e 67 20 6f 66 20 65 72 72 6f 72 20 6d 65 73  ing of error mes
34b80 73 61 67 65 73 20 64 75 72 69 6e 67 20 68 6f 73  sages during hos
34b90 74 20 69 64 20 66 69 6c 65 0a 2a 2a 20 20 20 20  t id file.**    
34ba0 20 20 20 72 65 74 72 69 65 76 61 6c 20 61 6e 64     retrieval and
34bb0 20 63 72 65 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20   creation.**.** 
34bc0 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a 2a 2a   LOCKPROXYDIR.**
34bd0 0a 2a 2a 20 20 20 20 20 20 20 4f 76 65 72 72 69  .**       Overri
34be0 64 65 73 20 74 68 65 20 64 65 66 61 75 6c 74 20  des the default 
34bf0 64 69 72 65 63 74 6f 72 79 20 75 73 65 64 20 66  directory used f
34c00 6f 72 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69  or lock proxy fi
34c10 6c 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  les that.**     
34c20 20 20 61 72 65 20 6e 61 6d 65 64 20 61 75 74 6f    are named auto
34c30 6d 61 74 69 63 61 6c 6c 79 20 76 69 61 20 74 68  matically via th
34c40 65 20 22 3a 61 75 74 6f 3a 22 20 73 65 74 74 69  e ":auto:" setti
34c50 6e 67 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45  ng.**.**  SQLITE
34c60 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49  _DEFAULT_PROXYDI
34c70 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 2a 2a  R_PERMISSIONS.**
34c80 0a 2a 2a 20 20 20 20 20 20 20 50 65 72 6d 69 73  .**       Permis
34c90 73 69 6f 6e 73 20 74 6f 20 75 73 65 20 77 68 65  sions to use whe
34ca0 6e 20 63 72 65 61 74 69 6e 67 20 61 20 64 69 72  n creating a dir
34cb0 65 63 74 6f 72 79 20 66 6f 72 20 73 74 6f 72 69  ectory for stori
34cc0 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  ng the.**       
34cd0 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73  lock proxy files
34ce0 2c 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e  , only used when
34cf0 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 20 69 73   LOCKPROXYDIR is
34d00 20 6e 6f 74 20 73 65 74 2e 0a 2a 2a 20 20 20 20   not set..**    
34d10 0a 2a 2a 20 20 20 20 0a 2a 2a 20 41 73 20 6d 65  .**    .** As me
34d20 6e 74 69 6f 6e 65 64 20 61 62 6f 76 65 2c 20 77  ntioned above, w
34d30 68 65 6e 20 63 6f 6d 70 69 6c 65 64 20 77 69 74  hen compiled wit
34d40 68 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f  h SQLITE_PREFER_
34d50 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 2c 0a 2a  PROXY_LOCKING,.*
34d60 2a 20 73 65 74 74 69 6e 67 20 74 68 65 20 65 6e  * setting the en
34d70 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62  vironment variab
34d80 6c 65 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f  le SQLITE_FORCE_
34d90 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 74 6f  PROXY_LOCKING to
34da0 20 31 20 77 69 6c 6c 0a 2a 2a 20 66 6f 72 63 65   1 will.** force
34db0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74   proxy locking t
34dc0 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 65 76  o be used for ev
34dd0 65 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c  ery database fil
34de0 65 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 30 0a  e opened, and 0.
34df0 2a 2a 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 75  ** will force au
34e00 74 6f 6d 61 74 69 63 20 70 72 6f 78 79 20 6c 6f  tomatic proxy lo
34e10 63 6b 69 6e 67 20 74 6f 20 62 65 20 64 69 73 61  cking to be disa
34e20 62 6c 65 64 20 66 6f 72 20 61 6c 6c 20 64 61 74  bled for all dat
34e30 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73 20 28  abase.** files (
34e40 65 78 70 6c 69 63 69 74 6c 79 20 63 61 6c 6c 69  explicitly calli
34e50 6e 67 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43  ng the SQLITE_FC
34e60 4e 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  NTL_SET_LOCKPROX
34e70 59 46 49 4c 45 20 70 72 61 67 6d 61 20 6f 72 0a  YFILE pragma or.
34e80 2a 2a 20 73 71 6c 69 74 65 5f 66 69 6c 65 5f 63  ** sqlite_file_c
34e90 6f 6e 74 72 6f 6c 20 41 50 49 20 69 73 20 6e 6f  ontrol API is no
34ea0 74 20 61 66 66 65 63 74 65 64 20 62 79 20 53 51  t affected by SQ
34eb0 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59  LITE_FORCE_PROXY
34ec0 5f 4c 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f  _LOCKING)..*/../
34ed0 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69  *.** Proxy locki
34ee0 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c  ng is only avail
34ef0 61 62 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20 0a  able on MacOSX .
34f00 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  */.#if defined(_
34f10 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
34f20 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
34f30 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20  NG_STYLE../*.** 
34f40 54 68 65 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  The proxyLocking
34f50 43 6f 6e 74 65 78 74 20 68 61 73 20 74 68 65 20  Context has the 
34f60 70 61 74 68 20 61 6e 64 20 66 69 6c 65 20 73 74  path and file st
34f70 72 75 63 74 75 72 65 73 20 66 6f 72 20 74 68 65  ructures for the
34f80 20 72 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64 20   remote .** and 
34f90 6c 6f 63 61 6c 20 70 72 6f 78 79 20 66 69 6c 65  local proxy file
34fa0 73 20 69 6e 20 69 74 0a 2a 2f 0a 74 79 70 65 64  s in it.*/.typed
34fb0 65 66 20 73 74 72 75 63 74 20 70 72 6f 78 79 4c  ef struct proxyL
34fc0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 70 72  ockingContext pr
34fd0 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
34fe0 74 3b 0a 73 74 72 75 63 74 20 70 72 6f 78 79 4c  t;.struct proxyL
34ff0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a  ockingContext {.
35000 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63    unixFile *conc
35010 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 2f  hFile;         /
35020 2a 20 4f 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c  * Open conch fil
35030 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e  e */.  char *con
35040 63 68 46 69 6c 65 50 61 74 68 3b 20 20 20 20 20  chFilePath;     
35050 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
35060 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f  he conch file */
35070 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63  .  unixFile *loc
35080 6b 50 72 6f 78 79 3b 20 20 20 20 20 20 20 20 20  kProxy;         
35090 2f 2a 20 4f 70 65 6e 20 70 72 6f 78 79 20 6c 6f  /* Open proxy lo
350a0 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  ck file */.  cha
350b0 72 20 2a 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  r *lockProxyPath
350c0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  ;         /* Nam
350d0 65 20 6f 66 20 74 68 65 20 70 72 6f 78 79 20 6c  e of the proxy l
350e0 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  ock file */.  ch
350f0 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20  ar *dbPath;     
35100 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
35110 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66  me of the open f
35120 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e  ile */.  int con
35130 63 68 48 65 6c 64 3b 20 20 20 20 20 20 20 20 20  chHeld;         
35140 20 20 20 20 20 20 2f 2a 20 31 20 69 66 20 74 68        /* 1 if th
35150 65 20 63 6f 6e 63 68 20 69 73 20 68 65 6c 64 2c  e conch is held,
35160 20 2d 31 20 69 66 20 6c 6f 63 6b 6c 65 73 73 20   -1 if lockless 
35170 2a 2f 0a 20 20 69 6e 74 20 6e 46 61 69 6c 73 3b  */.  int nFails;
35180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35190 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
351a0 6f 6e 63 68 20 74 61 6b 69 6e 67 20 66 61 69 6c  onch taking fail
351b0 75 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  ures */.  void *
351c0 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oldLockingContex
351d0 74 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e  t;     /* Origin
351e0 61 6c 20 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65 78  al lockingcontex
351f0 74 20 74 6f 20 72 65 73 74 6f 72 65 20 6f 6e 20  t to restore on 
35200 63 6c 6f 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  close */.  sqlit
35210 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f  e3_io_methods co
35220 6e 73 74 20 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b  nst *pOldMethod;
35230 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
35240 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 66 6f 72   I/O methods for
35250 20 63 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   close */.};../*
35260 20 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c   .** The proxy l
35270 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20 66 6f  ock file path fo
35280 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  r the database a
35290 74 20 64 62 50 61 74 68 20 69 73 20 77 72 69 74  t dbPath is writ
352a0 74 65 6e 20 69 6e 74 6f 20 6c 50 61 74 68 2c 20  ten into lPath, 
352b0 0a 2a 2a 20 77 68 69 63 68 20 6d 75 73 74 20 70  .** which must p
352c0 6f 69 6e 74 20 74 6f 20 76 61 6c 69 64 2c 20 77  oint to valid, w
352d0 72 69 74 61 62 6c 65 20 6d 65 6d 6f 72 79 20 6c  ritable memory l
352e0 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20  arge enough for 
352f0 61 20 6d 61 78 4c 65 6e 20 6c 65 6e 67 74 68 0a  a maxLen length.
35300 2a 2a 20 66 69 6c 65 20 70 61 74 68 2e 20 0a 2a  ** file path. .*
35310 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
35320 78 79 47 65 74 4c 6f 63 6b 50 61 74 68 28 63 6f  xyGetLockPath(co
35330 6e 73 74 20 63 68 61 72 20 2a 64 62 50 61 74 68  nst char *dbPath
35340 2c 20 63 68 61 72 20 2a 6c 50 61 74 68 2c 20 73  , char *lPath, s
35350 69 7a 65 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a 20  ize_t maxLen){. 
35360 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20   int len;.  int 
35370 64 62 4c 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a  dbLen;.  int i;.
35380 0a 23 69 66 64 65 66 20 4c 4f 43 4b 50 52 4f 58  .#ifdef LOCKPROX
35390 59 44 49 52 0a 20 20 6c 65 6e 20 3d 20 73 74 72  YDIR.  len = str
353a0 6c 63 70 79 28 6c 50 61 74 68 2c 20 4c 4f 43 4b  lcpy(lPath, LOCK
353b0 50 52 4f 58 59 44 49 52 2c 20 6d 61 78 4c 65 6e  PROXYDIR, maxLen
353c0 29 3b 0a 23 65 6c 73 65 0a 23 20 69 66 64 65 66  );.#else.# ifdef
353d0 20 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52   _CS_DARWIN_USER
353e0 5f 54 45 4d 50 5f 44 49 52 0a 20 20 7b 0a 20 20  _TEMP_DIR.  {.  
353f0 20 20 69 66 28 20 21 63 6f 6e 66 73 74 72 28 5f    if( !confstr(_
35400 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54  CS_DARWIN_USER_T
35410 45 4d 50 5f 44 49 52 2c 20 6c 50 61 74 68 2c 20  EMP_DIR, lPath, 
35420 6d 61 78 4c 65 6e 29 20 29 7b 0a 20 20 20 20 20  maxLen) ){.     
35430 20 4f 53 54 52 41 43 45 28 28 22 47 45 54 4c 4f   OSTRACE(("GETLO
35440 43 4b 50 41 54 48 20 20 66 61 69 6c 65 64 20 25  CKPATH  failed %
35450 73 20 65 72 72 6e 6f 3d 25 64 20 70 69 64 3d 25  s errno=%d pid=%
35460 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
35470 20 20 20 20 20 6c 50 61 74 68 2c 20 65 72 72 6e       lPath, errn
35480 6f 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29 29  o, osGetpid(0)))
35490 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
354a0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
354b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20  ;.    }.    len 
354c0 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c  = strlcat(lPath,
354d0 20 22 73 71 6c 69 74 65 70 6c 6f 63 6b 73 22 2c   "sqliteplocks",
354e0 20 6d 61 78 4c 65 6e 29 3b 20 20 20 20 0a 20 20   maxLen);    .  
354f0 7d 0a 23 20 65 6c 73 65 0a 20 20 6c 65 6e 20 3d  }.# else.  len =
35500 20 73 74 72 6c 63 70 79 28 6c 50 61 74 68 2c 20   strlcpy(lPath, 
35510 22 2f 74 6d 70 2f 22 2c 20 6d 61 78 4c 65 6e 29  "/tmp/", maxLen)
35520 3b 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  ;.# endif.#endif
35530 0a 0a 20 20 69 66 28 20 6c 50 61 74 68 5b 6c 65  ..  if( lPath[le
35540 6e 2d 31 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20  n-1]!='/' ){.   
35550 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c   len = strlcat(l
35560 50 61 74 68 2c 20 22 2f 22 2c 20 6d 61 78 4c 65  Path, "/", maxLe
35570 6e 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  n);.  }.  .  /* 
35580 74 72 61 6e 73 66 6f 72 6d 20 74 68 65 20 64 62  transform the db
35590 20 70 61 74 68 20 74 6f 20 61 20 75 6e 69 71 75   path to a uniqu
355a0 65 20 63 61 63 68 65 20 6e 61 6d 65 20 2a 2f 0a  e cache name */.
355b0 20 20 64 62 4c 65 6e 20 3d 20 28 69 6e 74 29 73    dbLen = (int)s
355c0 74 72 6c 65 6e 28 64 62 50 61 74 68 29 3b 0a 20  trlen(dbPath);. 
355d0 20 66 6f 72 28 20 69 3d 30 3b 20 69 3c 64 62 4c   for( i=0; i<dbL
355e0 65 6e 20 26 26 20 28 69 2b 6c 65 6e 2b 37 29 3c  en && (i+len+7)<
355f0 28 69 6e 74 29 6d 61 78 4c 65 6e 3b 20 69 2b 2b  (int)maxLen; i++
35600 29 7b 0a 20 20 20 20 63 68 61 72 20 63 20 3d 20  ){.    char c = 
35610 64 62 50 61 74 68 5b 69 5d 3b 0a 20 20 20 20 6c  dbPath[i];.    l
35620 50 61 74 68 5b 69 2b 6c 65 6e 5d 20 3d 20 28 63  Path[i+len] = (c
35630 3d 3d 27 2f 27 29 3f 27 5f 27 3a 63 3b 0a 20 20  =='/')?'_':c;.  
35640 7d 0a 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d  }.  lPath[i+len]
35650 3d 27 5c 30 27 3b 0a 20 20 73 74 72 6c 63 61 74  ='\0';.  strlcat
35660 28 6c 50 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22  (lPath, ":auto:"
35670 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 4f 53 54  , maxLen);.  OST
35680 52 41 43 45 28 28 22 47 45 54 4c 4f 43 4b 50 41  RACE(("GETLOCKPA
35690 54 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70  TH  proxy lock p
356a0 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22  ath=%s pid=%d\n"
356b0 2c 20 6c 50 61 74 68 2c 20 6f 73 47 65 74 70 69  , lPath, osGetpi
356c0 64 28 30 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  d(0)));.  return
356d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
356e0 2a 20 0a 20 2a 2a 20 43 72 65 61 74 65 73 20 74  * . ** Creates t
356f0 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6e 64  he lock file and
35700 20 61 6e 79 20 6d 69 73 73 69 6e 67 20 64 69 72   any missing dir
35710 65 63 74 6f 72 69 65 73 20 69 6e 20 6c 6f 63 6b  ectories in lock
35720 50 61 74 68 0a 20 2a 2f 0a 73 74 61 74 69 63 20  Path. */.static 
35730 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65 4c  int proxyCreateL
35740 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63 68  ockPath(const ch
35750 61 72 20 2a 6c 6f 63 6b 50 61 74 68 29 7b 0a 20  ar *lockPath){. 
35760 20 69 6e 74 20 69 2c 20 6c 65 6e 3b 0a 20 20 63   int i, len;.  c
35770 68 61 72 20 62 75 66 5b 4d 41 58 50 41 54 48 4c  har buf[MAXPATHL
35780 45 4e 5d 3b 0a 20 20 69 6e 74 20 73 74 61 72 74  EN];.  int start
35790 20 3d 20 30 3b 0a 20 20 0a 20 20 61 73 73 65 72   = 0;.  .  asser
357a0 74 28 6c 6f 63 6b 50 61 74 68 21 3d 4e 55 4c 4c  t(lockPath!=NULL
357b0 29 3b 0a 20 20 2f 2a 20 74 72 79 20 74 6f 20 63  );.  /* try to c
357c0 72 65 61 74 65 20 61 6c 6c 20 74 68 65 20 69 6e  reate all the in
357d0 74 65 72 6d 65 64 69 61 74 65 20 64 69 72 65 63  termediate direc
357e0 74 6f 72 69 65 73 20 2a 2f 0a 20 20 6c 65 6e 20  tories */.  len 
357f0 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 6c 6f  = (int)strlen(lo
35800 63 6b 50 61 74 68 29 3b 0a 20 20 62 75 66 5b 30  ckPath);.  buf[0
35810 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 30 5d 3b  ] = lockPath[0];
35820 0a 20 20 66 6f 72 28 20 69 3d 31 3b 20 69 3c 6c  .  for( i=1; i<l
35830 65 6e 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 69  en; i++ ){.    i
35840 66 28 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 20 3d  f( lockPath[i] =
35850 3d 20 27 2f 27 20 26 26 20 28 69 20 2d 20 73 74  = '/' && (i - st
35860 61 72 74 20 3e 20 30 29 20 29 7b 0a 20 20 20 20  art > 0) ){.    
35870 20 20 2f 2a 20 6f 6e 6c 79 20 6d 6b 64 69 72 20    /* only mkdir 
35880 69 66 20 6c 65 61 66 20 64 69 72 20 21 3d 20 22  if leaf dir != "
35890 2e 22 20 6f 72 20 22 2f 22 20 6f 72 20 22 2e 2e  ." or "/" or "..
358a0 22 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69  " */.      if( i
358b0 2d 73 74 61 72 74 3e 32 20 7c 7c 20 28 69 2d 73  -start>2 || (i-s
358c0 74 61 72 74 3d 3d 31 20 26 26 20 62 75 66 5b 73  tart==1 && buf[s
358d0 74 61 72 74 5d 20 21 3d 20 27 2e 27 20 26 26 20  tart] != '.' && 
358e0 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2f  buf[start] != '/
358f0 27 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ') .         || 
35900 28 69 2d 73 74 61 72 74 3d 3d 32 20 26 26 20 62  (i-start==2 && b
35910 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e 27  uf[start] != '.'
35920 20 26 26 20 62 75 66 5b 73 74 61 72 74 2b 31 5d   && buf[start+1]
35930 20 21 3d 20 27 2e 27 29 20 29 7b 0a 20 20 20 20   != '.') ){.    
35940 20 20 20 20 62 75 66 5b 69 5d 3d 27 5c 30 27 3b      buf[i]='\0';
35950 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f 73 4d  .        if( osM
35960 6b 64 69 72 28 62 75 66 2c 20 53 51 4c 49 54 45  kdir(buf, SQLITE
35970 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49  _DEFAULT_PROXYDI
35980 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 20 29  R_PERMISSIONS) )
35990 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
359a0 65 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20 20 20  err=errno;.     
359b0 20 20 20 20 20 69 66 28 20 65 72 72 21 3d 45 45       if( err!=EE
359c0 58 49 53 54 20 29 20 7b 0a 20 20 20 20 20 20 20  XIST ) {.       
359d0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 43       OSTRACE(("C
359e0 52 45 41 54 45 4c 4f 43 4b 50 41 54 48 20 20 46  REATELOCKPATH  F
359f0 41 49 4c 45 44 20 63 72 65 61 74 69 6e 67 20 25  AILED creating %
35a00 73 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  s, ".           
35a10 20 20 20 20 20 20 20 20 20 20 22 27 25 73 27 20            "'%s' 
35a20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d  proxy lock path=
35a30 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20  %s pid=%d\n",.  
35a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35a50 20 20 20 62 75 66 2c 20 73 74 72 65 72 72 6f 72     buf, strerror
35a60 28 65 72 72 29 2c 20 6c 6f 63 6b 50 61 74 68 2c  (err), lockPath,
35a70 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a   osGetpid(0)));.
35a80 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
35a90 72 6e 20 65 72 72 3b 0a 20 20 20 20 20 20 20 20  rn err;.        
35aa0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
35ab0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74 61 72      }.      star
35ac0 74 3d 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20  t=i+1;.    }.   
35ad0 20 62 75 66 5b 69 5d 20 3d 20 6c 6f 63 6b 50 61   buf[i] = lockPa
35ae0 74 68 5b 69 5d 3b 0a 20 20 7d 0a 20 20 4f 53 54  th[i];.  }.  OST
35af0 52 41 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43  RACE(("CREATELOC
35b00 4b 50 41 54 48 20 20 70 72 6f 78 79 20 6c 6f 63  KPATH  proxy loc
35b10 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64  k path=%s pid=%d
35b20 5c 6e 22 2c 6c 6f 63 6b 50 61 74 68 2c 6f 73 47  \n",lockPath,osG
35b30 65 74 70 69 64 28 30 29 29 29 3b 0a 20 20 72 65  etpid(0)));.  re
35b40 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
35b50 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 56 46   Create a new VF
35b60 53 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  S file descripto
35b70 72 20 28 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d  r (stored in mem
35b80 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
35b90 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c  m.** sqlite3_mal
35ba0 6c 6f 63 29 20 61 6e 64 20 6f 70 65 6e 20 74 68  loc) and open th
35bb0 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 22 70 61  e file named "pa
35bc0 74 68 22 20 69 6e 20 74 68 65 20 66 69 6c 65 20  th" in the file 
35bd0 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a  descriptor..**.*
35be0 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20  * The caller is 
35bf0 72 65 73 70 6f 6e 73 69 62 6c 65 20 6e 6f 74 20  responsible not 
35c00 6f 6e 6c 79 20 66 6f 72 20 63 6c 6f 73 69 6e 67  only for closing
35c10 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
35c20 70 74 6f 72 0a 2a 2a 20 62 75 74 20 61 6c 73 6f  ptor.** but also
35c30 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68 65   for freeing the
35c40 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
35c50 65 64 20 77 69 74 68 20 74 68 65 20 66 69 6c 65  ed with the file
35c60 20 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2f 0a   descriptor..*/.
35c70 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
35c80 43 72 65 61 74 65 55 6e 69 78 46 69 6c 65 28 0a  CreateUnixFile(.
35c90 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
35ca0 70 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20  path,        /* 
35cb0 70 61 74 68 20 66 6f 72 20 74 68 65 20 6e 65 77  path for the new
35cc0 20 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 20 20 20   unixFile */.   
35cd0 20 75 6e 69 78 46 69 6c 65 20 2a 2a 70 70 46 69   unixFile **ppFi
35ce0 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20 75 6e 69  le,       /* uni
35cf0 78 46 69 6c 65 20 63 72 65 61 74 65 64 20 61 6e  xFile created an
35d00 64 20 72 65 74 75 72 6e 65 64 20 62 79 20 72 65  d returned by re
35d10 66 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 6c  f */.    int isl
35d20 6f 63 6b 66 69 6c 65 20 20 20 20 20 20 20 20 20  ockfile         
35d30 20 20 2f 2a 20 69 66 20 6e 6f 6e 20 7a 65 72 6f    /* if non zero
35d40 20 6d 69 73 73 69 6e 67 20 64 69 72 73 20 77 69   missing dirs wi
35d50 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f  ll be created */
35d60 0a 29 20 7b 0a 20 20 69 6e 74 20 66 64 20 3d 20  .) {.  int fd = 
35d70 2d 31 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  -1;.  unixFile *
35d80 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pNew;.  int rc =
35d90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
35da0 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f  t openFlags = O_
35db0 52 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a  RDWR | O_CREAT;.
35dc0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 64 75    sqlite3_vfs du
35dd0 6d 6d 79 56 66 73 3b 0a 20 20 69 6e 74 20 74 65  mmyVfs;.  int te
35de0 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 55 6e 69 78  rrno = 0;.  Unix
35df0 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65  UnusedFd *pUnuse
35e00 64 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 2f 2a 20  d = NULL;..  /* 
35e10 31 2e 20 66 69 72 73 74 20 74 72 79 20 74 6f 20  1. first try to 
35e20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20  open/create the 
35e30 66 69 6c 65 0a 20 20 2a 2a 20 32 2e 20 69 66 20  file.  ** 2. if 
35e40 74 68 61 74 20 66 61 69 6c 73 2c 20 61 6e 64 20  that fails, and 
35e50 74 68 69 73 20 69 73 20 61 20 6c 6f 63 6b 20 66  this is a lock f
35e60 69 6c 65 20 28 6e 6f 74 2d 63 6f 6e 63 68 29 2c  ile (not-conch),
35e70 20 74 72 79 20 63 72 65 61 74 69 6e 67 0a 20 20   try creating.  
35e80 2a 2a 20 74 68 65 20 70 61 72 65 6e 74 20 64 69  ** the parent di
35e90 72 65 63 74 6f 72 69 65 73 20 61 6e 64 20 74 68  rectories and th
35ea0 65 6e 20 74 72 79 20 61 67 61 69 6e 2e 0a 20 20  en try again..  
35eb0 2a 2a 20 33 2e 20 69 66 20 74 68 61 74 20 66 61  ** 3. if that fa
35ec0 69 6c 73 2c 20 74 72 79 20 74 6f 20 6f 70 65 6e  ils, try to open
35ed0 20 74 68 65 20 66 69 6c 65 20 72 65 61 64 2d 6f   the file read-o
35ee0 6e 6c 79 0a 20 20 2a 2a 20 6f 74 68 65 72 77 69  nly.  ** otherwi
35ef0 73 65 20 72 65 74 75 72 6e 20 42 55 53 59 20 28  se return BUSY (
35f00 69 66 20 6c 6f 63 6b 20 66 69 6c 65 29 20 6f 72  if lock file) or
35f10 20 43 41 4e 54 4f 50 45 4e 20 66 6f 72 20 74 68   CANTOPEN for th
35f20 65 20 63 6f 6e 63 68 20 66 69 6c 65 0a 20 20 2a  e conch file.  *
35f30 2f 0a 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69  /.  pUnused = fi
35f40 6e 64 52 65 75 73 61 62 6c 65 46 64 28 70 61 74  ndReusableFd(pat
35f50 68 2c 20 6f 70 65 6e 46 6c 61 67 73 29 3b 0a 20  h, openFlags);. 
35f60 20 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a   if( pUnused ){.
35f70 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73 65 64      fd = pUnused
35f80 2d 3e 66 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ->fd;.  }else{. 
35f90 20 20 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c     pUnused = sql
35fa0 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 69  ite3_malloc64(si
35fb0 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29 29 3b  zeof(*pUnused));
35fc0 0a 20 20 20 20 69 66 28 20 21 70 55 6e 75 73 65  .    if( !pUnuse
35fd0 64 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  d ){.      retur
35fe0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
35ff0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
36000 66 64 3c 30 20 29 7b 0a 20 20 20 20 66 64 20 3d  fd<0 ){.    fd =
36010 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74   robust_open(pat
36020 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29  h, openFlags, 0)
36030 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d 20 65  ;.    terrno = e
36040 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 66 64  rrno;.    if( fd
36050 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f  <0 && errno==ENO
36060 45 4e 54 20 26 26 20 69 73 6c 6f 63 6b 66 69 6c  ENT && islockfil
36070 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  e ){.      if( p
36080 72 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b 50 61  roxyCreateLockPa
36090 74 68 28 70 61 74 68 29 20 3d 3d 20 53 51 4c 49  th(path) == SQLI
360a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
360b0 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
360c0 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67  n(path, openFlag
360d0 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  s, 0);.      }. 
360e0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66     }.  }.  if( f
360f0 64 3c 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 46  d<0 ){.    openF
36100 6c 61 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b  lags = O_RDONLY;
36110 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74  .    fd = robust
36120 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e  _open(path, open
36130 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 74  Flags, 0);.    t
36140 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  errno = errno;. 
36150 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b   }.  if( fd<0 ){
36160 0a 20 20 20 20 69 66 28 20 69 73 6c 6f 63 6b 66  .    if( islockf
36170 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ile ){.      ret
36180 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
36190 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63  .    }.    switc
361a0 68 20 28 74 65 72 72 6e 6f 29 20 7b 0a 20 20 20  h (terrno) {.   
361b0 20 20 20 63 61 73 65 20 45 41 43 43 45 53 3a 0a     case EACCES:.
361c0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
361d0 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20  QLITE_PERM;.    
361e0 20 20 63 61 73 65 20 45 49 4f 3a 20 0a 20 20 20    case EIO: .   
361f0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
36200 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 20 2f  TE_IOERR_LOCK; /
36210 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74  * even though it
36220 20 69 73 20 74 68 65 20 63 6f 6e 63 68 20 2a 2f   is the conch */
36230 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  .      default:.
36240 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
36250 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
36260 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  KPT;.    }.  }. 
36270 20 0a 20 20 70 4e 65 77 20 3d 20 28 75 6e 69 78   .  pNew = (unix
36280 46 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d  File *)sqlite3_m
36290 61 6c 6c 6f 63 36 34 28 73 69 7a 65 6f 66 28 2a  alloc64(sizeof(*
362a0 70 4e 65 77 29 29 3b 0a 20 20 69 66 28 20 70 4e  pNew));.  if( pN
362b0 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  ew==NULL ){.    
362c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
362d0 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  M;.    goto end_
362e0 63 72 65 61 74 65 5f 70 72 6f 78 79 3b 0a 20 20  create_proxy;.  
362f0 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c  }.  memset(pNew,
36300 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46   0, sizeof(unixF
36310 69 6c 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f  ile));.  pNew->o
36320 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46  penFlags = openF
36330 6c 61 67 73 3b 0a 20 20 6d 65 6d 73 65 74 28 26  lags;.  memset(&
36340 64 75 6d 6d 79 56 66 73 2c 20 30 2c 20 73 69 7a  dummyVfs, 0, siz
36350 65 6f 66 28 64 75 6d 6d 79 56 66 73 29 29 3b 0a  eof(dummyVfs));.
36360 20 20 64 75 6d 6d 79 56 66 73 2e 70 41 70 70 44    dummyVfs.pAppD
36370 61 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 61 75  ata = (void*)&au
36380 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 3b 0a  tolockIoFinder;.
36390 20 20 64 75 6d 6d 79 56 66 73 2e 7a 4e 61 6d 65    dummyVfs.zName
363a0 20 3d 20 22 64 75 6d 6d 79 22 3b 0a 20 20 70 55   = "dummy";.  pU
363b0 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b 0a  nused->fd = fd;.
363c0 20 20 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73    pUnused->flags
363d0 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20   = openFlags;.  
363e0 70 4e 65 77 2d 3e 70 55 6e 75 73 65 64 20 3d 20  pNew->pUnused = 
363f0 70 55 6e 75 73 65 64 3b 0a 20 20 0a 20 20 72 63  pUnused;.  .  rc
36400 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c   = fillInUnixFil
36410 65 28 26 64 75 6d 6d 79 56 66 73 2c 20 66 64 2c  e(&dummyVfs, fd,
36420 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
36430 70 4e 65 77 2c 20 70 61 74 68 2c 20 30 29 3b 0a  pNew, path, 0);.
36440 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
36450 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 70 46 69  _OK ){.    *ppFi
36460 6c 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 72  le = pNew;.    r
36470 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
36480 0a 20 20 7d 0a 65 6e 64 5f 63 72 65 61 74 65 5f  .  }.end_create_
36490 70 72 6f 78 79 3a 20 20 20 20 0a 20 20 72 6f 62  proxy:    .  rob
364a0 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20  ust_close(pNew, 
364b0 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
364c0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
364d0 65 77 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ew);.  sqlite3_f
364e0 72 65 65 28 70 55 6e 75 73 65 64 29 3b 0a 20 20  ree(pUnused);.  
364f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
36500 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
36510 0a 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c  ./* simulate mul
36520 74 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63  tiple hosts by c
36530 72 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68  reating unique h
36540 6f 73 74 69 64 20 66 69 6c 65 20 70 61 74 68 73  ostid file paths
36550 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   */.int sqlite3_
36560 68 6f 73 74 69 64 5f 6e 75 6d 20 3d 20 30 3b 0a  hostid_num = 0;.
36570 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
36580 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20  PROXY_HOSTIDLEN 
36590 20 20 20 31 36 20 20 2f 2a 20 63 6f 6e 63 68 20     16  /* conch 
365a0 66 69 6c 65 20 68 6f 73 74 20 69 64 20 6c 65 6e  file host id len
365b0 67 74 68 20 2a 2f 0a 0a 23 69 66 64 65 66 20 48  gth */..#ifdef H
365c0 41 56 45 5f 47 45 54 48 4f 53 54 55 55 49 44 0a  AVE_GETHOSTUUID.
365d0 2f 2a 20 4e 6f 74 20 61 6c 77 61 79 73 20 64 65  /* Not always de
365e0 66 69 6e 65 64 20 69 6e 20 74 68 65 20 68 65 61  fined in the hea
365f0 64 65 72 73 20 61 73 20 69 74 20 6f 75 67 68 74  ders as it ought
36600 20 74 6f 20 62 65 20 2a 2f 0a 65 78 74 65 72 6e   to be */.extern
36610 20 69 6e 74 20 67 65 74 68 6f 73 74 75 75 69 64   int gethostuuid
36620 28 75 75 69 64 5f 74 20 69 64 2c 20 63 6f 6e 73  (uuid_t id, cons
36630 74 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65  t struct timespe
36640 63 20 2a 77 61 69 74 29 3b 0a 23 65 6e 64 69 66  c *wait);.#endif
36650 0a 0a 2f 2a 20 67 65 74 20 74 68 65 20 68 6f 73  ../* get the hos
36660 74 20 49 44 20 76 69 61 20 67 65 74 68 6f 73 74  t ID via gethost
36670 75 75 69 64 28 29 2c 20 70 48 6f 73 74 49 44 20  uuid(), pHostID 
36680 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 50 52  must point to PR
36690 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 0a 2a  OXY_HOSTIDLEN .*
366a0 2a 20 62 79 74 65 73 20 6f 66 20 77 72 69 74 61  * bytes of writa
366b0 62 6c 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73  ble memory..*/.s
366c0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47  tatic int proxyG
366d0 65 74 48 6f 73 74 49 44 28 75 6e 73 69 67 6e 65  etHostID(unsigne
366e0 64 20 63 68 61 72 20 2a 70 48 6f 73 74 49 44 2c  d char *pHostID,
366f0 20 69 6e 74 20 2a 70 45 72 72 6f 72 29 7b 0a 20   int *pError){. 
36700 20 61 73 73 65 72 74 28 50 52 4f 58 59 5f 48 4f   assert(PROXY_HO
36710 53 54 49 44 4c 45 4e 20 3d 3d 20 73 69 7a 65 6f  STIDLEN == sizeo
36720 66 28 75 75 69 64 5f 74 29 29 3b 0a 20 20 6d 65  f(uuid_t));.  me
36730 6d 73 65 74 28 70 48 6f 73 74 49 44 2c 20 30 2c  mset(pHostID, 0,
36740 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e   PROXY_HOSTIDLEN
36750 29 3b 0a 23 69 66 64 65 66 20 48 41 56 45 5f 47  );.#ifdef HAVE_G
36760 45 54 48 4f 53 54 55 55 49 44 0a 20 20 7b 0a 20  ETHOSTUUID.  {. 
36770 20 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70     struct timesp
36780 65 63 20 74 69 6d 65 6f 75 74 20 3d 20 7b 31 2c  ec timeout = {1,
36790 20 30 7d 3b 20 2f 2a 20 31 20 73 65 63 20 74 69   0}; /* 1 sec ti
367a0 6d 65 6f 75 74 20 2a 2f 0a 20 20 20 20 69 66 28  meout */.    if(
367b0 20 67 65 74 68 6f 73 74 75 75 69 64 28 70 48 6f   gethostuuid(pHo
367c0 73 74 49 44 2c 20 26 74 69 6d 65 6f 75 74 29 20  stID, &timeout) 
367d0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72  ){.      int err
367e0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
367f0 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20  if( pError ){.  
36800 20 20 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20        *pError = 
36810 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  err;.      }.   
36820 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
36830 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20  _IOERR;.    }.  
36840 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  }.#else.  UNUSED
36850 5f 50 41 52 41 4d 45 54 45 52 28 70 45 72 72 6f  _PARAMETER(pErro
36860 72 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  r);.#endif.#ifde
36870 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
36880 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74  /* simulate mult
36890 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63 72  iple hosts by cr
368a0 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68 6f  eating unique ho
368b0 73 74 69 64 20 66 69 6c 65 20 70 61 74 68 73 20  stid file paths 
368c0 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
368d0 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 21 3d 20 30  _hostid_num != 0
368e0 29 7b 0a 20 20 20 20 70 48 6f 73 74 49 44 5b 30  ){.    pHostID[0
368f0 5d 20 3d 20 28 63 68 61 72 29 28 70 48 6f 73 74  ] = (char)(pHost
36900 49 44 5b 30 5d 20 2b 20 28 63 68 61 72 29 28 73  ID[0] + (char)(s
36910 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75  qlite3_hostid_nu
36920 6d 20 26 20 30 78 46 46 29 29 3b 0a 20 20 7d 0a  m & 0xFF));.  }.
36930 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 65 74 75  #endif.  .  retu
36940 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
36950 0a 2f 2a 20 54 68 65 20 63 6f 6e 63 68 20 66 69  ./* The conch fi
36960 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  le contains the 
36970 68 65 61 64 65 72 2c 20 68 6f 73 74 20 69 64 20  header, host id 
36980 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61  and lock file pa
36990 74 68 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  th. */.#define P
369a0 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f  ROXY_CONCHVERSIO
369b0 4e 20 32 20 20 20 2f 2a 20 31 2d 62 79 74 65 20  N 2   /* 1-byte 
369c0 68 65 61 64 65 72 2c 20 31 36 2d 62 79 74 65 20  header, 16-byte 
369d0 68 6f 73 74 20 69 64 2c 20 70 61 74 68 20 2a 2f  host id, path */
369e0 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 48  .#define PROXY_H
369f0 45 41 44 45 52 4c 45 4e 20 20 20 20 31 20 20 20  EADERLEN    1   
36a00 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 68 65  /* conch file he
36a10 61 64 65 72 20 6c 65 6e 67 74 68 20 2a 2f 0a 23  ader length */.#
36a20 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 50 41 54  define PROXY_PAT
36a30 48 49 4e 44 45 58 20 20 20 20 28 50 52 4f 58 59  HINDEX    (PROXY
36a40 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59  _HEADERLEN+PROXY
36a50 5f 48 4f 53 54 49 44 4c 45 4e 29 0a 23 64 65 66  _HOSTIDLEN).#def
36a60 69 6e 65 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  ine PROXY_MAXCON
36a70 43 48 4c 45 4e 20 20 28 50 52 4f 58 59 5f 48 45  CHLEN  (PROXY_HE
36a80 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f  ADERLEN+PROXY_HO
36a90 53 54 49 44 4c 45 4e 2b 4d 41 58 50 41 54 48 4c  STIDLEN+MAXPATHL
36aa0 45 4e 29 0a 0a 2f 2a 20 0a 2a 2a 20 54 61 6b 65  EN)../* .** Take
36ab0 73 20 61 6e 20 6f 70 65 6e 20 63 6f 6e 63 68 20  s an open conch 
36ac0 66 69 6c 65 2c 20 63 6f 70 69 65 73 20 74 68 65  file, copies the
36ad0 20 63 6f 6e 74 65 6e 74 73 20 74 6f 20 61 20 6e   contents to a n
36ae0 65 77 20 70 61 74 68 20 61 6e 64 20 74 68 65 6e  ew path and then
36af0 20 6d 6f 76 65 73 20 0a 2a 2a 20 69 74 20 62 61   moves .** it ba
36b00 63 6b 2e 20 20 54 68 65 20 6e 65 77 6c 79 20 63  ck.  The newly c
36b10 72 65 61 74 65 64 20 66 69 6c 65 27 73 20 66 69  reated file's fi
36b20 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
36b30 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65   assigned to the
36b40 0a 2a 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 73  .** conch file s
36b50 74 72 75 63 74 75 72 65 20 61 6e 64 20 66 69 6e  tructure and fin
36b60 61 6c 6c 79 20 74 68 65 20 6f 72 69 67 69 6e 61  ally the origina
36b70 6c 20 63 6f 6e 63 68 20 66 69 6c 65 20 64 65 73  l conch file des
36b80 63 72 69 70 74 6f 72 20 69 73 20 0a 2a 2a 20 63  criptor is .** c
36b90 6c 6f 73 65 64 2e 20 20 52 65 74 75 72 6e 73 20  losed.  Returns 
36ba0 7a 65 72 6f 20 69 66 20 73 75 63 63 65 73 73 66  zero if successf
36bb0 75 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ul..*/.static in
36bc0 74 20 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63  t proxyBreakConc
36bd0 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a  hLock(unixFile *
36be0 70 46 69 6c 65 2c 20 75 75 69 64 5f 74 20 6d 79  pFile, uuid_t my
36bf0 48 6f 73 74 49 44 29 7b 0a 20 20 70 72 6f 78 79  HostID){.  proxy
36c00 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
36c10 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
36c20 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46  kingContext *)pF
36c30 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
36c40 65 78 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65  ext; .  unixFile
36c50 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43   *conchFile = pC
36c60 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20  tx->conchFile;. 
36c70 20 63 68 61 72 20 74 50 61 74 68 5b 4d 41 58 50   char tPath[MAXP
36c80 41 54 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20  ATHLEN];.  char 
36c90 62 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  buf[PROXY_MAXCON
36ca0 43 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20 2a  CHLEN];.  char *
36cb0 63 50 61 74 68 20 3d 20 70 43 74 78 2d 3e 63 6f  cPath = pCtx->co
36cc0 6e 63 68 46 69 6c 65 50 61 74 68 3b 0a 20 20 73  nchFilePath;.  s
36cd0 69 7a 65 5f 74 20 72 65 61 64 4c 65 6e 20 3d 20  ize_t readLen = 
36ce0 30 3b 0a 20 20 73 69 7a 65 5f 74 20 70 61 74 68  0;.  size_t path
36cf0 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  Len = 0;.  char 
36d00 65 72 72 6d 73 67 5b 36 34 5d 20 3d 20 22 22 3b  errmsg[64] = "";
36d10 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a  .  int fd = -1;.
36d20 20 20 69 6e 74 20 72 63 20 3d 20 2d 31 3b 0a 20    int rc = -1;. 
36d30 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
36d40 52 28 6d 79 48 6f 73 74 49 44 29 3b 0a 0a 20 20  R(myHostID);..  
36d50 2f 2a 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  /* create a new 
36d60 70 61 74 68 20 62 79 20 72 65 70 6c 61 63 65 20  path by replace 
36d70 74 68 65 20 74 72 61 69 6c 69 6e 67 20 27 2d 63  the trailing '-c
36d80 6f 6e 63 68 27 20 77 69 74 68 20 27 2d 62 72 65  onch' with '-bre
36d90 61 6b 27 20 2a 2f 0a 20 20 70 61 74 68 4c 65 6e  ak' */.  pathLen
36da0 20 3d 20 73 74 72 6c 63 70 79 28 74 50 61 74 68   = strlcpy(tPath
36db0 2c 20 63 50 61 74 68 2c 20 4d 41 58 50 41 54 48  , cPath, MAXPATH
36dc0 4c 45 4e 29 3b 0a 20 20 69 66 28 20 70 61 74 68  LEN);.  if( path
36dd0 4c 65 6e 3e 4d 41 58 50 41 54 48 4c 45 4e 20 7c  Len>MAXPATHLEN |
36de0 7c 20 70 61 74 68 4c 65 6e 3c 36 20 7c 7c 20 0a  | pathLen<6 || .
36df0 20 20 20 20 20 28 73 74 72 6c 63 70 79 28 26 74       (strlcpy(&t
36e00 50 61 74 68 5b 70 61 74 68 4c 65 6e 2d 35 5d 2c  Path[pathLen-5],
36e10 20 22 62 72 65 61 6b 22 2c 20 36 29 20 21 3d 20   "break", 6) != 
36e20 35 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  5) ){.    sqlite
36e30 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
36e40 66 28 65 72 72 6d 73 67 29 2c 65 72 72 6d 73 67  f(errmsg),errmsg
36e50 2c 22 70 61 74 68 20 65 72 72 6f 72 20 28 6c 65  ,"path error (le
36e60 6e 20 25 64 29 22 2c 28 69 6e 74 29 70 61 74 68  n %d)",(int)path
36e70 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  Len);.    goto e
36e80 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20  nd_breaklock;.  
36e90 7d 0a 20 20 2f 2a 20 72 65 61 64 20 74 68 65 20  }.  /* read the 
36ea0 63 6f 6e 63 68 20 63 6f 6e 74 65 6e 74 20 2a 2f  conch content */
36eb0 0a 20 20 72 65 61 64 4c 65 6e 20 3d 20 6f 73 50  .  readLen = osP
36ec0 72 65 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e  read(conchFile->
36ed0 68 2c 20 62 75 66 2c 20 50 52 4f 58 59 5f 4d 41  h, buf, PROXY_MA
36ee0 58 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20  XCONCHLEN, 0);. 
36ef0 20 69 66 28 20 72 65 61 64 4c 65 6e 3c 50 52 4f   if( readLen<PRO
36f00 58 59 5f 50 41 54 48 49 4e 44 45 58 20 29 7b 0a  XY_PATHINDEX ){.
36f10 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
36f20 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d  intf(sizeof(errm
36f30 73 67 29 2c 65 72 72 6d 73 67 2c 22 72 65 61 64  sg),errmsg,"read
36f40 20 65 72 72 6f 72 20 28 6c 65 6e 20 25 64 29 22   error (len %d)"
36f50 2c 28 69 6e 74 29 72 65 61 64 4c 65 6e 29 3b 0a  ,(int)readLen);.
36f60 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65      goto end_bre
36f70 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a  aklock;.  }.  /*
36f80 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f   write it out to
36f90 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 62   the temporary b
36fa0 72 65 61 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 66  reak file */.  f
36fb0 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  d = robust_open(
36fc0 74 50 61 74 68 2c 20 28 4f 5f 52 44 57 52 7c 4f  tPath, (O_RDWR|O
36fd0 5f 43 52 45 41 54 7c 4f 5f 45 58 43 4c 29 2c 20  _CREAT|O_EXCL), 
36fe0 30 29 3b 0a 20 20 69 66 28 20 66 64 3c 30 20 29  0);.  if( fd<0 )
36ff0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
37000 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72  printf(sizeof(er
37010 72 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22  rmsg), errmsg, "
37020 63 72 65 61 74 65 20 66 61 69 6c 65 64 20 28 25  create failed (%
37030 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  d)", errno);.   
37040 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c   goto end_breakl
37050 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  ock;.  }.  if( o
37060 73 50 77 72 69 74 65 28 66 64 2c 20 62 75 66 2c  sPwrite(fd, buf,
37070 20 72 65 61 64 4c 65 6e 2c 20 30 29 20 21 3d 20   readLen, 0) != 
37080 28 73 73 69 7a 65 5f 74 29 72 65 61 64 4c 65 6e  (ssize_t)readLen
37090 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
370a0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
370b0 65 72 72 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c  errmsg), errmsg,
370c0 20 22 77 72 69 74 65 20 66 61 69 6c 65 64 20 28   "write failed (
370d0 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  %d)", errno);.  
370e0 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b    goto end_break
370f0 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  lock;.  }.  if( 
37100 72 65 6e 61 6d 65 28 74 50 61 74 68 2c 20 63 50  rename(tPath, cP
37110 61 74 68 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ath) ){.    sqli
37120 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
37130 65 6f 66 28 65 72 72 6d 73 67 29 2c 20 65 72 72  eof(errmsg), err
37140 6d 73 67 2c 20 22 72 65 6e 61 6d 65 20 66 61 69  msg, "rename fai
37150 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f  led (%d)", errno
37160 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  );.    goto end_
37170 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  breaklock;.  }. 
37180 20 72 63 20 3d 20 30 3b 0a 20 20 66 70 72 69 6e   rc = 0;.  fprin
37190 74 66 28 73 74 64 65 72 72 2c 20 22 62 72 6f 6b  tf(stderr, "brok
371a0 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20  e stale lock on 
371b0 25 73 5c 6e 22 2c 20 63 50 61 74 68 29 3b 0a 20  %s\n", cPath);. 
371c0 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46   robust_close(pF
371d0 69 6c 65 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  ile, conchFile->
371e0 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
371f0 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 20 3d 20 66  conchFile->h = f
37200 64 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  d;.  conchFile->
37210 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44  openFlags = O_RD
37220 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 0a 65  WR | O_CREAT;..e
37230 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3a 0a 20 20  nd_breaklock:.  
37240 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66  if( rc ){.    if
37250 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ( fd>=0 ){.     
37260 20 6f 73 55 6e 6c 69 6e 6b 28 74 50 61 74 68 29   osUnlink(tPath)
37270 3b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63  ;.      robust_c
37280 6c 6f 73 65 28 70 46 69 6c 65 2c 20 66 64 2c 20  lose(pFile, fd, 
37290 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d  __LINE__);.    }
372a0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
372b0 65 72 72 2c 20 22 66 61 69 6c 65 64 20 74 6f 20  err, "failed to 
372c0 62 72 65 61 6b 20 73 74 61 6c 65 20 6c 6f 63 6b  break stale lock
372d0 20 6f 6e 20 25 73 2c 20 25 73 5c 6e 22 2c 20 63   on %s, %s\n", c
372e0 50 61 74 68 2c 20 65 72 72 6d 73 67 29 3b 0a 20  Path, errmsg);. 
372f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
37300 7d 0a 0a 2f 2a 20 54 61 6b 65 20 74 68 65 20 72  }../* Take the r
37310 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 6f 6e  equested lock on
37320 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
37330 61 6e 64 20 62 72 65 61 6b 20 61 20 73 74 61 6c  and break a stal
37340 65 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 0a 2a  e lock if the .*
37350 2a 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68 65  * host id matche
37360 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
37370 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28   proxyConchLock(
37380 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
37390 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44   uuid_t myHostID
373a0 2c 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 29 7b  , int lockType){
373b0 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  .  proxyLockingC
373c0 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28  ontext *pCtx = (
373d0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
373e0 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  ext *)pFile->loc
373f0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20  kingContext; .  
37400 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46  unixFile *conchF
37410 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63  ile = pCtx->conc
37420 68 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20  hFile;.  int rc 
37430 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
37440 6e 74 20 6e 54 72 69 65 73 20 3d 20 30 3b 0a 20  nt nTries = 0;. 
37450 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63   struct timespec
37460 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 3b 0a 20   conchModTime;. 
37470 20 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f 6e 63   .  memset(&conc
37480 68 4d 6f 64 54 69 6d 65 2c 20 30 2c 20 73 69 7a  hModTime, 0, siz
37490 65 6f 66 28 63 6f 6e 63 68 4d 6f 64 54 69 6d 65  eof(conchModTime
374a0 29 29 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72  ));.  do {.    r
374b0 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70  c = conchFile->p
374c0 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73  Method->xLock((s
374d0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e  qlite3_file*)con
374e0 63 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65  chFile, lockType
374f0 29 3b 0a 20 20 20 20 6e 54 72 69 65 73 20 2b 2b  );.    nTries ++
37500 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
37510 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
37520 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6c 6f 63     /* If the loc
37530 6b 20 66 61 69 6c 65 64 20 28 62 75 73 79 29 3a  k failed (busy):
37540 0a 20 20 20 20 20 20 20 2a 20 31 73 74 20 74 72  .       * 1st tr
37550 79 3a 20 67 65 74 20 74 68 65 20 6d 6f 64 20 74  y: get the mod t
37560 69 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68  ime of the conch
37570 2c 20 77 61 69 74 20 30 2e 35 73 20 61 6e 64 20  , wait 0.5s and 
37580 74 72 79 20 61 67 61 69 6e 2e 20 0a 20 20 20 20  try again. .    
37590 20 20 20 2a 20 32 6e 64 20 74 72 79 3a 20 66 61     * 2nd try: fa
375a0 69 6c 20 69 66 20 74 68 65 20 6d 6f 64 20 74 69  il if the mod ti
375b0 6d 65 20 63 68 61 6e 67 65 64 20 6f 72 20 68 6f  me changed or ho
375c0 73 74 20 69 64 20 69 73 20 64 69 66 66 65 72 65  st id is differe
375d0 6e 74 2c 20 77 61 69 74 20 0a 20 20 20 20 20 20  nt, wait .      
375e0 20 2a 20 20 20 20 20 20 20 20 20 20 20 31 30 20   *           10 
375f0 73 65 63 20 61 6e 64 20 74 72 79 20 61 67 61 69  sec and try agai
37600 6e 0a 20 20 20 20 20 20 20 2a 20 33 72 64 20 74  n.       * 3rd t
37610 72 79 3a 20 62 72 65 61 6b 20 74 68 65 20 6c 6f  ry: break the lo
37620 63 6b 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 6f  ck unless the mo
37630 64 20 74 69 6d 65 20 68 61 73 20 63 68 61 6e 67  d time has chang
37640 65 64 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20  ed..       */.  
37650 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
37660 62 75 66 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  buf;.      if( o
37670 73 46 73 74 61 74 28 63 6f 6e 63 68 46 69 6c 65  sFstat(conchFile
37680 2d 3e 68 2c 20 26 62 75 66 29 20 29 7b 0a 20 20  ->h, &buf) ){.  
37690 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
376a0 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e  rrno(pFile, errn
376b0 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  o);.        retu
376c0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
376d0 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  LOCK;.      }.  
376e0 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 6e      .      if( n
376f0 54 72 69 65 73 3d 3d 31 20 29 7b 0a 20 20 20 20  Tries==1 ){.    
37700 20 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65      conchModTime
37710 20 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73   = buf.st_mtimes
37720 70 65 63 3b 0a 20 20 20 20 20 20 20 20 75 73 6c  pec;.        usl
37730 65 65 70 28 35 30 30 30 30 30 29 3b 20 2f 2a 20  eep(500000); /* 
37740 77 61 69 74 20 30 2e 35 20 73 65 63 20 61 6e 64  wait 0.5 sec and
37750 20 74 72 79 20 74 68 65 20 6c 6f 63 6b 20 61 67   try the lock ag
37760 61 69 6e 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f  ain*/.        co
37770 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20  ntinue;  .      
37780 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  }..      assert(
37790 20 6e 54 72 69 65 73 3e 31 20 29 3b 0a 20 20 20   nTries>1 );.   
377a0 20 20 20 69 66 28 20 63 6f 6e 63 68 4d 6f 64 54     if( conchModT
377b0 69 6d 65 2e 74 76 5f 73 65 63 20 21 3d 20 62 75  ime.tv_sec != bu
377c0 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74  f.st_mtimespec.t
377d0 76 5f 73 65 63 20 7c 7c 20 0a 20 20 20 20 20 20  v_sec || .      
377e0 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e     conchModTime.
377f0 74 76 5f 6e 73 65 63 20 21 3d 20 62 75 66 2e 73  tv_nsec != buf.s
37800 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f 6e  t_mtimespec.tv_n
37810 73 65 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72  sec ){.        r
37820 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
37830 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  Y;.      }.     
37840 20 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72 69   .      if( nTri
37850 65 73 3d 3d 32 20 29 7b 20 20 0a 20 20 20 20 20  es==2 ){  .     
37860 20 20 20 63 68 61 72 20 74 42 75 66 5b 50 52 4f     char tBuf[PRO
37870 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b  XY_MAXCONCHLEN];
37880 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  .        int len
37890 20 3d 20 6f 73 50 72 65 61 64 28 63 6f 6e 63 68   = osPread(conch
378a0 46 69 6c 65 2d 3e 68 2c 20 74 42 75 66 2c 20 50  File->h, tBuf, P
378b0 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  ROXY_MAXCONCHLEN
378c0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
378d0 28 20 6c 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20  ( len<0 ){.     
378e0 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
378f0 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f  rno(pFile, errno
37900 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
37910 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
37920 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d  _LOCK;.        }
37930 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e  .        if( len
37940 3e 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58  >PROXY_PATHINDEX
37950 20 26 26 20 74 42 75 66 5b 30 5d 3d 3d 28 63 68   && tBuf[0]==(ch
37960 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45  ar)PROXY_CONCHVE
37970 52 53 49 4f 4e 29 7b 0a 20 20 20 20 20 20 20 20  RSION){.        
37980 20 20 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b    /* don't break
37990 20 74 68 65 20 6c 6f 63 6b 20 69 66 20 74 68 65   the lock if the
379a0 20 68 6f 73 74 20 69 64 20 64 6f 65 73 6e 27 74   host id doesn't
379b0 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20   match */.      
379c0 20 20 20 20 69 66 28 20 30 21 3d 6d 65 6d 63 6d      if( 0!=memcm
379d0 70 28 26 74 42 75 66 5b 50 52 4f 58 59 5f 48 45  p(&tBuf[PROXY_HE
379e0 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74  ADERLEN], myHost
379f0 49 44 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44  ID, PROXY_HOSTID
37a00 4c 45 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20  LEN) ){.        
37a10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
37a20 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
37a30 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
37a40 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
37a50 64 6f 6e 27 74 20 62 72 65 61 6b 20 74 68 65 20  don't break the 
37a60 6c 6f 63 6b 20 6f 6e 20 73 68 6f 72 74 20 72 65  lock on short re
37a70 61 64 20 6f 72 20 61 20 76 65 72 73 69 6f 6e 20  ad or a version 
37a80 6d 69 73 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20  mismatch */.    
37a90 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
37aa0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
37ab0 20 20 7d 0a 20 20 20 20 20 20 20 20 75 73 6c 65    }.        usle
37ac0 65 70 28 31 30 30 30 30 30 30 30 29 3b 20 2f 2a  ep(10000000); /*
37ad0 20 77 61 69 74 20 31 30 20 73 65 63 20 61 6e 64   wait 10 sec and
37ae0 20 74 72 79 20 74 68 65 20 6c 6f 63 6b 20 61 67   try the lock ag
37af0 61 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  ain */.        c
37b00 6f 6e 74 69 6e 75 65 3b 20 0a 20 20 20 20 20 20  ontinue; .      
37b10 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 61  }.      .      a
37b20 73 73 65 72 74 28 20 6e 54 72 69 65 73 3d 3d 33  ssert( nTries==3
37b30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d   );.      if( 0=
37b40 3d 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68  =proxyBreakConch
37b50 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f  Lock(pFile, myHo
37b60 73 74 49 44 29 20 29 7b 0a 20 20 20 20 20 20 20  stID) ){.       
37b70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
37b80 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 63  .        if( loc
37b90 6b 54 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45  kType==EXCLUSIVE
37ba0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  _LOCK ){.       
37bb0 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c     rc = conchFil
37bc0 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63  e->pMethod->xLoc
37bd0 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
37be0 29 63 6f 6e 63 68 46 69 6c 65 2c 20 53 48 41 52  )conchFile, SHAR
37bf0 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
37c00 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
37c10 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !rc ){.         
37c20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d   rc = conchFile-
37c30 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28  >pMethod->xLock(
37c40 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63  (sqlite3_file*)c
37c50 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79  onchFile, lockTy
37c60 70 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  pe);.        }. 
37c70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
37c80 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
37c90 54 45 5f 42 55 53 59 20 26 26 20 6e 54 72 69 65  TE_BUSY && nTrie
37ca0 73 3c 33 20 29 3b 0a 20 20 0a 20 20 72 65 74 75  s<3 );.  .  retu
37cb0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b  rn rc;.}../* Tak
37cc0 65 73 20 74 68 65 20 63 6f 6e 63 68 20 62 79 20  es the conch by 
37cd0 74 61 6b 69 6e 67 20 61 20 73 68 61 72 65 64 20  taking a shared 
37ce0 6c 6f 63 6b 20 61 6e 64 20 72 65 61 64 20 74 68  lock and read th
37cf0 65 20 63 6f 6e 74 65 6e 74 73 20 63 6f 6e 63 68  e contents conch
37d00 2c 20 69 66 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74  , if .** lockPat
37d10 68 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74  h is non-NULL, t
37d20 68 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20 6c  he host ID and l
37d30 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20 6d 75  ock file path mu
37d40 73 74 20 6d 61 74 63 68 2e 20 20 41 20 4e 55 4c  st match.  A NUL
37d50 4c 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 6d  L .** lockPath m
37d60 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6c 6f  eans that the lo
37d70 63 6b 50 61 74 68 20 69 6e 20 74 68 65 20 63 6f  ckPath in the co
37d80 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  nch file will be
37d90 20 75 73 65 64 20 69 66 20 74 68 65 20 0a 2a 2a   used if the .**
37da0 20 68 6f 73 74 20 49 44 73 20 6d 61 74 63 68 2c   host IDs match,
37db0 20 6f 72 20 61 20 6e 65 77 20 6c 6f 63 6b 20 70   or a new lock p
37dc0 61 74 68 20 77 69 6c 6c 20 62 65 20 67 65 6e 65  ath will be gene
37dd0 72 61 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61  rated automatica
37de0 6c 6c 79 20 0a 2a 2a 20 61 6e 64 20 77 72 69 74  lly .** and writ
37df0 74 65 6e 20 74 6f 20 74 68 65 20 63 6f 6e 63 68  ten to the conch
37e00 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
37e10 20 69 6e 74 20 70 72 6f 78 79 54 61 6b 65 43 6f   int proxyTakeCo
37e20 6e 63 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  nch(unixFile *pF
37e30 69 6c 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63  ile){.  proxyLoc
37e40 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
37e50 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e  x = (proxyLockin
37e60 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65  gContext *)pFile
37e70 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
37e80 3b 20 0a 20 20 0a 20 20 69 66 28 20 70 43 74 78  ; .  .  if( pCtx
37e90 2d 3e 63 6f 6e 63 68 48 65 6c 64 21 3d 30 20 29  ->conchHeld!=0 )
37ea0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
37eb0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
37ec0 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 63  .    unixFile *c
37ed0 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d  onchFile = pCtx-
37ee0 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 20 20  >conchFile;.    
37ef0 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 3b  uuid_t myHostID;
37f00 0a 20 20 20 20 69 6e 74 20 70 45 72 72 6f 72 20  .    int pError 
37f10 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 72 65  = 0;.    char re
37f20 61 64 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43  adBuf[PROXY_MAXC
37f30 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68  ONCHLEN];.    ch
37f40 61 72 20 6c 6f 63 6b 50 61 74 68 5b 4d 41 58 50  ar lockPath[MAXP
37f50 41 54 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61  ATHLEN];.    cha
37f60 72 20 2a 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20  r *tempLockPath 
37f70 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20  = NULL;.    int 
37f80 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
37f90 20 20 20 20 69 6e 74 20 63 72 65 61 74 65 43 6f      int createCo
37fa0 6e 63 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  nch = 0;.    int
37fb0 20 68 6f 73 74 49 64 4d 61 74 63 68 20 3d 20 30   hostIdMatch = 0
37fc0 3b 0a 20 20 20 20 69 6e 74 20 72 65 61 64 4c 65  ;.    int readLe
37fd0 6e 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74  n = 0;.    int t
37fe0 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20  ryOldLockPath = 
37ff0 30 3b 0a 20 20 20 20 69 6e 74 20 66 6f 72 63 65  0;.    int force
38000 4e 65 77 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b  NewLockPath = 0;
38010 0a 20 20 20 20 0a 20 20 20 20 4f 53 54 52 41 43  .    .    OSTRAC
38020 45 28 28 22 54 41 4b 45 43 4f 4e 43 48 20 20 25  E(("TAKECONCH  %
38030 64 20 66 6f 72 20 25 73 20 70 69 64 3d 25 64 5c  d for %s pid=%d\
38040 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  n", conchFile->h
38050 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,.             (
38060 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50  pCtx->lockProxyP
38070 61 74 68 20 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b  ath ? pCtx->lock
38080 50 72 6f 78 79 50 61 74 68 20 3a 20 22 3a 61 75  ProxyPath : ":au
38090 74 6f 3a 22 29 2c 0a 20 20 20 20 20 20 20 20 20  to:"),.         
380a0 20 20 20 20 6f 73 47 65 74 70 69 64 28 30 29 29      osGetpid(0))
380b0 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 72 6f  );..    rc = pro
380c0 78 79 47 65 74 48 6f 73 74 49 44 28 6d 79 48 6f  xyGetHostID(myHo
380d0 73 74 49 44 2c 20 26 70 45 72 72 6f 72 29 3b 0a  stID, &pError);.
380e0 20 20 20 20 69 66 28 20 28 72 63 26 30 78 66 66      if( (rc&0xff
380f0 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  )==SQLITE_IOERR 
38100 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  ){.      storeLa
38110 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 70  stErrno(pFile, p
38120 45 72 72 6f 72 29 3b 0a 20 20 20 20 20 20 67 6f  Error);.      go
38130 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68  to end_takeconch
38140 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
38150 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28   proxyConchLock(
38160 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44 2c  pFile, myHostID,
38170 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
38180 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
38190 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
381a0 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68  to end_takeconch
381b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 72  ;.    }.    /* r
381c0 65 61 64 20 74 68 65 20 65 78 69 73 74 69 6e 67  ead the existing
381d0 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20   conch file */. 
381e0 20 20 20 72 65 61 64 4c 65 6e 20 3d 20 73 65 65     readLen = see
381f0 6b 41 6e 64 52 65 61 64 28 28 75 6e 69 78 46 69  kAndRead((unixFi
38200 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 30  le*)conchFile, 0
38210 2c 20 72 65 61 64 42 75 66 2c 20 50 52 4f 58 59  , readBuf, PROXY
38220 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 29 3b 0a 20  _MAXCONCHLEN);. 
38230 20 20 20 69 66 28 20 72 65 61 64 4c 65 6e 3c 30     if( readLen<0
38240 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 2f 4f   ){.      /* I/O
38250 20 65 72 72 6f 72 3a 20 6c 61 73 74 45 72 72 6e   error: lastErrn
38260 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64  o set by seekAnd
38270 52 65 61 64 20 2a 2f 0a 20 20 20 20 20 20 73 74  Read */.      st
38280 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
38290 6c 65 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 6c  le, conchFile->l
382a0 61 73 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  astErrno);.     
382b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
382c0 52 52 5f 52 45 41 44 3b 0a 20 20 20 20 20 20 67  RR_READ;.      g
382d0 6f 74 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63  oto end_takeconc
382e0 68 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  h;.    }else if(
382f0 20 72 65 61 64 4c 65 6e 3c 3d 28 50 52 4f 58 59   readLen<=(PROXY
38300 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59  _HEADERLEN+PROXY
38310 5f 48 4f 53 54 49 44 4c 45 4e 29 20 7c 7c 20 0a  _HOSTIDLEN) || .
38320 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61               rea
38330 64 42 75 66 5b 30 5d 21 3d 28 63 68 61 72 29 50  dBuf[0]!=(char)P
38340 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f  ROXY_CONCHVERSIO
38350 4e 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 20  N ){.      /* a 
38360 73 68 6f 72 74 20 72 65 61 64 20 6f 72 20 76 65  short read or ve
38370 72 73 69 6f 6e 20 66 6f 72 6d 61 74 20 6d 69 73  rsion format mis
38380 6d 61 74 63 68 20 6d 65 61 6e 73 20 77 65 20 6e  match means we n
38390 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  eed to create a 
383a0 6e 65 77 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  new .      ** co
383b0 6e 63 68 20 66 69 6c 65 2e 20 0a 20 20 20 20 20  nch file. .     
383c0 20 2a 2f 0a 20 20 20 20 20 20 63 72 65 61 74 65   */.      create
383d0 43 6f 6e 63 68 20 3d 20 31 3b 0a 20 20 20 20 7d  Conch = 1;.    }
383e0 0a 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20 68  .    /* if the h
383f0 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73 20 61  ost id matches a
38400 6e 64 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68  nd the lock path
38410 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
38420 69 6e 20 74 68 65 20 63 6f 6e 63 68 0a 20 20 20  in the conch.   
38430 20 2a 2a 20 77 65 27 6c 6c 20 74 72 79 20 74 6f   ** we'll try to
38440 20 75 73 65 20 74 68 65 20 70 61 74 68 20 74 68   use the path th
38450 65 72 65 2c 20 69 66 20 77 65 20 63 61 6e 27 74  ere, if we can't
38460 20 6f 70 65 6e 20 74 68 61 74 20 70 61 74 68 2c   open that path,
38470 20 77 65 27 6c 6c 20 0a 20 20 20 20 2a 2a 20 72   we'll .    ** r
38480 65 74 72 79 20 77 69 74 68 20 61 20 6e 65 77 20  etry with a new 
38490 61 75 74 6f 2d 67 65 6e 65 72 61 74 65 64 20 70  auto-generated p
384a0 61 74 68 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ath .    */.    
384b0 64 6f 20 7b 20 2f 2a 20 69 6e 20 63 61 73 65 20  do { /* in case 
384c0 77 65 20 6e 65 65 64 20 74 6f 20 74 72 79 20 61  we need to try a
384d0 67 61 69 6e 20 66 6f 72 20 61 6e 20 3a 61 75 74  gain for an :aut
384e0 6f 3a 20 6e 61 6d 65 64 20 6c 6f 63 6b 20 66 69  o: named lock fi
384f0 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28  le */..      if(
38500 20 21 63 72 65 61 74 65 43 6f 6e 63 68 20 26 26   !createConch &&
38510 20 21 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61   !forceNewLockPa
38520 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 68 6f  th ){.        ho
38530 73 74 49 64 4d 61 74 63 68 20 3d 20 21 6d 65 6d  stIdMatch = !mem
38540 63 6d 70 28 26 72 65 61 64 42 75 66 5b 50 52 4f  cmp(&readBuf[PRO
38550 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d  XY_HEADERLEN], m
38560 79 48 6f 73 74 49 44 2c 20 0a 20 20 20 20 20 20  yHostID, .      
38570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38580 20 20 20 20 20 20 20 20 20 20 20 20 50 52 4f 58              PROX
38590 59 5f 48 4f 53 5