/ Hex Artifact Content
Login

Artifact 8f8f11b64aa5b20f75f0a9e4ed494e51a641e62f:


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 28 70  !=0 );.  if( ((p
bd50: 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
bd60: 26 20 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 29  & UNIXFILE_EXCL)
bd70: 21 3d 30 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 62  !=0 || pInode->b
bd80: 50 72 6f 63 65 73 73 4c 6f 63 6b 29 0a 20 20 20  ProcessLock).   
bd90: 26 26 20 28 28 70 46 69 6c 65 2d 3e 63 74 72 6c  && ((pFile->ctrl
bda0: 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
bdb0: 5f 52 44 4f 4e 4c 59 29 3d 3d 30 29 0a 20 20 29  _RDONLY)==0).  )
bdc0: 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  {.    if( pInode
bdd0: 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
bde0: 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  0 ){.      struc
bdf0: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20  t flock lock;.  
be00: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
be10: 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  de->nLock==0 );.
be20: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
be30: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
be40: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
be50: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
be60: 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  T;.      lock.l_
be70: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
be80: 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  E;.      lock.l_
be90: 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a  type = F_WRLCK;.
bea0: 20 20 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e        rc = osFcn
beb0: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53  tl(pFile->h, F_S
bec0: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20  ETLK, &lock);.  
bed0: 20 20 20 20 69 66 28 20 72 63 3c 30 20 29 20 72      if( rc<0 ) r
bee0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
bef0: 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
bf00: 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20  Lock = 1;.      
bf10: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  pInode->nLock++;
bf20: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
bf30: 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a    rc = 0;.    }.
bf40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
bf50: 3d 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d  = osFcntl(pFile-
bf60: 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 70 4c 6f  >h, F_SETLK, pLo
bf70: 63 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ck);.  }.  retur
bf80: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
bf90: 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
bfa0: 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
bfb0: 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
bfc0: 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e  r eFileLock - on
bfd0: 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
bfe0: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
bff0: 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
c000: 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
c010: 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
c020: 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
c030: 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
c040: 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
c050: 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
c060: 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
c070: 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
c080: 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
c090: 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
c0a0: 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
c0b0: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
c0c0: 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
c0d0: 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
c0e0: 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
c0f0: 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
c100: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
c110: 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
c120: 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
c130: 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
c140: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
c150: 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
c160: 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
c170: 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
c180: 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
c190: 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
c1a0: 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
c1b0: 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
c1c0: 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
c1d0: 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
c1e0: 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
c1f0: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
c200: 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
c210: 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
c220: 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
c230: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
c240: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
c250: 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
c260: 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74  e a lock.  Use t
c270: 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  he sqlite3OsUnlo
c280: 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
c290: 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69  to lower a locki
c2a0: 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  ng level..*/.sta
c2b0: 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b  tic int unixLock
c2c0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
c2d0: 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
c2e0: 29 7b 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ){.  /* The foll
c2f0: 6f 77 69 6e 67 20 64 65 73 63 72 69 62 65 73 20  owing describes 
c300: 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
c310: 6f 6e 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75  on of the variou
c320: 73 20 6c 6f 63 6b 73 20 61 6e 64 0a 20 20 2a 2a  s locks and.  **
c330: 20 6c 6f 63 6b 20 74 72 61 6e 73 69 74 69 6f 6e   lock transition
c340: 73 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68  s in terms of th
c350: 65 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79  e POSIX advisory
c360: 20 73 68 61 72 65 64 20 61 6e 64 20 65 78 63 6c   shared and excl
c370: 75 73 69 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20  usive.  ** lock 
c380: 70 72 69 6d 69 74 69 76 65 73 20 28 63 61 6c 6c  primitives (call
c390: 65 64 20 72 65 61 64 2d 6c 6f 63 6b 73 20 61 6e  ed read-locks an
c3a0: 64 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 62 65  d write-locks be
c3b0: 6c 6f 77 2c 20 74 6f 20 61 76 6f 69 64 0a 20 20  low, to avoid.  
c3c0: 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74  ** confusion wit
c3d0: 68 20 53 51 4c 69 74 65 20 6c 6f 63 6b 20 6e 61  h SQLite lock na
c3e0: 6d 65 73 29 2e 20 54 68 65 20 61 6c 67 6f 72 69  mes). The algori
c3f0: 74 68 6d 73 20 61 72 65 20 63 6f 6d 70 6c 69 63  thms are complic
c400: 61 74 65 64 0a 20 20 2a 2a 20 73 6c 69 67 68 74  ated.  ** slight
c410: 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  ly in order to b
c420: 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  e compatible wit
c430: 68 20 77 69 6e 64 6f 77 73 20 73 79 73 74 65 6d  h windows system
c440: 73 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79  s simultaneously
c450: 0a 20 20 2a 2a 20 61 63 63 65 73 73 69 6e 67 20  .  ** accessing 
c460: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
c470: 65 20 66 69 6c 65 2c 20 69 6e 20 63 61 73 65 20  e file, in case 
c480: 74 68 61 74 20 69 73 20 65 76 65 72 20 72 65 71  that is ever req
c490: 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  uired..  **.  **
c4a0: 20 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64   Symbols defined
c4b0: 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69   in os.h indenti
c4c0: 66 79 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20  fy the 'pending 
c4d0: 62 79 74 65 27 20 61 6e 64 20 74 68 65 20 27 72  byte' and the 'r
c4e0: 65 73 65 72 76 65 64 0a 20 20 2a 2a 20 62 79 74  eserved.  ** byt
c4f0: 65 27 2c 20 65 61 63 68 20 73 69 6e 67 6c 65 20  e', each single 
c500: 62 79 74 65 73 20 61 74 20 77 65 6c 6c 20 6b 6e  bytes at well kn
c510: 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e 64  own offsets, and
c520: 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74   the 'shared byt
c530: 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c 20 61  e.  ** range', a
c540: 20 72 61 6e 67 65 20 6f 66 20 35 31 30 20 62 79   range of 510 by
c550: 74 65 73 20 61 74 20 61 20 77 65 6c 6c 20 6b 6e  tes at a well kn
c560: 6f 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20 2a 2a  own offset..  **
c570: 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69 6e 20  .  ** To obtain 
c580: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 61  a SHARED lock, a
c590: 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62   read-lock is ob
c5a0: 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 27 70  tained on the 'p
c5b0: 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79 74 65  ending.  ** byte
c5c0: 27 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 73  '.  If this is s
c5d0: 75 63 63 65 73 73 66 75 6c 2c 20 61 20 72 61 6e  uccessful, a ran
c5e0: 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 74 68  dom byte from th
c5f0: 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20  e 'shared byte. 
c600: 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 72 65   ** range' is re
c610: 61 64 2d 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68  ad-locked and th
c620: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 27 70  e lock on the 'p
c630: 65 6e 64 69 6e 67 20 62 79 74 65 27 20 72 65 6c  ending byte' rel
c640: 65 61 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  eased..  **.  **
c650: 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f   A process may o
c660: 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 52 45 53  nly obtain a RES
c670: 45 52 56 45 44 20 6c 6f 63 6b 20 61 66 74 65 72  ERVED lock after
c680: 20 69 74 20 68 61 73 20 61 20 53 48 41 52 45 44   it has a SHARED
c690: 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20 52 45   lock..  ** A RE
c6a0: 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 69  SERVED lock is i
c6b0: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 67 72  mplemented by gr
c6c0: 61 62 62 69 6e 67 20 61 20 77 72 69 74 65 2d 6c  abbing a write-l
c6d0: 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ock on the.  ** 
c6e0: 27 72 65 73 65 72 76 65 64 20 62 79 74 65 27 2e  'reserved byte'.
c6f0: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72   .  **.  ** A pr
c700: 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f  ocess may only o
c710: 62 74 61 69 6e 20 61 20 50 45 4e 44 49 4e 47 20  btain a PENDING 
c720: 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68 61  lock after it ha
c730: 73 20 6f 62 74 61 69 6e 65 64 20 61 0a 20 20 2a  s obtained a.  *
c740: 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 41  * SHARED lock. A
c750: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
c760: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
c770: 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74  obtaining a writ
c780: 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74  e-lock.  ** on t
c790: 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65  he 'pending byte
c7a0: 27 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20  '. This ensures 
c7b0: 74 68 61 74 20 6e 6f 20 6e 65 77 20 53 48 41 52  that no new SHAR
c7c0: 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62 65 0a  ED locks can be.
c7d0: 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c 20 62    ** obtained, b
c7e0: 75 74 20 65 78 69 73 74 69 6e 67 20 53 48 41 52  ut existing SHAR
c7f0: 45 44 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 6c  ED locks are all
c800: 6f 77 65 64 20 74 6f 20 70 65 72 73 69 73 74 2e  owed to persist.
c810: 20 41 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20   A process.  ** 
c820: 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f  does not have to
c830: 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56   obtain a RESERV
c840: 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 77  ED lock on the w
c850: 61 79 20 74 6f 20 61 20 50 45 4e 44 49 4e 47 20  ay to a PENDING 
c860: 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69 73 20  lock..  ** This 
c870: 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64  property is used
c880: 20 62 79 20 74 68 65 20 61 6c 67 6f 72 69 74 68   by the algorith
c890: 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61  m for rolling ba
c8a0: 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ck a journal fil
c8b0: 65 0a 20 20 2a 2a 20 61 66 74 65 72 20 61 20 63  e.  ** after a c
c8c0: 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rash..  **.  ** 
c8d0: 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  An EXCLUSIVE loc
c8e0: 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61 66 74 65  k, obtained afte
c8f0: 72 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  r a PENDING lock
c900: 20 69 73 20 68 65 6c 64 2c 20 69 73 0a 20 20 2a   is held, is.  *
c910: 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  * implemented by
c920: 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69   obtaining a wri
c930: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 65  te-lock on the e
c940: 6e 74 69 72 65 20 27 73 68 61 72 65 64 20 62 79  ntire 'shared by
c950: 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2e 20  te.  ** range'. 
c960: 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65 72 20  Since all other 
c970: 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 20 61 20  locks require a 
c980: 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65  read-lock on one
c990: 20 6f 66 20 74 68 65 20 62 79 74 65 73 0a 20 20   of the bytes.  
c9a0: 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 72  ** within this r
c9b0: 61 6e 67 65 2c 20 74 68 69 73 20 65 6e 73 75 72  ange, this ensur
c9c0: 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  es that no other
c9d0: 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 20   locks are held 
c9e0: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  on the.  ** data
c9f0: 62 61 73 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  base. .  **.  **
ca00: 20 54 68 65 20 72 65 61 73 6f 6e 20 61 20 73 69   The reason a si
ca10: 6e 67 6c 65 20 62 79 74 65 20 63 61 6e 6e 6f 74  ngle byte cannot
ca20: 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64   be used instead
ca30: 20 6f 66 20 74 68 65 20 27 73 68 61 72 65 64 20   of the 'shared 
ca40: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
ca50: 20 69 73 20 74 68 61 74 20 73 6f 6d 65 20 76 65   is that some ve
ca60: 72 73 69 6f 6e 73 20 6f 66 20 77 69 6e 64 6f 77  rsions of window
ca70: 73 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74  s do not support
ca80: 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 20 42 79 0a   read-locks. By.
ca90: 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61 20 72    ** locking a r
caa0: 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20  andom byte from 
cab0: 61 20 72 61 6e 67 65 2c 20 63 6f 6e 63 75 72 72  a range, concurr
cac0: 65 6e 74 20 53 48 41 52 45 44 20 6c 6f 63 6b 73  ent SHARED locks
cad0: 20 6d 61 79 20 65 78 69 73 74 0a 20 20 2a 2a 20   may exist.  ** 
cae0: 65 76 65 6e 20 69 66 20 74 68 65 20 6c 6f 63 6b  even if the lock
caf0: 69 6e 67 20 70 72 69 6d 69 74 69 76 65 20 75 73  ing primitive us
cb00: 65 64 20 69 73 20 61 6c 77 61 79 73 20 61 20 77  ed is always a w
cb10: 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a  rite-lock..  */.
cb20: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
cb30: 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
cb40: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
cb50: 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49  ile*)id;.  unixI
cb60: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
cb70: 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  ;.  struct flock
cb80: 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 74 45 72   lock;.  int tEr
cb90: 72 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  rno = 0;..  asse
cba0: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
cbb0: 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
cbc0: 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73   %d %s was %s(%s
cbd0: 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69  ,%d) pid=%d (uni
cbe0: 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  x)\n", pFile->h,
cbf0: 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63  .      azFileLoc
cc00: 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a  k(eFileLock), az
cc10: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e  FileLock(pFile->
cc20: 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20  eFileLock),.    
cc30: 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69    azFileLock(pFi
cc40: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  le->pInode->eFil
cc50: 65 4c 6f 63 6b 29 2c 20 70 46 69 6c 65 2d 3e 70  eLock), pFile->p
cc60: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a  Inode->nShared,.
cc70: 20 20 20 20 20 20 6f 73 47 65 74 70 69 64 28 30        osGetpid(0
cc80: 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  )));..  /* If th
cc90: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
cca0: 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79   lock of this ty
ccb0: 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72  pe or more restr
ccc0: 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20  ictive on the.  
ccd0: 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20  ** unixFile, do 
cce0: 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75  nothing. Don't u
ccf0: 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a  se the end_lock:
cd00: 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20   exit path, as. 
cd10: 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74   ** unixEnterMut
cd20: 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e  ex() hasn't been
cd30: 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a   called yet..  *
cd40: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
cd50: 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c  FileLock>=eFileL
cd60: 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  ock ){.    OSTRA
cd70: 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
cd80: 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68  %s ok (already h
cd90: 65 6c 64 29 20 28 75 6e 69 78 29 5c 6e 22 2c 20  eld) (unix)\n", 
cda0: 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
cdb0: 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
cdc0: 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20  (eFileLock)));. 
cdd0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
cde0: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  _OK;.  }..  /* M
cdf0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
ce00: 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  king sequence is
ce10: 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 20 20   correct..  **  
ce20: 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76  (1) We never mov
ce30: 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20  e from unlocked 
ce40: 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68  to anything high
ce50: 65 72 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c  er than shared l
ce60: 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53  ock..  **  (2) S
ce70: 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c  QLite never expl
ce80: 69 63 69 74 6c 79 20 72 65 71 75 65 73 74 73 20  icitly requests 
ce90: 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20  a pendig lock.. 
cea0: 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72 65   **  (3) A share
ceb0: 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73  d lock is always
cec0: 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73   held when a res
ced0: 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71  erve lock is req
cee0: 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61  uested..  */.  a
cef0: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46  ssert( pFile->eF
cf00: 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b  ileLock!=NO_LOCK
cf10: 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53   || eFileLock==S
cf20: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
cf30: 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
cf40: 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  k!=PENDING_LOCK 
cf50: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
cf60: 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44  leLock!=RESERVED
cf70: 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e  _LOCK || pFile->
cf80: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
cf90: 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  D_LOCK );..  /* 
cfa0: 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65  This mutex is ne
cfb0: 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46 69  eded because pFi
cfc0: 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68  le->pInode is sh
cfd0: 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65  ared across thre
cfe0: 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45  ads.  */.  unixE
cff0: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
d000: 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
d010: 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  Inode;..  /* If 
d020: 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e  some thread usin
d030: 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20 61  g this PID has a
d040: 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66   lock via a diff
d050: 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a  erent unixFile*.
d060: 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74    ** handle that
d070: 20 70 72 65 63 6c 75 64 65 73 20 74 68 65 20 72   precludes the r
d080: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72  equested lock, r
d090: 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f  eturn BUSY..  */
d0a0: 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65  .  if( (pFile->e
d0b0: 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65  FileLock!=pInode
d0c0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a  ->eFileLock && .
d0d0: 20 20 20 20 20 20 20 20 20 20 28 70 49 6e 6f 64            (pInod
d0e0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45  e->eFileLock>=PE
d0f0: 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46  NDING_LOCK || eF
d100: 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
d110: 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  OCK)).  ){.    r
d120: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
d130: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f  .    goto end_lo
d140: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ck;.  }..  /* If
d150: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   a SHARED lock i
d160: 73 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64  s requested, and
d170: 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
d180: 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c 72 65  ng this PID alre
d190: 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53  ady.  ** has a S
d1a0: 48 41 52 45 44 20 6f 72 20 52 45 53 45 52 56 45  HARED or RESERVE
d1b0: 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63  D lock, then inc
d1c0: 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65  rement reference
d1d0: 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a   counts and.  **
d1e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d1f0: 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  K..  */.  if( eF
d200: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
d210: 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 20 28  LOCK && .      (
d220: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
d230: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  k==SHARED_LOCK |
d240: 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  | pInode->eFileL
d250: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
d260: 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  CK) ){.    asser
d270: 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  t( eFileLock==SH
d280: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
d290: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
d2a0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  eFileLock==0 );.
d2b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
d2c0: 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b  de->nShared>0 );
d2d0: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
d2e0: 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
d2f0: 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  OCK;.    pInode-
d300: 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20  >nShared++;.    
d310: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  pInode->nLock++;
d320: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f  .    goto end_lo
d330: 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41  ck;.  }...  /* A
d340: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
d350: 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65 20 61   needed before a
d360: 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45  cquiring a SHARE
d370: 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72  D lock and befor
d380: 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67  e.  ** acquiring
d390: 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
d3a0: 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41  ck.  For the SHA
d3b0: 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45  RED lock, the PE
d3c0: 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20  NDING will.  ** 
d3d0: 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a  be released..  *
d3e0: 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d  /.  lock.l_len =
d3f0: 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68   1L;.  lock.l_wh
d400: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
d410: 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
d420: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20  ==SHARED_LOCK . 
d430: 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f       || (eFileLo
d440: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
d450: 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69  CK && pFile->eFi
d460: 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c  leLock<PENDING_L
d470: 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f  OCK).  ){.    lo
d480: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28 65 46 69  ck.l_type = (eFi
d490: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
d4a0: 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52  OCK?F_RDLCK:F_WR
d4b0: 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  LCK);.    lock.l
d4c0: 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47  _start = PENDING
d4d0: 5f 42 59 54 45 3b 0a 20 20 20 20 69 66 28 20 75  _BYTE;.    if( u
d4e0: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
d4f0: 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20  e, &lock) ){.   
d500: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
d510: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
d520: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
d530: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
d540: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
d550: 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
d560: 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  !=SQLITE_BUSY ){
d570: 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61  .        storeLa
d580: 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
d590: 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  Errno);.      }.
d5a0: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c        goto end_l
d5b0: 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ock;.    }.  }..
d5c0: 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c  .  /* If control
d5d0: 20 67 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f   gets to this po
d5e0: 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c  int, then actual
d5f0: 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  ly go ahead and 
d600: 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74  make.  ** operat
d610: 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ing system calls
d620: 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69   for the specifi
d630: 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  ed lock..  */.  
d640: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
d650: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
d660: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
d670: 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a  ->nShared==0 );.
d680: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
d690: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30  de->eFileLock==0
d6a0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
d6b0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
d6c0: 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74  ..    /* Now get
d6d0: 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a   the read-lock *
d6e0: 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  /.    lock.l_sta
d6f0: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
d700: 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  T;.    lock.l_le
d710: 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b  n = SHARED_SIZE;
d720: 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c  .    if( unixFil
d730: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
d740: 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72  ck) ){.      tEr
d750: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
d760: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
d770: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
d780: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
d790: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20  _IOERR_LOCK);.  
d7a0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70    }..    /* Drop
d7b0: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50   the temporary P
d7c0: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20  ENDING lock */. 
d7d0: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
d7e0: 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a  = PENDING_BYTE;.
d7f0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
d800: 20 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f   1L;.    lock.l_
d810: 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
d820: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
d830: 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
d840: 6b 29 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  k) && rc==SQLITE
d850: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
d860: 54 68 69 73 20 63 6f 75 6c 64 20 68 61 70 70 65  This could happe
d870: 6e 20 77 69 74 68 20 61 20 6e 65 74 77 6f 72 6b  n with a network
d880: 20 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20   mount */.      
d890: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
d8a0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
d8b0: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20  E_IOERR_UNLOCK; 
d8c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
d8d0: 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  rc ){.      if( 
d8e0: 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc!=SQLITE_BUSY 
d8f0: 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65  ){.        store
d900: 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
d910: 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20   tErrno);.      
d920: 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  }.      goto end
d930: 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  _lock;.    }else
d940: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65  {.      pFile->e
d950: 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
d960: 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49  D_LOCK;.      pI
d970: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20  node->nLock++;. 
d980: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68       pInode->nSh
d990: 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  ared = 1;.    }.
d9a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c    }else if( eFil
d9b0: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
d9c0: 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d  _LOCK && pInode-
d9d0: 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20  >nShared>1 ){.  
d9e0: 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69    /* We are tryi
d9f0: 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73  ng for an exclus
da00: 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f  ive lock but ano
da10: 74 68 65 72 20 74 68 72 65 61 64 20 69 6e 20 74  ther thread in t
da20: 68 69 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20  his.    ** same 
da30: 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c  process is still
da40: 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65   holding a share
da50: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72  d lock. */.    r
da60: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
da70: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
da80: 20 54 68 65 20 72 65 71 75 65 73 74 20 77 61 73   The request was
da90: 20 66 6f 72 20 61 20 52 45 53 45 52 56 45 44 20   for a RESERVED 
daa0: 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
dab0: 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a  k.  It is.    **
dac0: 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
dad0: 65 72 65 20 69 73 20 61 20 53 48 41 52 45 44 20  ere is a SHARED 
dae0: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
daf0: 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  on the file.    
db00: 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  ** already..    
db10: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 30  */.    assert( 0
db20: 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  !=pFile->eFileLo
db30: 63 6b 20 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  ck );.    lock.l
db40: 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b  _type = F_WRLCK;
db50: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 46  ..    assert( eF
db60: 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  ileLock==RESERVE
db70: 44 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c  D_LOCK || eFileL
db80: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
db90: 4f 43 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 65  OCK );.    if( e
dba0: 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  FileLock==RESERV
dbb0: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  ED_LOCK ){.     
dbc0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
dbd0: 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20  RESERVED_BYTE;. 
dbe0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
dbf0: 3d 20 31 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = 1L;.    }else{
dc00: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  .      lock.l_st
dc10: 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
dc20: 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ST;.      lock.l
dc30: 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49  _len = SHARED_SI
dc40: 5a 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ZE;.    }..    i
dc50: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
dc60: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b  pFile, &lock) ){
dc70: 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20  .      tErrno = 
dc80: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  errno;.      rc 
dc90: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
dca0: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
dcb0: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
dcc0: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
dcd0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc!=SQLITE_BUS
dce0: 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f  Y ){.        sto
dcf0: 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
dd00: 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20  e, tErrno);.    
dd10: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
dd20: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
dd30: 44 45 42 55 47 0a 20 20 2f 2a 20 53 65 74 20 75  DEBUG.  /* Set u
dd40: 70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  p the transactio
dd50: 6e 2d 63 6f 75 6e 74 65 72 20 63 68 61 6e 67 65  n-counter change
dd60: 20 63 68 65 63 6b 69 6e 67 20 66 6c 61 67 73 20   checking flags 
dd70: 77 68 65 6e 0a 20 20 2a 2a 20 74 72 61 6e 73 69  when.  ** transi
dd80: 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 61 20 53  tioning from a S
dd90: 48 41 52 45 44 20 74 6f 20 61 20 52 45 53 45 52  HARED to a RESER
dda0: 56 45 44 20 6c 6f 63 6b 2e 20 20 54 68 65 20 63  VED lock.  The c
ddb0: 68 61 6e 67 65 0a 20 20 2a 2a 20 66 72 6f 6d 20  hange.  ** from 
ddc0: 53 48 41 52 45 44 20 74 6f 20 52 45 53 45 52 56  SHARED to RESERV
ddd0: 45 44 20 6d 61 72 6b 73 20 74 68 65 20 62 65 67  ED marks the beg
dde0: 69 6e 6e 69 6e 67 20 6f 66 20 61 20 6e 6f 72 6d  inning of a norm
ddf0: 61 6c 0a 20 20 2a 2a 20 77 72 69 74 65 20 6f 70  al.  ** write op
de00: 65 72 61 74 69 6f 6e 20 28 6e 6f 74 20 61 20 68  eration (not a h
de10: 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot journal rollb
de20: 61 63 6b 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ack)..  */.  if(
de30: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20   rc==SQLITE_OK. 
de40: 20 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c    && pFile->eFil
de50: 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
de60: 43 4b 0a 20 20 20 26 26 20 65 46 69 6c 65 4c 6f  CK.   && eFileLo
de70: 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
de80: 4b 0a 20 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  K.  ){.    pFile
de90: 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20  ->transCntrChng 
dea0: 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  = 0;.    pFile->
deb0: 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20  dbUpdate = 0;.  
dec0: 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61    pFile->inNorma
ded0: 6c 57 72 69 74 65 20 3d 20 31 3b 0a 20 20 7d 0a  lWrite = 1;.  }.
dee0: 23 65 6e 64 69 66 0a 0a 0a 20 20 69 66 28 20 72  #endif...  if( r
def0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
df00: 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
df10: 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
df20: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46  ;.    pInode->eF
df30: 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
df40: 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ock;.  }else if(
df50: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c   eFileLock==EXCL
df60: 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  USIVE_LOCK ){.  
df70: 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
df80: 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  ck = PENDING_LOC
df90: 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65  K;.    pInode->e
dfa0: 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49  FileLock = PENDI
dfb0: 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e  NG_LOCK;.  }..en
dfc0: 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65  d_lock:.  unixLe
dfd0: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53  aveMutex();.  OS
dfe0: 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
dff0: 25 64 20 25 73 20 25 73 20 28 75 6e 69 78 29 5c  %d %s %s (unix)\
e000: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a  n", pFile->h, az
e010: 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f  FileLock(eFileLo
e020: 63 6b 29 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d  ck), .      rc==
e030: 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22  SQLITE_OK ? "ok"
e040: 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20   : "failed"));. 
e050: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
e060: 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 66 69 6c  *.** Add the fil
e070: 65 20 64 65 73 63 72 69 70 74 6f 72 20 75 73 65  e descriptor use
e080: 64 20 62 79 20 66 69 6c 65 20 68 61 6e 64 6c 65  d by file handle
e090: 20 70 46 69 6c 65 20 74 6f 20 74 68 65 20 63 6f   pFile to the co
e0a0: 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 70  rresponding.** p
e0b0: 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a  Unused list..*/.
e0c0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 50  static void setP
e0d0: 65 6e 64 69 6e 67 46 64 28 75 6e 69 78 46 69 6c  endingFd(unixFil
e0e0: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69  e *pFile){.  uni
e0f0: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
e100: 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
e110: 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64  de;.  UnixUnused
e120: 46 64 20 2a 70 20 3d 20 70 46 69 6c 65 2d 3e 70  Fd *p = pFile->p
e130: 55 6e 75 73 65 64 3b 0a 20 20 70 2d 3e 70 4e 65  Unused;.  p->pNe
e140: 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 55 6e  xt = pInode->pUn
e150: 75 73 65 64 3b 0a 20 20 70 49 6e 6f 64 65 2d 3e  used;.  pInode->
e160: 70 55 6e 75 73 65 64 20 3d 20 70 3b 0a 20 20 70  pUnused = p;.  p
e170: 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20  File->h = -1;.  
e180: 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 20 3d  pFile->pUnused =
e190: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77   0;.}../*.** Low
e1a0: 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
e1b0: 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
e1c0: 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
e1d0: 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
e1e0: 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62  leLock.** must b
e1f0: 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
e200: 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
e210: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
e220: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
e230: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
e240: 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
e250: 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
e260: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
e270: 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
e280: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
e290: 70 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 68 61 6e  p..** .** If han
e2a0: 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 69 73 20  dleNFSUnlock is 
e2b0: 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 20 64 6f  true, then on do
e2c0: 77 6e 67 72 61 64 69 6e 67 20 61 6e 20 45 58 43  wngrading an EXC
e2d0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 74 6f 20 53  LUSIVE_LOCK to S
e2e0: 48 41 52 45 44 0a 2a 2a 20 74 68 65 20 62 79 74  HARED.** the byt
e2f0: 65 20 72 61 6e 67 65 20 69 73 20 64 69 76 69 64  e range is divid
e300: 65 64 20 69 6e 74 6f 20 32 20 70 61 72 74 73 20  ed into 2 parts 
e310: 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 70 61  and the first pa
e320: 72 74 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 74  rt is unlocked t
e330: 68 65 6e 0a 2a 2a 20 73 65 74 20 74 6f 20 61 20  hen.** set to a 
e340: 72 65 61 64 20 6c 6f 63 6b 2c 20 74 68 65 6e 20  read lock, then 
e350: 74 68 65 20 6f 74 68 65 72 20 70 61 72 74 20 69  the other part i
e360: 73 20 73 69 6d 70 6c 79 20 75 6e 6c 6f 63 6b 65  s simply unlocke
e370: 64 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20 0a  d.  This works .
e380: 2a 2a 20 61 72 6f 75 6e 64 20 61 20 62 75 67 20  ** around a bug 
e390: 69 6e 20 42 53 44 20 4e 46 53 20 6c 6f 63 6b 64  in BSD NFS lockd
e3a0: 20 28 61 6c 73 6f 20 73 65 65 6e 20 6f 6e 20 4d   (also seen on M
e3b0: 61 63 4f 53 58 20 31 30 2e 33 2b 29 20 74 68 61  acOSX 10.3+) tha
e3c0: 74 20 66 61 69 6c 73 20 74 6f 20 0a 2a 2a 20 72  t fails to .** r
e3d0: 65 6d 6f 76 65 20 74 68 65 20 77 72 69 74 65 20  emove the write 
e3e0: 6c 6f 63 6b 20 6f 6e 20 61 20 72 65 67 69 6f 6e  lock on a region
e3f0: 20 77 68 65 6e 20 61 20 72 65 61 64 20 6c 6f 63   when a read loc
e400: 6b 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 73 74 61  k is set..*/.sta
e410: 74 69 63 20 69 6e 74 20 70 6f 73 69 78 55 6e 6c  tic int posixUnl
e420: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
e430: 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
e440: 6f 63 6b 2c 20 69 6e 74 20 68 61 6e 64 6c 65 4e  ock, int handleN
e450: 46 53 55 6e 6c 6f 63 6b 29 7b 0a 20 20 75 6e 69  FSUnlock){.  uni
e460: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
e470: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
e480: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
e490: 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63 74 20  Inode;.  struct 
e4a0: 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e  flock lock;.  in
e4b0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
e4c0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
e4d0: 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
e4e0: 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
e4f0: 77 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69  was %d(%d,%d) pi
e500: 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20  d=%d (unix)\n", 
e510: 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c  pFile->h, eFileL
e520: 6f 63 6b 2c 0a 20 20 20 20 20 20 70 46 69 6c 65  ock,.      pFile
e530: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69  ->eFileLock, pFi
e540: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  le->pInode->eFil
e550: 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49  eLock, pFile->pI
e560: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20  node->nShared,. 
e570: 20 20 20 20 20 6f 73 47 65 74 70 69 64 28 30 29       osGetpid(0)
e580: 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65  ));..  assert( e
e590: 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  FileLock<=SHARED
e5a0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  _LOCK );.  if( p
e5b0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c  File->eFileLock<
e5c0: 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
e5d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e5e0: 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e  OK;.  }.  unixEn
e5f0: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49  terMutex();.  pI
e600: 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
e610: 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  node;.  assert( 
e620: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21  pInode->nShared!
e630: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  =0 );.  if( pFil
e640: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
e650: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
e660: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
e670: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65  eFileLock==pFile
e680: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 0a  ->eFileLock );..
e690: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
e6a0: 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20  BUG.    /* When 
e6b0: 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20  reducing a lock 
e6c0: 73 75 63 68 20 74 68 61 74 20 6f 74 68 65 72 20  such that other 
e6d0: 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74  processes can st
e6e0: 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69  art.    ** readi
e6f0: 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
e700: 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65  file again, make
e710: 20 73 75 72 65 20 74 68 61 74 20 74 68 65 0a 20   sure that the. 
e720: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
e730: 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70  n counter was up
e740: 64 61 74 65 64 20 69 66 20 61 6e 79 20 70 61 72  dated if any par
e750: 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
e760: 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68  e.    ** file ch
e770: 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74  anged.  If the t
e780: 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
e790: 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65  er is not update
e7a0: 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  d,.    ** other 
e7b0: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74  connections to t
e7c0: 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67  he same file mig
e7d0: 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74  ht not realize t
e7e0: 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66  hat.    ** the f
e7f0: 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64 20  ile has changed 
e800: 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20  and hence might 
e810: 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73  not know to flus
e820: 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63  h their.    ** c
e830: 61 63 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f  ache.  The use o
e840: 66 20 61 20 73 74 61 6c 65 20 63 61 63 68 65 20  f a stale cache 
e850: 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61  can lead to data
e860: 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
e870: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 46 69 6c  .    */.    pFil
e880: 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
e890: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20   = 0;.#endif..  
e8a0: 20 20 2f 2a 20 64 6f 77 6e 67 72 61 64 69 6e 67    /* downgrading
e8b0: 20 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63   to a shared loc
e8c0: 6b 20 6f 6e 20 4e 46 53 20 69 6e 76 6f 6c 76 65  k on NFS involve
e8d0: 73 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 77  s clearing the w
e8e0: 72 69 74 65 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a  rite lock.    **
e8f0: 20 62 65 66 6f 72 65 20 65 73 74 61 62 6c 69 73   before establis
e900: 68 69 6e 67 20 74 68 65 20 72 65 61 64 6c 6f 63  hing the readloc
e910: 6b 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 72  k - to avoid a r
e920: 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 77 65  ace condition we
e930: 20 64 6f 77 6e 67 72 61 64 65 0a 20 20 20 20 2a   downgrade.    *
e940: 2a 20 74 68 65 20 6c 6f 63 6b 20 69 6e 20 32 20  * the lock in 2 
e950: 62 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 61 74 20  blocks, so that 
e960: 70 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67  part of the rang
e970: 65 20 77 69 6c 6c 20 62 65 20 63 6f 76 65 72 65  e will be covere
e980: 64 20 62 79 20 61 20 0a 20 20 20 20 2a 2a 20 77  d by a .    ** w
e990: 72 69 74 65 20 6c 6f 63 6b 20 75 6e 74 69 6c 20  rite lock until 
e9a0: 74 68 65 20 72 65 73 74 20 69 73 20 63 6f 76 65  the rest is cove
e9b0: 72 65 64 20 62 79 20 61 20 72 65 61 64 20 6c 6f  red by a read lo
e9c0: 63 6b 3a 0a 20 20 20 20 2a 2a 20 20 31 3a 20 20  ck:.    **  1:  
e9d0: 20 5b 57 57 57 57 57 5d 0a 20 20 20 20 2a 2a 20   [WWWWW].    ** 
e9e0: 20 32 3a 20 20 20 5b 2e 2e 2e 2e 57 5d 0a 20 20   2:   [....W].  
e9f0: 20 20 2a 2a 20 20 33 3a 20 20 20 5b 52 52 52 52    **  3:   [RRRR
ea00: 57 5d 0a 20 20 20 20 2a 2a 20 20 34 3a 20 20 20  W].    **  4:   
ea10: 5b 52 52 52 52 2e 5d 0a 20 20 20 20 2a 2f 0a 20  [RRRR.].    */. 
ea20: 20 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b     if( eFileLock
ea30: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
ea40: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f  .#if !defined(__
ea50: 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 21 53 51 4c  APPLE__) || !SQL
ea60: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
ea70: 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 28  NG_STYLE.      (
ea80: 76 6f 69 64 29 68 61 6e 64 6c 65 4e 46 53 55 6e  void)handleNFSUn
ea90: 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73 73 65  lock;.      asse
eaa0: 72 74 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c  rt( handleNFSUnl
eab0: 6f 63 6b 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66  ock==0 );.#endif
eac0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
ead0: 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
eae0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
eaf0: 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 69 66 28  _STYLE.      if(
eb00: 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b   handleNFSUnlock
eb10: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
eb20: 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20  tErrno;         
eb30: 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63        /* Error c
eb40: 6f 64 65 20 66 72 6f 6d 20 73 79 73 74 65 6d 20  ode from system 
eb50: 63 61 6c 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20  call errors */. 
eb60: 20 20 20 20 20 20 20 6f 66 66 5f 74 20 64 69 76         off_t div
eb70: 53 69 7a 65 20 3d 20 53 48 41 52 45 44 5f 53 49  Size = SHARED_SI
eb80: 5a 45 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20  ZE - 1;.        
eb90: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
eba0: 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
ebb0: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77          lock.l_w
ebc0: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
ebd0: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
ebe0: 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
ebf0: 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c  FIRST;.        l
ec00: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53  ock.l_len = divS
ec10: 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ize;.        if(
ec20: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
ec30: 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31  ile, &lock)==(-1
ec40: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  ) ){.          t
ec50: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
ec60: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
ec70: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
ec80: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f  K;.          sto
ec90: 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
eca0: 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20  e, tErrno);.    
ecb0: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75        goto end_u
ecc0: 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  nlock;.        }
ecd0: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
ece0: 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a  type = F_RDLCK;.
ecf0: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77          lock.l_w
ed00: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
ed10: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
ed20: 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
ed30: 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c  FIRST;.        l
ed40: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53  ock.l_len = divS
ed50: 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ize;.        if(
ed60: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
ed70: 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31  ile, &lock)==(-1
ed80: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  ) ){.          t
ed90: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
eda0: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
edb0: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
edc0: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
edd0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
ede0: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  OCK);.          
edf0: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
ee00: 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
ee10: 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
ee20: 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
ee30: 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  o);.          }.
ee40: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
ee50: 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20  nd_unlock;.     
ee60: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63     }.        loc
ee70: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
ee80: 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  CK;.        lock
ee90: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
eea0: 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  _SET;.        lo
eeb0: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
eec0: 52 45 44 5f 46 49 52 53 54 2b 64 69 76 53 69 7a  RED_FIRST+divSiz
eed0: 65 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  e;.        lock.
eee0: 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
eef0: 49 5a 45 2d 64 69 76 53 69 7a 65 3b 0a 20 20 20  IZE-divSize;.   
ef00: 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c       if( unixFil
ef10: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
ef20: 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  ck)==(-1) ){.   
ef30: 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20         tErrno = 
ef40: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  errno;.         
ef50: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
ef60: 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20  RR_UNLOCK;.     
ef70: 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
ef80: 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
ef90: 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  o);.          go
efa0: 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20  to end_unlock;. 
efb0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
efc0: 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 64  else.#endif /* d
efd0: 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
efe0: 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
eff0: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
f000: 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20   */.      {.    
f010: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
f020: 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20  = F_RDLCK;.     
f030: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
f040: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
f050: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
f060: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
f070: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
f080: 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49  _len = SHARED_SI
f090: 5a 45 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ZE;.        if( 
f0a0: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
f0b0: 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20  le, &lock) ){.  
f0c0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68          /* In th
f0d0: 65 6f 72 79 2c 20 74 68 65 20 63 61 6c 6c 20 74  eory, the call t
f0e0: 6f 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 29  o unixFileLock()
f0f0: 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 62 65 63   cannot fail bec
f100: 61 75 73 65 20 61 6e 6f 74 68 65 72 0a 20 20 20  ause another.   
f110: 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
f120: 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20  s is holding an 
f130: 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6c 6f 63  incompatible loc
f140: 6b 2e 20 49 66 20 69 74 20 64 6f 65 73 2c 20 74  k. If it does, t
f150: 68 69 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  his .          *
f160: 2a 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  * indicates that
f170: 20 74 68 65 20 6f 74 68 65 72 20 70 72 6f 63 65   the other proce
f180: 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77  ss is not follow
f190: 69 6e 67 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a  ing the locking.
f1a0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
f1b0: 74 6f 63 6f 6c 2e 20 49 66 20 74 68 69 73 20 68  tocol. If this h
f1c0: 61 70 70 65 6e 73 2c 20 72 65 74 75 72 6e 20 53  appens, return S
f1d0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f  QLITE_IOERR_RDLO
f1e0: 43 4b 2e 20 52 65 74 75 72 6e 69 6e 67 0a 20 20  CK. Returning.  
f1f0: 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54          ** SQLIT
f200: 45 5f 42 55 53 59 20 77 6f 75 6c 64 20 63 6f 6e  E_BUSY would con
f210: 66 75 73 65 20 74 68 65 20 75 70 70 65 72 20 6c  fuse the upper l
f220: 61 79 65 72 20 28 69 6e 20 70 72 61 63 74 69 63  ayer (in practic
f230: 65 20 69 74 20 63 61 75 73 65 73 20 0a 20 20 20  e it causes .   
f240: 20 20 20 20 20 20 20 2a 2a 20 61 6e 20 61 73 73         ** an ass
f250: 65 72 74 20 74 6f 20 66 61 69 6c 29 2e 20 2a 2f  ert to fail). */
f260: 20 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d   .          rc =
f270: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44   SQLITE_IOERR_RD
f280: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  LOCK;.          
f290: 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
f2a0: 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  File, errno);.  
f2b0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
f2c0: 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  _unlock;.       
f2d0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
f2e0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
f2f0: 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
f300: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
f310: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f  SEEK_SET;.    lo
f320: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e  ck.l_start = PEN
f330: 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c  DING_BYTE;.    l
f340: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b 20  ock.l_len = 2L; 
f350: 20 61 73 73 65 72 74 28 20 50 45 4e 44 49 4e 47   assert( PENDING
f360: 5f 42 59 54 45 2b 31 3d 3d 52 45 53 45 52 56 45  _BYTE+1==RESERVE
f370: 44 5f 42 59 54 45 20 29 3b 0a 20 20 20 20 69 66  D_BYTE );.    if
f380: 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
f390: 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20  File, &lock)==0 
f3a0: 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  ){.      pInode-
f3b0: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
f3c0: 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65  RED_LOCK;.    }e
f3d0: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
f3e0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
f3f0: 4f 43 4b 3b 0a 20 20 20 20 20 20 73 74 6f 72 65  OCK;.      store
f400: 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
f410: 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 67   errno);.      g
f420: 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a  oto end_unlock;.
f430: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
f440: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  eFileLock==NO_LO
f450: 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 44 65 63  CK ){.    /* Dec
f460: 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65  rement the share
f470: 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20  d lock counter. 
f480: 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63   Release the loc
f490: 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a  k using an.    *
f4a0: 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77  * OS call only w
f4b0: 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20  hen all threads 
f4c0: 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f  in this same pro
f4d0: 63 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73  cess have releas
f4e0: 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f  ed.    ** the lo
f4f0: 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ck..    */.    p
f500: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d  Inode->nShared--
f510: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ;.    if( pInode
f520: 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a  ->nShared==0 ){.
f530: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
f540: 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
f550: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
f560: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
f570: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
f580: 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30  = lock.l_len = 0
f590: 4c 3b 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69  L;.      if( uni
f5a0: 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
f5b0: 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20   &lock)==0 ){.  
f5c0: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46        pInode->eF
f5d0: 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
f5e0: 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  K;.      }else{.
f5f0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
f600: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
f610: 3b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c  ;.        storeL
f620: 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
f630: 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  errno);.        
f640: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
f650: 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20  k = NO_LOCK;.   
f660: 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
f670: 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
f680: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
f690: 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74      /* Decrement
f6a0: 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 6c 6f   the count of lo
f6b0: 63 6b 73 20 61 67 61 69 6e 73 74 20 74 68 69 73  cks against this
f6c0: 20 73 61 6d 65 20 66 69 6c 65 2e 20 20 57 68 65   same file.  Whe
f6d0: 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 75  n the.    ** cou
f6e0: 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c  nt reaches zero,
f6f0: 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74 68 65 72   close any other
f700: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
f710: 73 20 77 68 6f 73 65 20 63 6c 6f 73 65 0a 20 20  s whose close.  
f720: 20 20 2a 2a 20 77 61 73 20 64 65 66 65 72 72 65    ** was deferre
f730: 64 20 62 65 63 61 75 73 65 20 6f 66 20 6f 75 74  d because of out
f740: 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a  standing locks..
f750: 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 6f 64      */.    pInod
f760: 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20  e->nLock--;.    
f770: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
f780: 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20  nLock>=0 );.    
f790: 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  if( pInode->nLoc
f7a0: 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6c  k==0 ){.      cl
f7b0: 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46  osePendingFds(pF
f7c0: 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ile);.    }.  }.
f7d0: 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a 20 20 75  .end_unlock:.  u
f7e0: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
f7f0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
f800: 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46  E_OK ) pFile->eF
f810: 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
f820: 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ock;.  return rc
f830: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  ;.}../*.** Lower
f840: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
f850: 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
f860: 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65  iptor pFile to e
f870: 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65  FileLock.  eFile
f880: 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Lock.** must be 
f890: 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
f8a0: 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
f8b0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
f8c0: 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
f8d0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
f8e0: 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
f8f0: 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
f900: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
f910: 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
f920: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
f930: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
f940: 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  nixUnlock(sqlite
f950: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
f960: 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 23 69 66 20  eFileLock){.#if 
f970: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
f980: 53 49 5a 45 3e 30 0a 20 20 61 73 73 65 72 74 28  SIZE>0.  assert(
f990: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
f9a0: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 28 28 75 6e 69  ED_LOCK || ((uni
f9b0: 78 46 69 6c 65 20 2a 29 69 64 29 2d 3e 6e 46 65  xFile *)id)->nFe
f9c0: 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 23 65 6e  tchOut==0 );.#en
f9d0: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70 6f 73  dif.  return pos
f9e0: 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69  ixUnlock(id, eFi
f9f0: 6c 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a 0a 23  leLock, 0);.}..#
fa00: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
fa10: 41 50 5f 53 49 5a 45 3e 30 0a 73 74 61 74 69 63  AP_SIZE>0.static
fa20: 20 69 6e 74 20 75 6e 69 78 4d 61 70 66 69 6c 65   int unixMapfile
fa30: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c 20  (unixFile *pFd, 
fa40: 69 36 34 20 6e 42 79 74 65 29 3b 0a 73 74 61 74  i64 nByte);.stat
fa50: 69 63 20 76 6f 69 64 20 75 6e 69 78 55 6e 6d 61  ic void unixUnma
fa60: 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a  pfile(unixFile *
fa70: 70 46 64 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  pFd);.#endif../*
fa80: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
fa90: 6e 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20 70  n performs the p
faa0: 61 72 74 73 20 6f 66 20 74 68 65 20 22 63 6c 6f  arts of the "clo
fab0: 73 65 20 66 69 6c 65 22 20 6f 70 65 72 61 74 69  se file" operati
fac0: 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f  on .** common to
fad0: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73 63 68   all locking sch
fae0: 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65 73 20  emes. It closes 
faf0: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 61 6e  the directory an
fb00: 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65  d file.** handle
fb10: 73 2c 20 69 66 20 74 68 65 79 20 61 72 65 20 76  s, if they are v
fb20: 61 6c 69 64 2c 20 61 6e 64 20 73 65 74 73 20 61  alid, and sets a
fb30: 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  ll fields of the
fb40: 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72   unixFile.** str
fb50: 75 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a  ucture to 0..**.
fb60: 2a 2a 20 49 74 20 69 73 20 2a 6e 6f 74 2a 20 6e  ** It is *not* n
fb70: 65 63 65 73 73 61 72 79 20 74 6f 20 68 6f 6c 64  ecessary to hold
fb80: 20 74 68 65 20 6d 75 74 65 78 20 77 68 65 6e 20   the mutex when 
fb90: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
fba0: 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e 20  called,.** even 
fbb0: 6f 6e 20 56 78 57 6f 72 6b 73 2e 20 20 41 20 6d  on VxWorks.  A m
fbc0: 75 74 65 78 20 77 69 6c 6c 20 62 65 20 61 63 71  utex will be acq
fbd0: 75 69 72 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73  uired on VxWorks
fbe0: 20 62 79 20 74 68 65 0a 2a 2a 20 76 78 77 6f 72   by the.** vxwor
fbf0: 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28  ksReleaseFileId(
fc00: 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74  ) routine..*/.st
fc10: 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65 55 6e  atic int closeUn
fc20: 69 78 46 69 6c 65 28 73 71 6c 69 74 65 33 5f 66  ixFile(sqlite3_f
fc30: 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78  ile *id){.  unix
fc40: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
fc50: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 23 69 66  nixFile*)id;.#if
fc60: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
fc70: 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78 55 6e  _SIZE>0.  unixUn
fc80: 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a  mapfile(pFile);.
fc90: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 46 69  #endif.  if( pFi
fca0: 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20  le->h>=0 ){.    
fcb0: 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69  robust_close(pFi
fcc0: 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 5f 5f  le, pFile->h, __
fcd0: 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 70 46 69  LINE__);.    pFi
fce0: 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 7d 0a  le->h = -1;.  }.
fcf0: 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
fd00: 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 64 20   if( pFile->pId 
fd10: 29 7b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65  ){.    if( pFile
fd20: 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
fd30: 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 20 29 7b  IXFILE_DELETE ){
fd40: 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28  .      osUnlink(
fd50: 70 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43 61 6e  pFile->pId->zCan
fd60: 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20  onicalName);.   
fd70: 20 7d 0a 20 20 20 20 76 78 77 6f 72 6b 73 52 65   }.    vxworksRe
fd80: 6c 65 61 73 65 46 69 6c 65 49 64 28 70 46 69 6c  leaseFileId(pFil
fd90: 65 2d 3e 70 49 64 29 3b 0a 20 20 20 20 70 46 69  e->pId);.    pFi
fda0: 6c 65 2d 3e 70 49 64 20 3d 20 30 3b 0a 20 20 7d  le->pId = 0;.  }
fdb0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
fdc0: 51 4c 49 54 45 5f 55 4e 4c 49 4e 4b 5f 41 46 54  QLITE_UNLINK_AFT
fdd0: 45 52 5f 43 4c 4f 53 45 0a 20 20 69 66 28 20 70  ER_CLOSE.  if( p
fde0: 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
fdf0: 26 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54  & UNIXFILE_DELET
fe00: 45 20 29 7b 0a 20 20 20 20 6f 73 55 6e 6c 69 6e  E ){.    osUnlin
fe10: 6b 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  k(pFile->zPath);
fe20: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
fe30: 65 28 2a 28 63 68 61 72 2a 2a 29 26 70 46 69 6c  e(*(char**)&pFil
fe40: 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 70  e->zPath);.    p
fe50: 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3d 20 30 3b  File->zPath = 0;
fe60: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53  .  }.#endif.  OS
fe70: 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 20 20  TRACE(("CLOSE   
fe80: 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  %-3d\n", pFile->
fe90: 68 29 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74  h));.  OpenCount
fea0: 65 72 28 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65  er(-1);.  sqlite
feb0: 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 70 55  3_free(pFile->pU
fec0: 6e 75 73 65 64 29 3b 0a 20 20 6d 65 6d 73 65 74  nused);.  memset
fed0: 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f  (pFile, 0, sizeo
fee0: 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20  f(unixFile));.  
fef0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
ff00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
ff10: 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74   a file..*/.stat
ff20: 69 63 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73 65  ic int unixClose
ff30: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
ff40: 64 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  d){.  int rc = S
ff50: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
ff60: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
ff70: 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20  nixFile *)id;.  
ff80: 76 65 72 69 66 79 44 62 46 69 6c 65 28 70 46 69  verifyDbFile(pFi
ff90: 6c 65 29 3b 0a 20 20 75 6e 69 78 55 6e 6c 6f 63  le);.  unixUnloc
ffa0: 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
ffb0: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
ffc0: 28 29 3b 0a 0a 20 20 2f 2a 20 75 6e 69 78 46 69  ();..  /* unixFi
ffd0: 6c 65 2e 70 49 6e 6f 64 65 20 69 73 20 61 6c 77  le.pInode is alw
ffe0: 61 79 73 20 76 61 6c 69 64 20 68 65 72 65 2e 20  ays valid here. 
fff0: 4f 74 68 65 72 77 69 73 65 2c 20 61 20 64 69 66  Otherwise, a dif
10000 66 65 72 65 6e 74 20 63 6c 6f 73 65 0a 20 20 2a  ferent close.  *
10010 2a 20 72 6f 75 74 69 6e 65 20 28 65 2e 67 2e 20  * routine (e.g. 
10020 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 29 29 20 77  nolockClose()) w
10030 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 69  ould be called i
10040 6e 73 74 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 61  nstead..  */.  a
10050 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 49  ssert( pFile->pI
10060 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c  node->nLock>0 ||
10070 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
10080 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20  bProcessLock==0 
10090 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  );.  if( ALWAYS(
100a0 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 29 20 26  pFile->pInode) &
100b0 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  & pFile->pInode-
100c0 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 2f 2a  >nLock ){.    /*
100d0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75   If there are ou
100e0 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c  tstanding locks,
100f0 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79   do not actually
10100 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
10110 6a 75 73 74 0a 20 20 20 20 2a 2a 20 79 65 74 20  just.    ** yet 
10120 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75  because that wou
10130 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c  ld clear those l
10140 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20  ocks.  Instead, 
10150 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20  add the file.   
10160 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74   ** descriptor t
10170 6f 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65  o pInode->pUnuse
10180 64 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c 6c  d list.  It will
10190 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   be automaticall
101a0 79 20 63 6c 6f 73 65 64 20 0a 20 20 20 20 2a 2a  y closed .    **
101b0 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c   when the last l
101c0 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a  ock is cleared..
101d0 20 20 20 20 2a 2f 0a 20 20 20 20 73 65 74 50 65      */.    setPe
101e0 6e 64 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a  ndingFd(pFile);.
101f0 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 49 6e 6f    }.  releaseIno
10200 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20  deInfo(pFile);. 
10210 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46   rc = closeUnixF
10220 69 6c 65 28 69 64 29 3b 0a 20 20 75 6e 69 78 4c  ile(id);.  unixL
10230 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72  eaveMutex();.  r
10240 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a  eturn rc;.}../**
10250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
10260 20 6f 66 20 74 68 65 20 70 6f 73 69 78 20 61 64   of the posix ad
10270 76 69 73 6f 72 79 20 6c 6f 63 6b 20 69 6d 70 6c  visory lock impl
10280 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
10290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 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 2a 2a 2a  ****************
102c0 2a 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 2f 0a 0a 2f 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 2a  ****************
10310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
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 20 4e 6f 2d  ************ No-
10360 6f 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  op Locking *****
10370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
10390 0a 2a 2a 20 4f 66 20 74 68 65 20 76 61 72 69 6f  .** Of the vario
103a0 75 73 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65  us locking imple
103b0 6d 65 6e 74 61 74 69 6f 6e 73 20 61 76 61 69 6c  mentations avail
103c0 61 62 6c 65 2c 20 74 68 69 73 20 69 73 20 62 79  able, this is by
103d0 20 66 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d 70   far the.** simp
103e0 6c 65 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20 69  lest:  locking i
103f0 73 20 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20 61  s ignored.  No a
10400 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
10410 6f 20 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  o lock the datab
10420 61 73 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20  ase.** file for 
10430 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
10440 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c  ng..**.** This l
10450 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 61  ocking mode is a
10460 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 75  ppropriate for u
10470 73 65 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20  se on read-only 
10480 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 28 65 78  databases.** (ex
10490 3a 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74  : databases that
104a0 20 61 72 65 20 62 75 72 6e 65 64 20 69 6e 74 6f   are burned into
104b0 20 43 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78 61   CD-ROM, for exa
104c0 6d 70 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a 2a  mple.)  It can.*
104d0 2a 20 61 6c 73 6f 20 62 65 20 75 73 65 64 20 69  * also be used i
104e0 66 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f  f the applicatio
104f0 6e 20 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20 65  n employs some e
10500 78 74 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69 73  xternal mechanis
10510 6d 20 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74 20  m to.** prevent 
10520 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63 63  simultaneous acc
10530 65 73 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ess of the same 
10540 64 61 74 61 62 61 73 65 20 62 79 20 74 77 6f 20  database by two 
10550 6f 72 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61 62  or more.** datab
10560 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e  ase connections.
10570 20 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61    But there is a
10580 20 73 65 72 69 6f 75 73 20 72 69 73 6b 20 6f 66   serious risk of
10590 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 72   database.** cor
105a0 72 75 70 74 69 6f 6e 20 69 66 20 74 68 69 73 20  ruption if this 
105b0 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20  locking mode is 
105c0 75 73 65 64 20 69 6e 20 73 69 74 75 61 74 69 6f  used in situatio
105d0 6e 73 20 77 68 65 72 65 20 6d 75 6c 74 69 70 6c  ns where multipl
105e0 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  e.** database co
105f0 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 61 63  nnections are ac
10600 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65  cessing the same
10610 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
10620 74 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 69  t the same.** ti
10630 6d 65 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f  me and one or mo
10640 72 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e  re of those conn
10650 65 63 74 69 6f 6e 73 20 61 72 65 20 77 72 69 74  ections are writ
10660 69 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20  ing..*/..static 
10670 69 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52  int nolockCheckR
10680 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
10690 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65  te3_file *NotUse
106a0 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
106b0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
106c0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
106d0 20 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20   *pResOut = 0;. 
106e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
106f0 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  K;.}.static int 
10700 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74  nolockLock(sqlit
10710 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64  e3_file *NotUsed
10720 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b  , int NotUsed2){
10730 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
10740 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
10750 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72  tUsed2);.  retur
10760 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73  n SQLITE_OK;.}.s
10770 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b  tatic int nolock
10780 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
10790 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  ile *NotUsed, in
107a0 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55  t NotUsed2){.  U
107b0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32  NUSED_PARAMETER2
107c0 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65  (NotUsed, NotUse
107d0 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  d2);.  return SQ
107e0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
107f0 2a 20 43 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  * Close the file
10800 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10810 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69  nolockClose(sqli
10820 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a  te3_file *id) {.
10830 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e    return closeUn
10840 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 2f  ixFile(id);.}../
10850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10860 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e  *** End of the n
10870 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  o-op lock implem
10880 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
10890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 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 2a  ****************
108c0 2a 2a 2a 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 2f 0a 0a  *************/..
108f0 2f 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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
10940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10950 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
10960 64 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b 69 6e 67  dot-file Locking
10970 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
10980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
10990 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 74 66 69 6c  **.** The dotfil
109a0 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d  e locking implem
109b0 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 74 68  entation uses th
109c0 65 20 65 78 69 73 74 65 6e 63 65 20 6f 66 20 73  e existence of s
109d0 65 70 61 72 61 74 65 20 6c 6f 63 6b 0a 2a 2a 20  eparate lock.** 
109e0 66 69 6c 65 73 20 28 72 65 61 6c 6c 79 20 61 20  files (really a 
109f0 64 69 72 65 63 74 6f 72 79 29 20 74 6f 20 63 6f  directory) to co
10a00 6e 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20  ntrol access to 
10a10 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
10a20 68 69 73 20 77 6f 72 6b 73 0a 2a 2a 20 6f 6e 20  his works.** on 
10a30 6a 75 73 74 20 61 62 6f 75 74 20 65 76 65 72 79  just about every
10a40 20 66 69 6c 65 73 79 73 74 65 6d 20 69 6d 61 67   filesystem imag
10a50 69 6e 61 62 6c 65 2e 20 20 42 75 74 20 74 68 65  inable.  But the
10a60 72 65 20 61 72 65 20 73 65 72 69 6f 75 73 20 64  re are serious d
10a70 6f 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20  ownsides:.**.** 
10a80 20 20 20 28 31 29 20 20 54 68 65 72 65 20 69 73     (1)  There is
10a90 20 7a 65 72 6f 20 63 6f 6e 63 75 72 72 65 6e 63   zero concurrenc
10aa0 79 2e 20 20 41 20 73 69 6e 67 6c 65 20 72 65 61  y.  A single rea
10ab0 64 65 72 20 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f  der blocks all o
10ac0 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20  ther.**         
10ad0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d  connections from
10ae0 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
10af0 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
10b00 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20  ..**.**    (2)  
10b10 41 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63  An application c
10b20 72 61 73 68 20 6f 72 20 70 6f 77 65 72 20 6c 6f  rash or power lo
10b30 73 73 20 63 61 6e 20 6c 65 61 76 65 20 73 74 61  ss can leave sta
10b40 6c 65 20 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a  le lock files.**
10b50 20 20 20 20 20 20 20 20 20 73 69 74 74 69 6e 67           sitting
10b60 20 61 72 6f 75 6e 64 20 74 68 61 74 20 6e 65 65   around that nee
10b70 64 20 74 6f 20 62 65 20 63 6c 65 61 72 65 64 20  d to be cleared 
10b80 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20  manually..**.** 
10b90 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 61 20  Nevertheless, a 
10ba0 64 6f 74 6c 6f 63 6b 20 69 73 20 61 6e 20 61 70  dotlock is an ap
10bb0 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e  propriate lockin
10bc0 67 20 6d 6f 64 65 20 66 6f 72 20 75 73 65 20 69  g mode for use i
10bd0 66 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f  f no.** other lo
10be0 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20 69  cking strategy i
10bf0 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a  s available..**.
10c00 2a 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69  ** Dotfile locki
10c10 6e 67 20 77 6f 72 6b 73 20 62 79 20 63 72 65 61  ng works by crea
10c20 74 69 6e 67 20 61 20 73 75 62 64 69 72 65 63 74  ting a subdirect
10c30 6f 72 79 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ory in the same 
10c40 64 69 72 65 63 74 6f 72 79 20 61 73 0a 2a 2a 20  directory as.** 
10c50 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
10c60 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
10c70 61 6d 65 20 62 75 74 20 77 69 74 68 20 61 20 22  ame but with a "
10c80 2e 6c 6f 63 6b 22 20 65 78 74 65 6e 73 69 6f 6e  .lock" extension
10c90 20 61 64 64 65 64 2e 0a 2a 2a 20 54 68 65 20 65   added..** The e
10ca0 78 69 73 74 65 6e 63 65 20 6f 66 20 61 20 6c 6f  xistence of a lo
10cb0 63 6b 20 64 69 72 65 63 74 6f 72 79 20 69 6d 70  ck directory imp
10cc0 6c 69 65 73 20 61 6e 20 45 58 43 4c 55 53 49 56  lies an EXCLUSIV
10cd0 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74 68  E lock.  All oth
10ce0 65 72 0a 2a 2a 20 6c 6f 63 6b 20 74 79 70 65 73  er.** lock types
10cf0 20 28 53 48 41 52 45 44 2c 20 52 45 53 45 52 56   (SHARED, RESERV
10d00 45 44 2c 20 50 45 4e 44 49 4e 47 29 20 61 72 65  ED, PENDING) are
10d10 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 45 58 43   mapped into EXC
10d20 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  LUSIVE..*/../*.*
10d30 2a 20 54 68 65 20 66 69 6c 65 20 73 75 66 66 69  * The file suffi
10d40 78 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 64  x added to the d
10d50 61 74 61 20 62 61 73 65 20 66 69 6c 65 6e 61 6d  ata base filenam
10d60 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72  e in order to cr
10d70 65 61 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b  eate the.** lock
10d80 20 64 69 72 65 63 74 6f 72 79 2e 0a 2a 2f 0a 23   directory..*/.#
10d90 64 65 66 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53  define DOTLOCK_S
10da0 55 46 46 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f  UFFIX ".lock"../
10db0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
10dc0 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
10dd0 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
10de0 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
10df0 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
10e00 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
10e10 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
10e20 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
10e30 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
10e40 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
10e50 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
10e60 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
10e70 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
10e80 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
10e90 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
10ea0 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
10eb0 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
10ec0 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
10ed0 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  checking..**.** 
10ee0 49 6e 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69  In dotfile locki
10ef0 6e 67 2c 20 65 69 74 68 65 72 20 61 20 6c 6f 63  ng, either a loc
10f00 6b 20 65 78 69 73 74 73 20 6f 72 20 69 74 20 64  k exists or it d
10f10 6f 65 73 20 6e 6f 74 2e 20 20 53 6f 20 69 6e 20  oes not.  So in 
10f20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 74 69 6f  this.** variatio
10f30 6e 20 6f 66 20 43 68 65 63 6b 52 65 73 65 72 76  n of CheckReserv
10f40 65 64 4c 6f 63 6b 28 29 2c 20 2a 70 52 65 73 4f  edLock(), *pResO
10f50 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  ut is set to tru
10f60 65 20 69 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a  e if any lock.**
10f70 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
10f80 66 69 6c 65 20 61 6e 64 20 66 61 6c 73 65 20 69  file and false i
10f90 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e  f the file is un
10fa0 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  locked..*/.stati
10fb0 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 68 65  c int dotlockChe
10fc0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
10fd0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
10fe0 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b   int *pResOut) {
10ff0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
11000 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73  TE_OK;.  int res
11010 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69  erved = 0;.  uni
11020 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
11030 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
11040 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
11050 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
11060 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
11070 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20  VEDLOCK; );.  . 
11080 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
11090 3b 0a 20 20 72 65 73 65 72 76 65 64 20 3d 20 6f  ;.  reserved = o
110a0 73 41 63 63 65 73 73 28 28 63 6f 6e 73 74 20 63  sAccess((const c
110b0 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  har*)pFile->lock
110c0 69 6e 67 43 6f 6e 74 65 78 74 2c 20 30 29 3d 3d  ingContext, 0)==
110d0 30 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54  0;.  OSTRACE(("T
110e0 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
110f0 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e  d %d (dotlock)\n
11100 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c  ", pFile->h, rc,
11110 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20 2a   reserved));.  *
11120 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76  pResOut = reserv
11130 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ed;.  return rc;
11140 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
11150 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
11160 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
11170 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69  by parameter eFi
11180 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20  leLock - one.** 
11190 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
111a0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
111b0 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
111c0 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
111d0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
111e0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
111f0 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
11200 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
11210 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
11220 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
11230 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
11240 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
11250 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
11260 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
11270 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
11280 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
11290 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
112a0 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
112b0 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
112c0 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
112d0 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
112e0 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
112f0 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
11300 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
11310 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
11320 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
11330 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
11340 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
11350 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
11360 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
11370 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
11380 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
11390 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
113a0 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
113b0 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
113c0 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
113d0 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
113e0 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
113f0 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
11400 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
11410 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
11420 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
11430 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
11440 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
11450 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
11460 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20  vel..**.** With 
11470 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c  dotfile locking,
11480 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 20   we really only 
11490 73 75 70 70 6f 72 74 20 73 74 61 74 65 20 28 34  support state (4
114a0 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2a  ): EXCLUSIVE..**
114b0 20 42 75 74 20 77 65 20 74 72 61 63 6b 20 74 68   But we track th
114c0 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20  e other locking 
114d0 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61 6c 6c  levels internall
114e0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
114f0 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c   dotlockLock(sql
11500 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
11510 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
11520 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
11530 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
11540 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b  d;.  char *zLock
11550 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 70  File = (char *)p
11560 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
11570 74 65 78 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  text;.  int rc =
11580 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a 20 20   SQLITE_OK;...  
11590 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20 61 6e  /* If we have an
115a0 79 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65  y lock, then the
115b0 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6c 72 65 61   lock file alrea
115c0 64 79 20 65 78 69 73 74 73 2e 20 20 41 6c 6c 20  dy exists.  All 
115d0 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20  we have.  ** to 
115e0 64 6f 20 69 73 20 61 64 6a 75 73 74 20 6f 75 72  do is adjust our
115f0 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64   internal record
11600 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 6c 65 76   of the lock lev
11610 65 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  el..  */.  if( p
11620 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
11630 3e 20 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  > NO_LOCK ){.   
11640 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
11650 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
11660 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 75 70 64     /* Always upd
11670 61 74 65 20 74 68 65 20 74 69 6d 65 73 74 61 6d  ate the timestam
11680 70 20 6f 6e 20 74 68 65 20 6f 6c 64 20 66 69 6c  p on the old fil
11690 65 20 2a 2f 0a 23 69 66 64 65 66 20 48 41 56 45  e */.#ifdef HAVE
116a0 5f 55 54 49 4d 45 0a 20 20 20 20 75 74 69 6d 65  _UTIME.    utime
116b0 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c  (zLockFile, NULL
116c0 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 75 74 69  );.#else.    uti
116d0 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e  mes(zLockFile, N
116e0 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ULL);.#endif.   
116f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11700 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67  K;.  }.  .  /* g
11710 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65  rab an exclusive
11720 20 6c 6f 63 6b 20 2a 2f 0a 20 20 72 63 20 3d 20   lock */.  rc = 
11730 6f 73 4d 6b 64 69 72 28 7a 4c 6f 63 6b 46 69 6c  osMkdir(zLockFil
11740 65 2c 20 30 37 37 37 29 3b 0a 20 20 69 66 28 20  e, 0777);.  if( 
11750 72 63 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 66  rc<0 ){.    /* f
11760 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f 63 72  ailed to open/cr
11770 65 61 74 65 20 74 68 65 20 6c 6f 63 6b 20 64 69  eate the lock di
11780 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20 20 20 69  rectory */.    i
11790 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
117a0 6f 3b 0a 20 20 20 20 69 66 28 20 45 45 58 49 53  o;.    if( EEXIS
117b0 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20  T == tErrno ){. 
117c0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
117d0 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c 73  _BUSY;.    } els
117e0 65 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  e {.      rc = s
117f0 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
11800 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
11810 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
11820 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  CK);.      if( r
11830 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c!=SQLITE_BUSY )
11840 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c  {.        storeL
11850 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
11860 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d  tErrno);.      }
11870 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
11880 6e 20 72 63 3b 0a 20 20 7d 20 0a 20 20 0a 20 20  n rc;.  } .  .  
11890 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74  /* got it, set t
118a0 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75  he type and retu
118b0 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65  rn ok */.  pFile
118c0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
118d0 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72  ileLock;.  retur
118e0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
118f0 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
11900 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
11910 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
11920 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
11930 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
11940 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
11950 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
11960 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
11970 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
11980 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
11990 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
119a0 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
119b0 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
119c0 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
119d0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
119e0 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  -op..**.** When 
119f0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
11a00 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c 4f 43  l reaches NO_LOC
11a10 4b 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f  K, delete the lo
11a20 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ck file..*/.stat
11a30 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e  ic int dotlockUn
11a40 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
11a50 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
11a60 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69  Lock) {.  unixFi
11a70 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
11a80 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61  xFile*)id;.  cha
11a90 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28  r *zLockFile = (
11aa0 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f  char *)pFile->lo
11ab0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
11ac0 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
11ad0 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
11ae0 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20  TRACE(("UNLOCK  
11af0 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64  %d %d was %d pid
11b00 3d 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22  =%d (dotlock)\n"
11b10 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c  , pFile->h, eFil
11b20 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20  eLock,.         
11b30 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
11b40 63 6b 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29  ck, osGetpid(0))
11b50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
11b60 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c  leLock<=SHARED_L
11b70 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e  OCK );.  .  /* n
11b80 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65  o-op if possible
11b90 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
11ba0 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c  >eFileLock==eFil
11bb0 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74  eLock ){.    ret
11bc0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
11bd0 20 7d 0a 0a 20 20 2f 2a 20 54 6f 20 64 6f 77 6e   }..  /* To down
11be0 67 72 61 64 65 20 74 6f 20 73 68 61 72 65 64 2c  grade to shared,
11bf0 20 73 69 6d 70 6c 79 20 75 70 64 61 74 65 20 6f   simply update o
11c00 75 72 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 74 69  ur internal noti
11c10 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c  on of the.  ** l
11c20 6f 63 6b 20 73 74 61 74 65 2e 20 20 4e 6f 20 6e  ock state.  No n
11c30 65 65 64 20 74 6f 20 6d 65 73 73 20 77 69 74 68  eed to mess with
11c40 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
11c50 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  k..  */.  if( eF
11c60 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
11c70 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  LOCK ){.    pFil
11c80 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
11c90 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
11ca0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11cb0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 6f  ;.  }.  .  /* To
11cc0 20 66 75 6c 6c 79 20 75 6e 6c 6f 63 6b 20 74 68   fully unlock th
11cd0 65 20 64 61 74 61 62 61 73 65 2c 20 64 65 6c 65  e database, dele
11ce0 74 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65  te the lock file
11cf0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 46   */.  assert( eF
11d00 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ileLock==NO_LOCK
11d10 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73 52 6d 64   );.  rc = osRmd
11d20 69 72 28 7a 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20  ir(zLockFile);. 
11d30 20 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20 20   if( rc<0 ){.   
11d40 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
11d50 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 74 45 72  rno;.    if( tEr
11d60 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20  rno==ENOENT ){. 
11d70 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
11d80 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
11d90 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
11da0 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
11db0 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
11dc0 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
11dd0 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  no);.    }.    r
11de0 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20  eturn rc; .  }. 
11df0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
11e00 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72  k = NO_LOCK;.  r
11e10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11e20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
11e30 61 20 66 69 6c 65 2e 20 20 4d 61 6b 65 20 73 75  a file.  Make su
11e40 72 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20  re the lock has 
11e50 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20 62 65  been released be
11e60 66 6f 72 65 20 63 6c 6f 73 69 6e 67 2e 0a 2a 2f  fore closing..*/
11e70 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c  .static int dotl
11e80 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  ockClose(sqlite3
11e90 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 75  _file *id) {.  u
11ea0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
11eb0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
11ec0 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
11ed0 29 3b 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f  );.  dotlockUnlo
11ee0 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  ck(id, NO_LOCK);
11ef0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
11f00 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
11f10 6e 74 65 78 74 29 3b 0a 20 20 72 65 74 75 72 6e  ntext);.  return
11f20 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
11f30 64 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  d);.}./*********
11f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
11f50 20 74 68 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f   the dot-file lo
11f60 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
11f70 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
11f80 2a 2a 2a 2a 2a 0a 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 2a 2a 2a 2a 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 2f 0a 0a 2f 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 2a 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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12020 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
12030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12040 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20 4c 6f  * Begin flock Lo
12050 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
12060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12070 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 65  ******.**.** Use
12080 20 74 68 65 20 66 6c 6f 63 6b 28 29 20 73 79 73   the flock() sys
12090 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64 6f 20 66  tem call to do f
120a0 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a  ile locking..**.
120b0 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69  ** flock() locki
120c0 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d 66  ng is like dot-f
120d0 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74  ile locking in t
120e0 68 61 74 20 74 68 65 20 76 61 72 69 6f 75 73 0a  hat the various.
120f0 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e 20 6c 6f  ** fine-grain lo
12100 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 73 75 70  cking levels sup
12110 70 6f 72 74 65 64 20 62 79 20 53 51 4c 69 74 65  ported by SQLite
12120 20 61 72 65 20 63 6f 6c 6c 61 70 73 65 64 20 69   are collapsed i
12130 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20  nto.** a single 
12140 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20  exclusive lock. 
12150 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
12160 20 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45   SHARED, RESERVE
12170 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e 44 49 4e  D, and.** PENDIN
12180 47 20 6c 6f 63 6b 73 20 61 72 65 20 74 68 65 20  G locks are the 
12190 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20 61 6e  same thing as an
121a0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
121b0 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73 74 69 6c    SQLite.** stil
121c0 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20 79 6f 75  l works when you
121d0 20 64 6f 20 74 68 69 73 2c 20 62 75 74 20 63 6f   do this, but co
121e0 6e 63 75 72 72 65 6e 63 79 20 69 73 20 72 65 64  ncurrency is red
121f0 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a 20 6f 6e  uced since.** on
12200 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63  ly a single proc
12210 65 73 73 20 63 61 6e 20 62 65 20 72 65 61 64 69  ess can be readi
12220 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
12230 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a  at a time..**.**
12240 20 4f 6d 69 74 20 74 68 69 73 20 73 65 63 74 69   Omit this secti
12250 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  on if SQLITE_ENA
12260 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
12270 45 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66 0a  E is turned off.
12280 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  */.#if SQLITE_EN
12290 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
122a0 4c 45 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20  LE../*.** Retry 
122b0 66 6c 6f 63 6b 28 29 20 63 61 6c 6c 73 20 74 68  flock() calls th
122c0 61 74 20 66 61 69 6c 20 77 69 74 68 20 45 49 4e  at fail with EIN
122d0 54 52 0a 2a 2f 0a 23 69 66 64 65 66 20 45 49 4e  TR.*/.#ifdef EIN
122e0 54 52 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f  TR.static int ro
122f0 62 75 73 74 5f 66 6c 6f 63 6b 28 69 6e 74 20 66  bust_flock(int f
12300 64 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 69 6e  d, int op){.  in
12310 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63 20 3d  t rc;.  do{ rc =
12320 20 66 6c 6f 63 6b 28 66 64 2c 6f 70 29 3b 20 7d   flock(fd,op); }
12330 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
12340 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20  rrno==EINTR );. 
12350 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
12360 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 72 6f 62  lse.# define rob
12370 75 73 74 5f 66 6c 6f 63 6b 28 61 2c 62 29 20 66  ust_flock(a,b) f
12380 6c 6f 63 6b 28 61 2c 62 29 0a 23 65 6e 64 69 66  lock(a,b).#endif
12390 0a 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68  .     ../*.** Th
123a0 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
123b0 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
123c0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
123d0 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
123e0 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
123f0 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
12400 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
12410 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
12420 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
12430 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
12440 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
12450 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
12460 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
12470 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
12480 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
12490 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
124a0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
124b0 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
124c0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
124d0 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72   flockCheckReser
124e0 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
124f0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
12500 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72  ResOut){.  int r
12510 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
12520 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
12530 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
12540 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
12550 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d 75 6c  *)id;.  .  Simul
12560 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
12570 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
12580 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
12590 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72  K; );.  .  asser
125a0 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 0a 20  t( pFile );.  . 
125b0 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74   /* Check if a t
125c0 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72  hread in this pr
125d0 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68  ocess holds such
125e0 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28   a lock */.  if(
125f0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
12600 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
12610 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
12620 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f  1;.  }.  .  /* O
12630 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20  therwise see if 
12640 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
12650 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a  ss holds it. */.
12660 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20    if( !reserved 
12670 29 7b 0a 20 20 20 20 2f 2a 20 61 74 74 65 6d 70  ){.    /* attemp
12680 74 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63  t to get the loc
12690 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63  k */.    int lrc
126a0 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28   = robust_flock(
126b0 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45  pFile->h, LOCK_E
126c0 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a 20 20  X | LOCK_NB);.  
126d0 20 20 69 66 28 20 21 6c 72 63 20 29 7b 0a 20 20    if( !lrc ){.  
126e0 20 20 20 20 2f 2a 20 67 6f 74 20 74 68 65 20 6c      /* got the l
126f0 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 2a  ock, unlock it *
12700 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 72 6f  /.      lrc = ro
12710 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65  bust_flock(pFile
12720 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20  ->h, LOCK_UN);. 
12730 20 20 20 20 20 69 66 20 28 20 6c 72 63 20 29 20       if ( lrc ) 
12740 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 45  {.        int tE
12750 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
12760 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20        /* unlock 
12770 66 61 69 6c 65 64 20 77 69 74 68 20 61 6e 20 65  failed with an e
12780 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rror */.        
12790 6c 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45  lrc = SQLITE_IOE
127a0 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20 20  RR_UNLOCK; .    
127b0 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
127c0 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f  no(pFile, tErrno
127d0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
127e0 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  lrc;.      }.   
127f0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
12800 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
12810 6e 6f 3b 0a 20 20 20 20 20 20 72 65 73 65 72 76  no;.      reserv
12820 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a  ed = 1;.      /*
12830 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 69   someone else mi
12840 67 68 74 20 68 61 76 65 20 69 74 20 72 65 73 65  ght have it rese
12850 72 76 65 64 20 2a 2f 0a 20 20 20 20 20 20 6c 72  rved */.      lr
12860 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
12870 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
12880 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
12890 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20  RR_LOCK); .     
128a0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
128b0 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20  OR(lrc) ){.     
128c0 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
128d0 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
128e0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c  ;.        rc = l
128f0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
12900 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  }.  }.  OSTRACE(
12910 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
12920 64 20 25 64 20 25 64 20 28 66 6c 6f 63 6b 29 5c  d %d %d (flock)\
12930 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
12940 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 23  , reserved));..#
12950 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e  ifdef SQLITE_IGN
12960 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
12970 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20  RRORS.  if( (rc 
12980 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20  & SQLITE_IOERR) 
12990 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  == SQLITE_IOERR 
129a0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
129b0 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 65 73 65 72  TE_OK;.    reser
129c0 76 65 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69  ved=1;.  }.#endi
129d0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f  f /* SQLITE_IGNO
129e0 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
129f0 52 4f 52 53 20 2a 2f 0a 20 20 2a 70 52 65 73 4f  RORS */.  *pResO
12a00 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
12a10 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
12a20 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
12a30 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
12a40 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
12a50 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
12a60 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
12a70 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
12a80 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
12a90 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
12aa0 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
12ab0 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
12ac0 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
12ad0 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
12ae0 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
12af0 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
12b00 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
12b10 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
12b20 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
12b30 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
12b40 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
12b50 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
12b60 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
12b70 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
12b80 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
12b90 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
12ba0 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
12bb0 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
12bc0 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
12bd0 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
12be0 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
12bf0 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
12c00 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
12c10 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
12c20 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
12c30 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
12c40 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
12c50 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
12c60 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
12c70 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
12c80 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
12c90 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
12ca0 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
12cb0 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
12cc0 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
12cd0 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20  E.**.** flock() 
12ce0 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70  only really supp
12cf0 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  ort EXCLUSIVE lo
12d00 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69  cks.  We track i
12d10 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c  ntermediate.** l
12d20 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68  ock states in th
12d30 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73  e sqlite3_file s
12d40 74 72 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c  tructure, but al
12d50 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f  l locks SHARED o
12d60 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72  r.** above are r
12d70 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20  eally EXCLUSIVE 
12d80 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64  locks and exclud
12d90 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63  e all other proc
12da0 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63  esses from.** ac
12db0 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a  cess the file..*
12dc0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
12dd0 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72  e will only incr
12de0 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73  ease a lock.  Us
12df0 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55  e the sqlite3OsU
12e00 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  nlock().** routi
12e10 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f  ne to lower a lo
12e20 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  cking level..*/.
12e30 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
12e40 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
12e50 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
12e60 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63  Lock) {.  int rc
12e70 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12e80 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
12e90 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
12ea0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
12eb0 65 20 29 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65  e );..  /* if we
12ec0 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20   already have a 
12ed0 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c  lock, it is excl
12ee0 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75  usive.  .  ** Ju
12ef0 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20  st adjust level 
12f00 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74  and punt on outt
12f10 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20  a here. */.  if 
12f20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
12f30 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20  k > NO_LOCK) {. 
12f40 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
12f50 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
12f60 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
12f70 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
12f80 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75  /* grab an exclu
12f90 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a  sive lock */.  .
12fa0 20 20 69 66 20 28 72 6f 62 75 73 74 5f 66 6c 6f    if (robust_flo
12fb0 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  ck(pFile->h, LOC
12fc0 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29  K_EX | LOCK_NB))
12fd0 20 7b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e   {.    int tErrn
12fe0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 2f  o = errno;.    /
12ff0 2a 20 64 69 64 6e 27 74 20 67 65 74 2c 20 6d 75  * didn't get, mu
13000 73 74 20 62 65 20 62 75 73 79 20 2a 2f 0a 20 20  st be busy */.  
13010 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
13020 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
13030 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
13040 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20  IOERR_LOCK);.   
13050 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
13060 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
13070 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
13080 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
13090 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a     }.  } else {.
130a0 20 20 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73      /* got it, s
130b0 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  et the type and 
130c0 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 20  return ok */.   
130d0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
130e0 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
130f0 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c   }.  OSTRACE(("L
13100 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 20  OCK    %d %s %s 
13110 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c  (flock)\n", pFil
13120 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b  e->h, azFileLock
13130 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20  (eFileLock), .  
13140 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c           rc==SQL
13150 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20  ITE_OK ? "ok" : 
13160 22 66 61 69 6c 65 64 22 29 29 3b 0a 23 69 66 64  "failed"));.#ifd
13170 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  ef SQLITE_IGNORE
13180 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
13190 52 53 0a 20 20 69 66 28 20 28 72 63 20 26 20 53  RS.  if( (rc & S
131a0 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20  QLITE_IOERR) == 
131b0 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a  SQLITE_IOERR ){.
131c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
131d0 42 55 53 59 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BUSY;.  }.#endif
131e0 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52   /* SQLITE_IGNOR
131f0 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52  E_FLOCK_LOCK_ERR
13200 4f 52 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ORS */.  return 
13210 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  rc;.}.../*.** Lo
13220 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
13230 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
13240 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
13250 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
13260 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
13270 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
13280 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
13290 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
132a0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
132b0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
132c0 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
132d0 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
132e0 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
132f0 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
13300 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
13310 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
13320 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71  t flockUnlock(sq
13330 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
13340 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
13350 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
13360 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
13370 69 64 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28  id;.  .  assert(
13380 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
13390 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64  ACE(("UNLOCK  %d
133a0 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25   %d was %d pid=%
133b0 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46  d (flock)\n", pF
133c0 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63  ile->h, eFileLoc
133d0 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  k,.           pF
133e0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20  ile->eFileLock, 
133f0 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20  osGetpid(0)));. 
13400 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
13410 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
13420 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70  );.  .  /* no-op
13430 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
13440 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
13450 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63  leLock==eFileLoc
13460 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  k ){.    return 
13470 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
13480 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61   .  /* shared ca
13490 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62 65  n just be set be
134a0 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73 20  cause we always 
134b0 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76  have an exclusiv
134c0 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c 65  e */.  if (eFile
134d0 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
134e0 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K) {.    pFile->
134f0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
13500 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72  eLock;.    retur
13510 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
13520 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61  .  .  /* no, rea
13530 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a  lly, unlock. */.
13540 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 6c 6f    if( robust_flo
13550 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  ck(pFile->h, LOC
13560 4b 5f 55 4e 29 20 29 7b 0a 23 69 66 64 65 66 20  K_UN) ){.#ifdef 
13570 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
13580 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a  OCK_LOCK_ERRORS.
13590 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
135a0 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  E_OK;.#endif /* 
135b0 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
135c0 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20  OCK_LOCK_ERRORS 
135d0 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
135e0 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
135f0 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
13600 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
13610 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
13620 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13630 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
13640 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a  lose a file..*/.
13650 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
13660 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
13670 6c 65 20 2a 69 64 29 20 7b 0a 20 20 61 73 73 65  le *id) {.  asse
13680 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 66  rt( id!=0 );.  f
13690 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e  lockUnlock(id, N
136a0 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 72 65 74 75 72  O_LOCK);.  retur
136b0 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  n closeUnixFile(
136c0 69 64 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  id);.}..#endif /
136d0 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
136e0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
136f0 20 21 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f 0a 0a   !OS_VXWORK */..
13700 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
13710 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
13720 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70 6c 65  flock lock imple
13730 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
13740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
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 2a 2a 2a 2a 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 2f 0a  **************/.
137a0 0a 2f 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 2a 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 2a 2a 2a 2a 2a  ****************
137e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
137f0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
13800 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
13810 4e 61 6d 65 64 20 53 65 6d 61 70 68 6f 72 65 20  Named Semaphore 
13820 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
13830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13840 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d  .**.** Named sem
13850 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69  aphore locking i
13860 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64  s only supported
13870 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a   on VxWorks..**.
13880 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ** Semaphore loc
13890 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74  king is like dot
138a0 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f 63 6b 20  -lock and flock 
138b0 69 6e 20 74 68 61 74 20 69 74 20 72 65 61 6c 6c  in that it reall
138c0 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70 6f 72  y only.** suppor
138d0 74 73 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ts EXCLUSIVE loc
138e0 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20 61 20 73 69  king.  Only a si
138f0 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e  ngle process can
13900 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 0a 2a   read or write.*
13910 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
13920 69 6c 65 20 61 74 20 61 20 74 69 6d 65 2e 20 20  ile at a time.  
13930 54 68 69 73 20 72 65 64 75 63 65 73 20 70 6f 74  This reduces pot
13940 65 6e 74 69 61 6c 20 63 6f 6e 63 75 72 72 65 6e  ential concurren
13950 63 79 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b 65 73  cy, but.** makes
13960 20 74 68 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d   the lock implem
13970 65 6e 74 61 74 69 6f 6e 20 6d 75 63 68 20 65 61  entation much ea
13980 73 69 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f 53 5f  sier..*/.#if OS_
13990 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54  VXWORKS../*.** T
139a0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
139b0 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
139c0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
139d0 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
139e0 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
139f0 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
13a00 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
13a10 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
13a20 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a  d, set *pResOut.
13a30 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  ** to a non-zero
13a40 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65   value otherwise
13a50 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
13a60 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72   to zero.  The r
13a70 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69  eturn value.** i
13a80 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
13a90 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f  OK unless an I/O
13aa0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
13ab0 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69  ring lock checki
13ac0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
13ad0 74 20 73 65 6d 58 43 68 65 63 6b 52 65 73 65 72  t semXCheckReser
13ae0 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
13af0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
13b00 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20  ResOut) {.  int 
13b10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
13b20 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
13b30 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
13b40 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
13b50 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61  e*)id;..  Simula
13b60 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
13b70 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
13b80 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
13b90 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ; );.  .  assert
13ba0 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a  ( pFile );..  /*
13bb0 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65   Check if a thre
13bc0 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ad in this proce
13bd0 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20  ss holds such a 
13be0 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46  lock */.  if( pF
13bf0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53  ile->eFileLock>S
13c00 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
13c10 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
13c20 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65    }.  .  /* Othe
13c30 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d  rwise see if som
13c40 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
13c50 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69  holds it. */.  i
13c60 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a  f( !reserved ){.
13c70 20 20 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20      sem_t *pSem 
13c80 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  = pFile->pInode-
13c90 3e 70 53 65 6d 3b 0a 0a 20 20 20 20 69 66 28 20  >pSem;..    if( 
13ca0 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d  sem_trywait(pSem
13cb0 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 69  )==-1 ){.      i
13cc0 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
13cd0 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 45 41 47  o;.      if( EAG
13ce0 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b  AIN != tErrno ){
13cf0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
13d00 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
13d10 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
13d20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
13d30 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b  CKRESERVEDLOCK);
13d40 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61  .        storeLa
13d50 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
13d60 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 20  Errno);.      } 
13d70 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 2f  else {.        /
13d80 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 68  * someone else h
13d90 61 73 20 74 68 65 20 6c 6f 63 6b 20 77 68 65 6e  as the lock when
13da0 20 77 65 20 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f   we are in NO_LO
13db0 43 4b 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  CK */.        re
13dc0 73 65 72 76 65 64 20 3d 20 28 70 46 69 6c 65 2d  served = (pFile-
13dd0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 53 48 41  >eFileLock < SHA
13de0 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
13df0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
13e00 20 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64 20      /* we could 
13e10 68 61 76 65 20 69 74 20 69 66 20 77 65 20 77 61  have it if we wa
13e20 6e 74 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 73  nt it */.      s
13e30 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3b 0a 20  em_post(pSem);. 
13e40 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41     }.  }.  OSTRA
13e50 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
13e60 4b 20 25 64 20 25 64 20 25 64 20 28 73 65 6d 29  K %d %d %d (sem)
13e70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
13e80 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a  c, reserved));..
13e90 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
13ea0 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
13eb0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
13ec0 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
13ed0 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
13ee0 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
13ef0 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a  eFileLock - one.
13f00 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
13f10 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
13f20 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
13f30 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
13f40 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
13f50 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
13f60 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
13f70 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
13f80 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
13f90 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
13fa0 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
13fb0 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
13fc0 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
13fd0 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
13fe0 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
13ff0 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
14000 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
14010 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
14020 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
14030 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
14040 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
14050 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
14060 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
14070 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
14080 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
14090 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
140a0 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
140b0 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
140c0 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
140d0 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
140e0 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
140f0 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
14100 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
14110 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
14120 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
14130 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
14140 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
14150 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
14160 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
14170 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20  Semaphore locks 
14180 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70  only really supp
14190 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  ort EXCLUSIVE lo
141a0 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69  cks.  We track i
141b0 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c  ntermediate.** l
141c0 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68  ock states in th
141d0 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73  e sqlite3_file s
141e0 74 72 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c  tructure, but al
141f0 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f  l locks SHARED o
14200 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72  r.** above are r
14210 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20  eally EXCLUSIVE 
14220 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64  locks and exclud
14230 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63  e all other proc
14240 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63  esses from.** ac
14250 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a  cess the file..*
14260 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
14270 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72  e will only incr
14280 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73  ease a lock.  Us
14290 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55  e the sqlite3OsU
142a0 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  nlock().** routi
142b0 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f  ne to lower a lo
142c0 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  cking level..*/.
142d0 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 58 4c  static int semXL
142e0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
142f0 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
14300 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ock) {.  unixFil
14310 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
14320 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f  File*)id;.  sem_
14330 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d  t *pSem = pFile-
14340 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20  >pInode->pSem;. 
14350 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
14360 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65  _OK;..  /* if we
14370 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20   already have a 
14380 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c  lock, it is excl
14390 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75  usive.  .  ** Ju
143a0 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20  st adjust level 
143b0 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74  and punt on outt
143c0 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20  a here. */.  if 
143d0 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
143e0 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20  k > NO_LOCK) {. 
143f0 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
14400 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
14410 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
14420 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65  _OK;.    goto se
14430 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  m_end_lock;.  }.
14440 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20 73 65 6d    .  /* lock sem
14450 61 70 68 6f 72 65 20 6e 6f 77 20 62 75 74 20 62  aphore now but b
14460 61 69 6c 20 6f 75 74 20 77 68 65 6e 20 61 6c 72  ail out when alr
14470 65 61 64 79 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a  eady locked. */.
14480 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69    if( sem_trywai
14490 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20  t(pSem)==-1 ){. 
144a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
144b0 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65  USY;.    goto se
144c0 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  m_end_lock;.  }.
144d0 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65  .  /* got it, se
144e0 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72  t the type and r
144f0 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46  eturn ok */.  pF
14500 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
14510 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 0a 20 73 65   eFileLock;.. se
14520 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65  m_end_lock:.  re
14530 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14540 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
14550 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
14560 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
14570 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
14580 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
14590 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
145a0 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
145b0 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
145c0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
145d0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
145e0 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
145f0 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
14600 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
14610 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
14620 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
14630 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
14640 63 20 69 6e 74 20 73 65 6d 58 55 6e 6c 6f 63 6b  c int semXUnlock
14650 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
14660 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
14670 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
14680 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
14690 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74 20 2a  e*)id;.  sem_t *
146a0 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49  pSem = pFile->pI
146b0 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20 61  node->pSem;..  a
146c0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
146d0 20 20 61 73 73 65 72 74 28 20 70 53 65 6d 20 29    assert( pSem )
146e0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ;.  OSTRACE(("UN
146f0 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20  LOCK  %d %d was 
14700 25 64 20 70 69 64 3d 25 64 20 28 73 65 6d 29 5c  %d pid=%d (sem)\
14710 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46  n", pFile->h, eF
14720 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20  ileLock,.       
14730 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
14740 4c 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64 28 30  Lock, osGetpid(0
14750 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  )));.  assert( e
14760 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  FileLock<=SHARED
14770 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a  _LOCK );.  .  /*
14780 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62   no-op if possib
14790 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  le */.  if( pFil
147a0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46  e->eFileLock==eF
147b0 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72  ileLock ){.    r
147c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
147d0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61  .  }.  .  /* sha
147e0 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20  red can just be 
147f0 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20 61  set because we a
14800 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65 78  lways have an ex
14810 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20  clusive */.  if 
14820 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  (eFileLock==SHAR
14830 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70  ED_LOCK) {.    p
14840 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
14850 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  = eFileLock;.   
14860 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14870 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e  K;.  }.  .  /* n
14880 6f 2c 20 72 65 61 6c 6c 79 20 75 6e 6c 6f 63 6b  o, really unlock
14890 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73 65 6d 5f  . */.  if ( sem_
148a0 70 6f 73 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29  post(pSem)==-1 )
148b0 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 2c 20 74   {.    int rc, t
148c0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
148d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
148e0 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
148f0 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
14900 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a  _IOERR_UNLOCK);.
14910 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
14920 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
14930 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
14940 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
14950 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
14960 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46  rn rc; .  }.  pF
14970 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
14980 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75   NO_LOCK;.  retu
14990 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
149a0 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20  ./*. ** Close a 
149b0 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63  file.. */.static
149c0 20 69 6e 74 20 73 65 6d 58 43 6c 6f 73 65 28 73   int semXClose(s
149d0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
149e0 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20   {.  if( id ){. 
149f0 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69     unixFile *pFi
14a00 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
14a10 69 64 3b 0a 20 20 20 20 73 65 6d 58 55 6e 6c 6f  id;.    semXUnlo
14a20 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  ck(id, NO_LOCK);
14a30 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
14a40 6c 65 20 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e  le );.    unixEn
14a50 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
14a60 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f  releaseInodeInfo
14a70 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 75 6e 69  (pFile);.    uni
14a80 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
14a90 20 20 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65     closeUnixFile
14aa0 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (id);.  }.  retu
14ab0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
14ac0 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
14ad0 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e  WORKS */./*.** N
14ae0 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c  amed semaphore l
14af0 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61  ocking is only a
14b00 76 61 69 6c 61 62 6c 65 20 6f 6e 20 56 78 57 6f  vailable on VxWo
14b10 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  rks..**.********
14b20 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
14b30 68 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f  he named semapho
14b40 72 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  re lock implemen
14b50 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tation *********
14b60 2a 2a 2a 2a 2a 2a 2a 0a 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 2a 2a 2a 2a 2a 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 2f 0a 0a 0a 2f 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 2a 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 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
14c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14c20 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 41 46 50 20  ***** Begin AFP 
14c30 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
14c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
14c60 41 46 50 20 69 73 20 74 68 65 20 41 70 70 6c 65  AFP is the Apple
14c70 20 46 69 6c 69 6e 67 20 50 72 6f 74 6f 63 6f 6c   Filing Protocol
14c80 2e 20 20 41 46 50 20 69 73 20 61 20 6e 65 74 77  .  AFP is a netw
14c90 6f 72 6b 20 66 69 6c 65 73 79 73 74 65 6d 20 66  ork filesystem f
14ca0 6f 75 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65  ound.** on Apple
14cb0 20 4d 61 63 69 6e 74 6f 73 68 20 63 6f 6d 70 75   Macintosh compu
14cc0 74 65 72 73 20 2d 20 62 6f 74 68 20 4f 53 39 20  ters - both OS9 
14cd0 61 6e 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54  and OSX..**.** T
14ce0 68 69 72 64 2d 70 61 72 74 79 20 69 6d 70 6c 65  hird-party imple
14cf0 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 41 46  mentations of AF
14d00 50 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e  P are available.
14d10 20 20 42 75 74 20 74 68 69 73 20 63 6f 64 65 20    But this code 
14d20 68 65 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72  here.** only wor
14d30 6b 73 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23  ks on OSX..*/..#
14d40 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
14d50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
14d60 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
14d70 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  TYLE./*.** The a
14d80 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
14d90 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
14da0 69 6e 73 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b  ins all afp lock
14db0 20 73 70 65 63 69 66 69 63 20 73 74 61 74 65 0a   specific state.
14dc0 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
14dd0 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  t afpLockingCont
14de0 65 78 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ext afpLockingCo
14df0 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20 61 66  ntext;.struct af
14e00 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
14e10 7b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  {.  int reserved
14e20 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
14e30 64 62 50 61 74 68 3b 20 20 20 20 20 20 20 20 20  dbPath;         
14e40 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
14e50 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a  he open file */.
14e60 7d 3b 0a 0a 73 74 72 75 63 74 20 42 79 74 65 52  };..struct ByteR
14e70 61 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20  angeLockPB2.{.  
14e80 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
14e90 6e 67 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20  ng offset;      
14ea0 20 20 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20 66    /* offset to f
14eb0 69 72 73 74 20 62 79 74 65 20 74 6f 20 6c 6f 63  irst byte to loc
14ec0 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  k */.  unsigned 
14ed0 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68  long long length
14ee0 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 62 72 20  ;        /* nbr 
14ef0 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b  of bytes to lock
14f00 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
14f10 6f 6e 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67  ong long retRang
14f20 65 53 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f  eStart; /* nbr o
14f30 66 20 31 73 74 20 62 79 74 65 20 6c 6f 63 6b 65  f 1st byte locke
14f40 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20  d if successful 
14f50 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
14f60 61 72 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20  ar unLockFlag;  
14f70 20 20 20 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e         /* 1 = un
14f80 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a  lock, 0 = lock *
14f90 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
14fa0 72 20 73 74 61 72 74 45 6e 64 46 6c 61 67 3b 20  r startEndFlag; 
14fb0 20 20 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74        /* 1=rel t
14fc0 6f 20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30  o end of fork, 0
14fd0 3d 72 65 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f  =rel to start */
14fe0 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20  .  int fd;      
14ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15000 20 20 20 20 20 2f 2a 20 66 69 6c 65 20 64 65 73       /* file des
15010 63 20 74 6f 20 61 73 73 6f 63 20 74 68 69 73 20  c to assoc this 
15020 6c 6f 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a  lock with */.};.
15030 0a 23 64 65 66 69 6e 65 20 61 66 70 66 73 42 79  .#define afpfsBy
15040 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54  teRangeLock2FSCT
15050 4c 20 20 20 20 20 20 20 20 5f 49 4f 57 52 28 27  L        _IOWR('
15060 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42  z', 23, struct B
15070 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29  yteRangeLockPB2)
15080 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
15090 61 20 75 74 69 6c 69 74 79 20 66 6f 72 20 73 65  a utility for se
150a0 74 74 69 6e 67 20 6f 72 20 63 6c 65 61 72 69 6e  tting or clearin
150b0 67 20 61 20 62 69 74 2d 72 61 6e 67 65 20 6c 6f  g a bit-range lo
150c0 63 6b 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50 20  ck on an.** AFP 
150d0 66 69 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a  filesystem..** .
150e0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
150f0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  _OK on success, 
15100 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 6e 20 66  SQLITE_BUSY on f
15110 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ailure..*/.stati
15120 63 20 69 6e 74 20 61 66 70 53 65 74 4c 6f 63 6b  c int afpSetLock
15130 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
15140 70 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  path,           
15150 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
15160 65 20 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63  e file to be loc
15170 6b 65 64 20 6f 72 20 75 6e 6c 6f 63 6b 65 64 20  ked or unlocked 
15180 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  */.  unixFile *p
15190 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
151a0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65      /* Open file
151b0 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 70   descriptor on p
151c0 61 74 68 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ath */.  unsigne
151d0 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73  d long long offs
151e0 65 74 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74  et,     /* First
151f0 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b   byte to be lock
15200 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ed */.  unsigned
15210 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74   long long lengt
15220 68 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  h,     /* Number
15230 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63   of bytes to loc
15240 6b 20 2a 2f 0a 20 20 69 6e 74 20 73 65 74 4c 6f  k */.  int setLo
15250 63 6b 46 6c 61 67 20 20 20 20 20 20 20 20 20 20  ckFlag          
15260 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
15270 20 73 65 74 20 6c 6f 63 6b 2e 20 20 46 61 6c 73   set lock.  Fals
15280 65 20 74 6f 20 63 6c 65 61 72 20 6c 6f 63 6b 20  e to clear lock 
15290 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 42  */.){.  struct B
152a0 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20  yteRangeLockPB2 
152b0 70 62 3b 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20  pb;.  int err;. 
152c0 20 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61   .  pb.unLockFla
152d0 67 20 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20  g = setLockFlag 
152e0 3f 20 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74  ? 0 : 1;.  pb.st
152f0 61 72 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a  artEndFlag = 0;.
15300 20 20 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66    pb.offset = of
15310 66 73 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74  fset;.  pb.lengt
15320 68 20 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70  h = length; .  p
15330 62 2e 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b  b.fd = pFile->h;
15340 0a 20 20 0a 20 20 4f 53 54 52 41 43 45 28 28 22  .  .  OSTRACE(("
15350 41 46 50 53 45 54 4c 4f 43 4b 20 5b 25 73 5d 20  AFPSETLOCK [%s] 
15360 66 6f 72 20 25 64 25 73 20 69 6e 20 72 61 6e 67  for %d%s in rang
15370 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20  e %llx:%llx\n", 
15380 0a 20 20 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61  .    (setLockFla
15390 67 3f 22 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 70  g?"ON":"OFF"), p
153a0 46 69 6c 65 2d 3e 68 2c 20 28 70 62 2e 66 64 3d  File->h, (pb.fd=
153b0 3d 2d 31 3f 22 5b 74 65 73 74 76 61 6c 2d 31 5d  =-1?"[testval-1]
153c0 22 3a 22 22 29 2c 0a 20 20 20 20 6f 66 66 73 65  ":""),.    offse
153d0 74 2c 20 6c 65 6e 67 74 68 29 29 3b 0a 20 20 65  t, length));.  e
153e0 72 72 20 3d 20 66 73 63 74 6c 28 70 61 74 68 2c  rr = fsctl(path,
153f0 20 61 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c   afpfsByteRangeL
15400 6f 63 6b 32 46 53 43 54 4c 2c 20 26 70 62 2c 20  ock2FSCTL, &pb, 
15410 30 29 3b 0a 20 20 69 66 20 28 20 65 72 72 3d 3d  0);.  if ( err==
15420 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72  -1 ) {.    int r
15430 63 3b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e  c;.    int tErrn
15440 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 4f  o = errno;.    O
15450 53 54 52 41 43 45 28 28 22 41 46 50 53 45 54 4c  STRACE(("AFPSETL
15460 4f 43 4b 20 66 61 69 6c 65 64 20 74 6f 20 66 73  OCK failed to fs
15470 63 74 6c 28 29 20 27 25 73 27 20 25 64 20 25 73  ctl() '%s' %d %s
15480 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
15490 20 20 70 61 74 68 2c 20 74 45 72 72 6e 6f 2c 20    path, tErrno, 
154a0 73 74 72 65 72 72 6f 72 28 74 45 72 72 6e 6f 29  strerror(tErrno)
154b0 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ));.#ifdef SQLIT
154c0 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43  E_IGNORE_AFP_LOC
154d0 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 72 63 20  K_ERRORS.    rc 
154e0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 23  = SQLITE_BUSY;.#
154f0 65 6c 73 65 0a 20 20 20 20 72 63 20 3d 20 73 71  else.    rc = sq
15500 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
15510 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 0a  ixError(tErrno,.
15520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15530 20 20 20 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20      setLockFlag 
15540 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  ? SQLITE_IOERR_L
15550 4f 43 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45  OCK : SQLITE_IOE
15560 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64  RR_UNLOCK);.#end
15570 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e  if /* SQLITE_IGN
15580 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52  ORE_AFP_LOCK_ERR
15590 4f 52 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 49  ORS */.    if( I
155a0 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
155b0 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c   ){.      storeL
155c0 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
155d0 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20  tErrno);.    }. 
155e0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
155f0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74  } else {.    ret
15600 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
15610 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
15620 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
15630 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
15640 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
15650 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
15660 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
15670 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
15680 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
15690 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
156a0 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
156b0 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
156c0 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
156d0 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
156e0 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
156f0 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
15700 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
15710 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
15720 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
15730 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
15740 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
15750 66 70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  fpCheckReservedL
15760 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
15770 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f   *id, int *pResO
15780 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ut){.  int rc = 
15790 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
157a0 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20   reserved = 0;. 
157b0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
157c0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
157d0 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ;.  afpLockingCo
157e0 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 3b 0a  ntext *context;.
157f0 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45    .  SimulateIOE
15800 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
15810 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
15820 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a  ESERVEDLOCK; );.
15830 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
15840 6c 65 20 29 3b 0a 20 20 63 6f 6e 74 65 78 74 20  le );.  context 
15850 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  = (afpLockingCon
15860 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c  text *) pFile->l
15870 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
15880 20 69 66 28 20 63 6f 6e 74 65 78 74 2d 3e 72 65   if( context->re
15890 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2a 70  served ){.    *p
158a0 52 65 73 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20  ResOut = 1;.    
158b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
158c0 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65  ;.  }.  unixEnte
158d0 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63  rMutex(); /* Bec
158e0 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ause pFile->pIno
158f0 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72  de is shared acr
15900 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 20  oss threads */. 
15910 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20   .  /* Check if 
15920 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
15930 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
15940 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
15950 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  if( pFile->pInod
15960 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
15970 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
15980 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
15990 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77  }.  .  /* Otherw
159a0 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20  ise see if some 
159b0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f  other process ho
159c0 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20 20  lds it..   */.  
159d0 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b  if( !reserved ){
159e0 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b 20 74 68 65  .    /* lock the
159f0 20 52 45 53 45 52 56 45 44 20 62 79 74 65 20 2a   RESERVED byte *
15a00 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20  /.    int lrc = 
15a10 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
15a20 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
15a30 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  e, RESERVED_BYTE
15a40 2c 20 31 2c 31 29 3b 20 20 0a 20 20 20 20 69 66  , 1,1);  .    if
15a50 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63  ( SQLITE_OK==lrc
15a60 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20   ){.      /* if 
15a70 77 65 20 73 75 63 63 65 65 64 65 64 20 69 6e 20  we succeeded in 
15a80 74 61 6b 69 6e 67 20 74 68 65 20 72 65 73 65 72  taking the reser
15a90 76 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b  ved lock, unlock
15aa0 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65 0a 20   it to restore. 
15ab0 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67       ** the orig
15ac0 69 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20  inal state */.  
15ad0 20 20 20 20 6c 72 63 20 3d 20 61 66 70 53 65 74      lrc = afpSet
15ae0 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
15af0 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53  Path, pFile, RES
15b00 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30  ERVED_BYTE, 1, 0
15b10 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
15b20 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 66        /* if we f
15b30 61 69 6c 65 64 20 74 6f 20 67 65 74 20 74 68 65  ailed to get the
15b40 20 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65 6f   lock then someo
15b50 6e 65 20 65 6c 73 65 20 6d 75 73 74 20 68 61 76  ne else must hav
15b60 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 72 65  e it */.      re
15b70 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20  served = 1;.    
15b80 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  }.    if( IS_LOC
15b90 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a  K_ERROR(lrc) ){.
15ba0 20 20 20 20 20 20 72 63 3d 6c 72 63 3b 0a 20 20        rc=lrc;.  
15bb0 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69    }.  }.  .  uni
15bc0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
15bd0 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20   OSTRACE(("TEST 
15be0 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64  WR-LOCK %d %d %d
15bf0 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65   (afp)\n", pFile
15c00 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
15c10 64 29 29 3b 0a 20 20 0a 20 20 2a 70 52 65 73 4f  d));.  .  *pResO
15c20 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
15c30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
15c40 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
15c50 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
15c60 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
15c70 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
15c80 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
15c90 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
15ca0 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
15cb0 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
15cc0 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
15cd0 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
15ce0 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
15cf0 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
15d00 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
15d10 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
15d20 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
15d30 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
15d40 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
15d50 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
15d60 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
15d70 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
15d80 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
15d90 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
15da0 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
15db0 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
15dc0 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
15dd0 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
15de0 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
15df0 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
15e00 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
15e10 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
15e20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
15e30 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
15e40 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
15e50 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
15e60 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
15e70 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
15e80 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
15e90 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
15ea0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
15eb0 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
15ec0 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
15ed0 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
15ee0 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
15ef0 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
15f00 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
15f10 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
15f20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
15f30 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
15f40 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
15f50 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
15f60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
15f70 70 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  pLock(sqlite3_fi
15f80 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
15f90 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63  eLock){.  int rc
15fa0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
15fb0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
15fc0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
15fd0 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
15fe0 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
15ff0 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c  ->pInode;.  afpL
16000 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63  ockingContext *c
16010 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63  ontext = (afpLoc
16020 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70  kingContext *) p
16030 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
16040 74 65 78 74 3b 0a 20 20 0a 20 20 61 73 73 65 72  text;.  .  asser
16050 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
16060 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
16070 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73 2c  %d %s was %s(%s,
16080 25 64 29 20 70 69 64 3d 25 64 20 28 61 66 70 29  %d) pid=%d (afp)
16090 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
160a0 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65            azFile
160b0 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c  Lock(eFileLock),
160c0 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c   azFileLock(pFil
160d0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20  e->eFileLock),. 
160e0 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65            azFile
160f0 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46 69  Lock(pInode->eFi
16100 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65 2d  leLock), pInode-
16110 3e 6e 53 68 61 72 65 64 20 2c 20 6f 73 47 65 74  >nShared , osGet
16120 70 69 64 28 30 29 29 29 3b 0a 0a 20 20 2f 2a 20  pid(0)));..  /* 
16130 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  If there is alre
16140 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68  ady a lock of th
16150 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20  is type or more 
16160 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74  restrictive on t
16170 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65  he.  ** unixFile
16180 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f  , do nothing. Do
16190 6e 27 74 20 75 73 65 20 74 68 65 20 61 66 70 5f  n't use the afp_
161a0 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70  end_lock: exit p
161b0 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69  ath, as.  ** uni
161c0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61  xEnterMutex() ha
161d0 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64  sn't been called
161e0 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   yet..  */.  if(
161f0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
16200 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a  k>=eFileLock ){.
16210 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f      OSTRACE(("LO
16220 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28  CK    %d %s ok (
16230 61 6c 72 65 61 64 79 20 68 65 6c 64 29 20 28 61  already held) (a
16240 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  fp)\n", pFile->h
16250 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46  ,.           azF
16260 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
16270 6b 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  k)));.    return
16280 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
16290 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
162a0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75  the locking sequ
162b0 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a  ence is correct.
162c0 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76    **  (1) We nev
162d0 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c  er move from unl
162e0 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e  ocked to anythin
162f0 67 20 68 69 67 68 65 72 20 74 68 61 6e 20 73 68  g higher than sh
16300 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ared lock..  ** 
16310 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65   (2) SQLite neve
16320 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71  r explicitly req
16330 75 65 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c  uests a pendig l
16340 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41  ock..  **  (3) A
16350 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20   shared lock is 
16360 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e  always held when
16370 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20   a reserve lock 
16380 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20  is requested..  
16390 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  */.  assert( pFi
163a0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e  le->eFileLock!=N
163b0 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c  O_LOCK || eFileL
163c0 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
163d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46   );.  assert( eF
163e0 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47  ileLock!=PENDING
163f0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
16400 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45  t( eFileLock!=RE
16410 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SERVED_LOCK || p
16420 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
16430 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
16440 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74    .  /* This mut
16450 65 78 20 69 73 20 6e 65 65 64 65 64 20 62 65 63  ex is needed bec
16460 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ause pFile->pIno
16470 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72  de is shared acr
16480 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f  oss threads.  */
16490 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
164a0 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20  x();.  pInode = 
164b0 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a  pFile->pInode;..
164c0 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72    /* If some thr
164d0 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50  ead using this P
164e0 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69  ID has a lock vi
164f0 61 20 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e  a a different un
16500 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e  ixFile*.  ** han
16510 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75 64  dle that preclud
16520 65 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64  es the requested
16530 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55   lock, return BU
16540 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  SY..  */.  if( (
16550 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
16560 21 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  !=pInode->eFileL
16570 6f 63 6b 20 26 26 20 0a 20 20 20 20 20 20 20 28  ock && .       (
16580 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
16590 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  k>=PENDING_LOCK 
165a0 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  || eFileLock>SHA
165b0 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 20 20 20  RED_LOCK)).     
165c0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
165d0 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74  TE_BUSY;.    got
165e0 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
165f0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61    }.  .  /* If a
16600 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20   SHARED lock is 
16610 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73  requested, and s
16620 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67  ome thread using
16630 20 74 68 69 73 20 50 49 44 20 61 6c 72 65 61 64   this PID alread
16640 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41  y.  ** has a SHA
16650 52 45 44 20 6f 72 20 52 45 53 45 52 56 45 44 20  RED or RESERVED 
16660 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65  lock, then incre
16670 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63  ment reference c
16680 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72  ounts and.  ** r
16690 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
166a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c  .  */.  if( eFil
166b0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
166c0 43 4b 20 26 26 20 0a 20 20 20 20 20 28 70 49 6e  CK && .     (pIn
166d0 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
166e0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SHARED_LOCK || p
166f0 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
16700 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  ==RESERVED_LOCK)
16710 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
16720 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
16730 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73  D_LOCK );.    as
16740 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69  sert( pFile->eFi
16750 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20  leLock==0 );.   
16760 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
16770 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a 20 20  >nShared>0 );.  
16780 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
16790 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
167a0 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53  ;.    pInode->nS
167b0 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e  hared++;.    pIn
167c0 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20  ode->nLock++;.  
167d0 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c    goto afp_end_l
167e0 6f 63 6b 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20  ock;.  }.    .  
167f0 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63  /* A PENDING loc
16800 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f  k is needed befo
16810 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53  re acquiring a S
16820 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62  HARED lock and b
16830 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69  efore.  ** acqui
16840 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56  ring an EXCLUSIV
16850 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65  E lock.  For the
16860 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
16870 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20  e PENDING will. 
16880 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e   ** be released.
16890 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c  .  */.  if( eFil
168a0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
168b0 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46  CK .      || (eF
168c0 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
168d0 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65  VE_LOCK && pFile
168e0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44  ->eFileLock<PEND
168f0 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20  ING_LOCK).  ){. 
16900 20 20 20 69 6e 74 20 66 61 69 6c 65 64 3b 0a 20     int failed;. 
16910 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53     failed = afpS
16920 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
16930 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50  dbPath, pFile, P
16940 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20  ENDING_BYTE, 1, 
16950 31 29 3b 0a 20 20 20 20 69 66 20 28 66 61 69 6c  1);.    if (fail
16960 65 64 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  ed) {.      rc =
16970 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 67   failed;.      g
16980 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  oto afp_end_lock
16990 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
169a0 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67   /* If control g
169b0 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  ets to this poin
169c0 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79  t, then actually
169d0 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61   go ahead and ma
169e0 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e  ke.  ** operatin
169f0 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66  g system calls f
16a00 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64  or the specified
16a10 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66   lock..  */.  if
16a20 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
16a30 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
16a40 69 6e 74 20 6c 72 63 31 2c 20 6c 72 63 32 2c 20  int lrc1, lrc2, 
16a50 6c 72 63 31 45 72 72 6e 6f 20 3d 20 30 3b 0a 20  lrc1Errno = 0;. 
16a60 20 20 20 6c 6f 6e 67 20 6c 6b 2c 20 6d 61 73 6b     long lk, mask
16a70 3b 0a 20 20 20 20 0a 20 20 20 20 61 73 73 65 72  ;.    .    asser
16a80 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  t( pInode->nShar
16a90 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ed==0 );.    ass
16aa0 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69  ert( pInode->eFi
16ab0 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20  leLock==0 );.   
16ac0 20 20 20 20 20 0a 20 20 20 20 6d 61 73 6b 20 3d       .    mask =
16ad0 20 28 73 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d   (sizeof(long)==
16ae0 38 29 20 3f 20 4c 41 52 47 45 53 54 5f 49 4e 54  8) ? LARGEST_INT
16af0 36 34 20 3a 20 30 78 37 66 66 66 66 66 66 66 3b  64 : 0x7fffffff;
16b00 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20  .    /* Now get 
16b10 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48  the read-lock SH
16b20 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20  ARED_LOCK */.   
16b30 20 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20 74 68   /* note that th
16b40 65 20 71 75 61 6c 69 74 79 20 6f 66 20 74 68 65  e quality of the
16b50 20 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73   randomness does
16b60 6e 27 74 20 6d 61 74 74 65 72 20 74 68 61 74 20  n't matter that 
16b70 6d 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d  much */.    lk =
16b80 20 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20   random(); .    
16b90 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
16ba0 74 65 20 3d 20 28 6c 6b 20 26 20 6d 61 73 6b 29  te = (lk & mask)
16bb0 25 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20  %(SHARED_SIZE - 
16bc0 31 29 3b 0a 20 20 20 20 6c 72 63 31 20 3d 20 61  1);.    lrc1 = a
16bd0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
16be0 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
16bf0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53 48 41  , .          SHA
16c00 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65  RED_FIRST+pInode
16c10 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c  ->sharedByte, 1,
16c20 20 31 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f   1);.    if( IS_
16c30 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29  LOCK_ERROR(lrc1)
16c40 20 29 7b 0a 20 20 20 20 20 20 6c 72 63 31 45 72   ){.      lrc1Er
16c50 72 6e 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73  rno = pFile->las
16c60 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  tErrno;.    }.  
16c70 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65    /* Drop the te
16c80 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20  mporary PENDING 
16c90 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32  lock */.    lrc2
16ca0 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
16cb0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
16cc0 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59  File, PENDING_BY
16cd0 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a  TE, 1, 0);.    .
16ce0 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
16cf0 45 52 52 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a  ERROR(lrc1) ) {.
16d00 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
16d10 72 72 6e 6f 28 70 46 69 6c 65 2c 20 6c 72 63 31  rrno(pFile, lrc1
16d20 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63  Errno);.      rc
16d30 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 20 20 67   = lrc1;.      g
16d40 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  oto afp_end_lock
16d50 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28  ;.    } else if(
16d60 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
16d70 72 63 32 29 20 29 7b 0a 20 20 20 20 20 20 72 63  rc2) ){.      rc
16d80 20 3d 20 6c 72 63 32 3b 0a 20 20 20 20 20 20 67   = lrc2;.      g
16d90 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  oto afp_end_lock
16da0 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28  ;.    } else if(
16db0 20 6c 72 63 31 20 21 3d 20 53 51 4c 49 54 45 5f   lrc1 != SQLITE_
16dc0 4f 4b 20 29 20 7b 0a 20 20 20 20 20 20 72 63 20  OK ) {.      rc 
16dd0 3d 20 6c 72 63 31 3b 0a 20 20 20 20 7d 20 65 6c  = lrc1;.    } el
16de0 73 65 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  se {.      pFile
16df0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
16e00 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  ARED_LOCK;.     
16e10 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b   pInode->nLock++
16e20 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ;.      pInode->
16e30 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20  nShared = 1;.   
16e40 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65   }.  }else if( e
16e50 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
16e60 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f  IVE_LOCK && pIno
16e70 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b  de->nShared>1 ){
16e80 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74  .    /* We are t
16e90 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63  rying for an exc
16ea0 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20  lusive lock but 
16eb0 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 69  another thread i
16ec0 6e 20 74 68 69 73 0a 20 20 20 20 20 2a 2a 20 73  n this.     ** s
16ed0 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20 73  ame process is s
16ee0 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73  till holding a s
16ef0 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20  hared lock. */. 
16f00 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
16f10 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  USY;.  }else{.  
16f20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
16f30 20 77 61 73 20 66 6f 72 20 61 20 52 45 53 45 52   was for a RESER
16f40 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
16f50 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20   lock.  It is.  
16f60 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61    ** assumed tha
16f70 74 20 74 68 65 72 65 20 69 73 20 61 20 53 48 41  t there is a SHA
16f80 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  RED or greater l
16f90 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a  ock on the file.
16fa0 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a      ** already..
16fb0 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66      */.    int f
16fc0 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 61  ailed = 0;.    a
16fd0 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d  ssert( 0!=pFile-
16fe0 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20  >eFileLock );.  
16ff0 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 20    if (eFileLock 
17000 3e 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  >= RESERVED_LOCK
17010 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
17020 4c 6f 63 6b 20 3c 20 52 45 53 45 52 56 45 44 5f  Lock < RESERVED_
17030 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 20 20  LOCK) {.        
17040 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52 45 53  /* Acquire a RES
17050 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20 20  ERVED lock */.  
17060 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61        failed = a
17070 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
17080 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
17090 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
170a0 20 31 2c 31 29 3b 0a 20 20 20 20 20 20 69 66 28   1,1);.      if(
170b0 20 21 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20   !failed ){.    
170c0 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73      context->res
170d0 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  erved = 1;.     
170e0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20   }.    }.    if 
170f0 28 21 66 61 69 6c 65 64 20 26 26 20 65 46 69 6c  (!failed && eFil
17100 65 4c 6f 63 6b 20 3d 3d 20 45 58 43 4c 55 53 49  eLock == EXCLUSI
17110 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20  VE_LOCK) {.     
17120 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45   /* Acquire an E
17130 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 2a 2f  XCLUSIVE lock */
17140 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20  .        .      
17150 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 68  /* Remove the sh
17160 61 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f 72 65  ared lock before
17170 20 74 72 79 69 6e 67 20 74 68 65 20 72 61 6e 67   trying the rang
17180 65 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64 20 74  e.  we'll need t
17190 6f 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 65 73  o .      ** rees
171a0 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72  tablish the shar
171b0 65 64 20 6c 6f 63 6b 20 69 66 20 77 65 20 63 61  ed lock if we ca
171c0 6e 27 74 20 67 65 74 20 74 68 65 20 20 61 66 70  n't get the  afp
171d0 55 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 2a 2f 0a  Unlock.      */.
171e0 20 20 20 20 20 20 69 66 28 20 21 28 66 61 69 6c        if( !(fail
171f0 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  ed = afpSetLock(
17200 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
17210 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46   pFile, SHARED_F
17220 49 52 53 54 20 2b 0a 20 20 20 20 20 20 20 20 20  IRST +.         
17230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17240 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
17250 74 65 2c 20 31 2c 20 30 29 29 20 29 7b 0a 20 20  te, 1, 0)) ){.  
17260 20 20 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64        int failed
17270 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  2 = SQLITE_OK;. 
17280 20 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61 74         /* now at
17290 74 65 6d 6d 70 74 20 74 6f 20 67 65 74 20 74 68  temmpt to get th
172a0 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
172b0 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20   range */.      
172c0 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65    failed = afpSe
172d0 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
172e0 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48  bPath, pFile, SH
172f0 41 52 45 44 5f 46 49 52 53 54 2c 20 0a 20 20 20  ARED_FIRST, .   
17300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17310 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52              SHAR
17320 45 44 5f 53 49 5a 45 2c 20 31 29 3b 0a 20 20 20  ED_SIZE, 1);.   
17330 20 20 20 20 20 69 66 28 20 66 61 69 6c 65 64 20       if( failed 
17340 26 26 20 28 66 61 69 6c 65 64 32 20 3d 20 61 66  && (failed2 = af
17350 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
17360 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
17370 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
17380 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f           SHARED_
17390 46 49 52 53 54 20 2b 20 70 49 6e 6f 64 65 2d 3e  FIRST + pInode->
173a0 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31  sharedByte, 1, 1
173b0 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  )) ){.          
173c0 2f 2a 20 43 61 6e 27 74 20 72 65 65 73 74 61 62  /* Can't reestab
173d0 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20  lish the shared 
173e0 6c 6f 63 6b 2e 20 20 53 71 6c 69 74 65 20 63 61  lock.  Sqlite ca
173f0 6e 27 74 20 64 65 61 6c 2c 20 74 68 69 73 20 69  n't deal, this i
17400 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  s.          ** a
17410 20 63 72 69 74 69 63 61 6c 20 49 2f 4f 20 65 72   critical I/O er
17420 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ror.          */
17430 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
17440 28 28 66 61 69 6c 65 64 20 26 20 53 51 4c 49 54  ((failed & SQLIT
17450 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49  E_IOERR) == SQLI
17460 54 45 5f 49 4f 45 52 52 29 20 3f 20 66 61 69 6c  TE_IOERR) ? fail
17470 65 64 32 20 3a 20 0a 20 20 20 20 20 20 20 20 20  ed2 : .         
17480 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45        SQLITE_IOE
17490 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  RR_LOCK;.       
174a0 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
174b0 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 20  lock;.        } 
174c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
174d0 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65        rc = faile
174e0 64 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  d; .      }.    
174f0 7d 0a 20 20 20 20 69 66 28 20 66 61 69 6c 65 64  }.    if( failed
17500 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66   ){.      rc = f
17510 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d  ailed;.    }.  }
17520 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  .  .  if( rc==SQ
17530 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
17540 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
17550 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  = eFileLock;.   
17560 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
17570 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
17580 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c    }else if( eFil
17590 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
175a0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69  _LOCK ){.    pFi
175b0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
175c0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20  PENDING_LOCK;.  
175d0 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
175e0 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ock = PENDING_LO
175f0 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70 5f 65  CK;.  }.  .afp_e
17600 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c  nd_lock:.  unixL
17610 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f  eaveMutex();.  O
17620 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
17630 20 25 64 20 25 73 20 25 73 20 28 61 66 70 29 5c   %d %s %s (afp)\
17640 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a  n", pFile->h, az
17650 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f  FileLock(eFileLo
17660 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20 20 72  ck), .         r
17670 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22  c==SQLITE_OK ? "
17680 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
17690 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
176a0 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
176b0 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
176c0 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
176d0 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
176e0 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
176f0 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  k.** must be eit
17700 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
17710 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
17720 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
17730 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
17740 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
17750 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
17760 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
17770 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
17780 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
17790 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
177a0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 55  .static int afpU
177b0 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
177c0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
177d0 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72  eLock) {.  int r
177e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
177f0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
17800 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
17810 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ;.  unixInodeInf
17820 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70  o *pInode;.  afp
17830 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
17840 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f  context = (afpLo
17850 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20  ckingContext *) 
17860 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
17870 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 73 6b 69  ntext;.  int ski
17880 70 53 68 61 72 65 64 20 3d 20 30 3b 0a 23 69 66  pShared = 0;.#if
17890 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
178a0 20 20 69 6e 74 20 68 20 3d 20 70 46 69 6c 65 2d    int h = pFile-
178b0 3e 68 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  >h;.#endif..  as
178c0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
178d0 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43   OSTRACE(("UNLOC
178e0 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64 28  K  %d %d was %d(
178f0 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61  %d,%d) pid=%d (a
17900 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  fp)\n", pFile->h
17910 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20  , eFileLock,.   
17920 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
17930 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d  FileLock, pFile-
17940 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  >pInode->eFileLo
17950 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  ck, pFile->pInod
17960 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20  e->nShared,.    
17970 20 20 20 20 20 20 20 6f 73 47 65 74 70 69 64 28         osGetpid(
17980 30 29 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  0)));..  assert(
17990 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52   eFileLock<=SHAR
179a0 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28  ED_LOCK );.  if(
179b0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
179c0 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a  k<=eFileLock ){.
179d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
179e0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78  E_OK;.  }.  unix
179f0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
17a00 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
17a10 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74  pInode;.  assert
17a20 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
17a30 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46  d!=0 );.  if( pF
17a40 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53  ile->eFileLock>S
17a50 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
17a60 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
17a70 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69  ->eFileLock==pFi
17a80 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b  le->eFileLock );
17a90 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
17aa0 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
17ab0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
17ac0 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20  or( h=(-1) ).   
17ad0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
17ae0 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 0a  Benign(0);.    .
17af0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
17b00 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20  BUG.    /* When 
17b10 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20  reducing a lock 
17b20 73 75 63 68 20 74 68 61 74 20 6f 74 68 65 72 20  such that other 
17b30 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74  processes can st
17b40 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69  art.    ** readi
17b50 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
17b60 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65  file again, make
17b70 20 73 75 72 65 20 74 68 61 74 20 74 68 65 0a 20   sure that the. 
17b80 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
17b90 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70  n counter was up
17ba0 64 61 74 65 64 20 69 66 20 61 6e 79 20 70 61 72  dated if any par
17bb0 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
17bc0 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68  e.    ** file ch
17bd0 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74  anged.  If the t
17be0 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
17bf0 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65  er is not update
17c00 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  d,.    ** other 
17c10 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74  connections to t
17c20 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67  he same file mig
17c30 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74  ht not realize t
17c40 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66  hat.    ** the f
17c50 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64 20  ile has changed 
17c60 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20  and hence might 
17c70 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73  not know to flus
17c80 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63  h their.    ** c
17c90 61 63 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f  ache.  The use o
17ca0 66 20 61 20 73 74 61 6c 65 20 63 61 63 68 65 20  f a stale cache 
17cb0 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61  can lead to data
17cc0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
17cd0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
17ce0 72 74 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72  rt( pFile->inNor
17cf0 6d 61 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20 20  malWrite==0.    
17d00 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d         || pFile-
17d10 3e 64 62 55 70 64 61 74 65 3d 3d 30 0a 20 20 20  >dbUpdate==0.   
17d20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65          || pFile
17d30 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d  ->transCntrChng=
17d40 3d 31 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  =1 );.    pFile-
17d50 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d  >inNormalWrite =
17d60 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a   0;.#endif.    .
17d70 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65      if( pFile->e
17d80 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
17d90 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  IVE_LOCK ){.    
17da0 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63    rc = afpSetLoc
17db0 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
17dc0 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44  h, pFile, SHARED
17dd0 5f 46 49 52 53 54 2c 20 53 48 41 52 45 44 5f 53  _FIRST, SHARED_S
17de0 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  IZE, 0);.      i
17df0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
17e00 20 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d   && (eFileLock==
17e10 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SHARED_LOCK || p
17e20 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31  Inode->nShared>1
17e30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
17e40 6f 6e 6c 79 20 72 65 2d 65 73 74 61 62 6c 69 73  only re-establis
17e50 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  h the shared loc
17e60 6b 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a  k if necessary *
17e70 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 68  /.        int sh
17e80 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53  aredLockByte = S
17e90 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f  HARED_FIRST+pIno
17ea0 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a  de->sharedByte;.
17eb0 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 66 70          rc = afp
17ec0 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
17ed0 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
17ee0 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20  sharedLockByte, 
17ef0 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 20 65  1, 1);.      } e
17f00 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73 6b  lse {.        sk
17f10 69 70 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20  ipShared = 1;.  
17f20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
17f30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17f40 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c  K && pFile->eFil
17f50 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c  eLock>=PENDING_L
17f60 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  OCK ){.      rc 
17f70 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
17f80 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
17f90 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ile, PENDING_BYT
17fa0 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20  E, 1, 0);.    } 
17fb0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
17fc0 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d  ITE_OK && pFile-
17fd0 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 52 45 53 45  >eFileLock>=RESE
17fe0 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 63 6f 6e  RVED_LOCK && con
17ff0 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29  text->reserved )
18000 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66 70  {.      rc = afp
18010 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
18020 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
18030 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31  RESERVED_BYTE, 1
18040 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
18050 21 72 63 20 29 7b 20 0a 20 20 20 20 20 20 20 20  !rc ){ .        
18060 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65  context->reserve
18070 64 20 3d 20 30 3b 20 0a 20 20 20 20 20 20 7d 0a  d = 0; .      }.
18080 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
18090 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28  ==SQLITE_OK && (
180a0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
180b0 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65  D_LOCK || pInode
180c0 2d 3e 6e 53 68 61 72 65 64 3e 31 29 29 7b 0a 20  ->nShared>1)){. 
180d0 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69       pInode->eFi
180e0 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
180f0 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  LOCK;.    }.  }.
18100 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18110 5f 4f 4b 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b  _OK && eFileLock
18120 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20  ==NO_LOCK ){..  
18130 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
18140 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63  he shared lock c
18150 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65  ounter.  Release
18160 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20   the lock using 
18170 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c  an.    ** OS cal
18180 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20  l only when all 
18190 74 68 72 65 61 64 73 20 69 6e 20 74 68 69 73 20  threads in this 
181a0 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76  same process hav
181b0 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a  e released.    *
181c0 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20  * the lock..    
181d0 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  */.    unsigned 
181e0 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64  long long shared
181f0 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45  LockByte = SHARE
18200 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e  D_FIRST+pInode->
18210 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20  sharedByte;.    
18220 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d  pInode->nShared-
18230 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64  -;.    if( pInod
18240 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b  e->nShared==0 ){
18250 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
18260 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
18270 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
18280 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29  OError( h=(-1) )
18290 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
182a0 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
182b0 0a 20 20 20 20 20 20 69 66 28 20 21 73 6b 69 70  .      if( !skip
182c0 53 68 61 72 65 64 20 29 7b 0a 20 20 20 20 20 20  Shared ){.      
182d0 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63    rc = afpSetLoc
182e0 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
182f0 68 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64  h, pFile, shared
18300 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b  LockByte, 1, 0);
18310 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
18320 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20  f( !rc ){.      
18330 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
18340 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
18350 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46         pFile->eF
18360 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
18370 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
18380 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
18390 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
183a0 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b  pInode->nLock--;
183b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
183c0 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20  Inode->nLock>=0 
183d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e  );.      if( pIn
183e0 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b  ode->nLock==0 ){
183f0 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 50 65  .        closePe
18400 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b  ndingFds(pFile);
18410 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18420 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76   }.  .  unixLeav
18430 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20  eMutex();.  if( 
18440 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
18450 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
18460 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
18470 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
18480 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
18490 20 26 20 63 6c 65 61 6e 75 70 20 41 46 50 20 73   & cleanup AFP s
184a0 70 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20  pecific locking 
184b0 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73 74 61 74  context .*/.stat
184c0 69 63 20 69 6e 74 20 61 66 70 43 6c 6f 73 65 28  ic int afpClose(
184d0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
184e0 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
184f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
18500 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
18510 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61  nixFile*)id;.  a
18520 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
18530 20 20 61 66 70 55 6e 6c 6f 63 6b 28 69 64 2c 20    afpUnlock(id, 
18540 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 75 6e 69 78  NO_LOCK);.  unix
18550 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
18560 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  if( pFile->pInod
18570 65 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  e && pFile->pIno
18580 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20  de->nLock ){.   
18590 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
185a0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63   outstanding loc
185b0 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61  ks, do not actua
185c0 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69  lly close the fi
185d0 6c 65 20 6a 75 73 74 0a 20 20 20 20 2a 2a 20 79  le just.    ** y
185e0 65 74 20 62 65 63 61 75 73 65 20 74 68 61 74 20  et because that 
185f0 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73  would clear thos
18600 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61  e locks.  Instea
18610 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a  d, add the file.
18620 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f      ** descripto
18630 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 61 50 65  r to pInode->aPe
18640 6e 64 69 6e 67 2e 20 20 49 74 20 77 69 6c 6c 20  nding.  It will 
18650 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
18660 20 63 6c 6f 73 65 64 20 77 68 65 6e 0a 20 20 20   closed when.   
18670 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 6c 6f 63   ** the last loc
18680 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20  k is cleared..  
18690 20 20 2a 2f 0a 20 20 20 20 73 65 74 50 65 6e 64    */.    setPend
186a0 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20  ingFd(pFile);.  
186b0 7d 0a 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65  }.  releaseInode
186c0 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 73  Info(pFile);.  s
186d0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c  qlite3_free(pFil
186e0 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
186f0 74 29 3b 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65  t);.  rc = close
18700 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20  UnixFile(id);.  
18710 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
18720 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
18730 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  ..#endif /* defi
18740 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
18750 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
18760 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
18770 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  ./*.** The code 
18780 61 62 6f 76 65 20 69 73 20 74 68 65 20 41 46 50  above is the AFP
18790 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
187a0 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20  tion.  The code 
187b0 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74  is specific.** t
187c0 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65  o MacOSX and doe
187d0 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74  s not work on ot
187e0 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72  her unix platfor
187f0 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74  ms.  No alternat
18800 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61  ive.** is availa
18810 62 6c 65 2e 20 20 49 66 20 79 6f 75 20 64 6f 6e  ble.  If you don
18820 27 74 20 63 6f 6d 70 69 6c 65 20 66 6f 72 20 61  't compile for a
18830 20 6d 61 63 2c 20 74 68 65 6e 20 74 68 65 20 22   mac, then the "
18840 75 6e 69 78 2d 61 66 70 22 0a 2a 2a 20 56 46 53  unix-afp".** VFS
18850 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
18860 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
18870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
18880 6f 66 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20  of the AFP lock 
18890 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
188a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
188b0 2a 2a 2a 2a 2a 0a 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 2a 2a 2a 2a 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 2f 0a 0a 2f 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 2a 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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18950 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
18960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18970 2a 2a 20 42 65 67 69 6e 20 4e 46 53 20 4c 6f 63  ** Begin NFS Loc
18980 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
18990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
189a0 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 20 64 65 66 69  *****/..#if defi
189b0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
189c0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
189d0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a  LOCKING_STYLE./*
189e0 0a 20 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  . ** Lower the l
189f0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
18a00 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
18a10 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
18a20 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 20  ck.  eFileLock. 
18a30 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
18a40 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
18a50 52 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a  RED_LOCK.. **. *
18a60 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
18a70 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
18a80 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
18a90 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
18aa0 65 6c 6f 77 0a 20 2a 2a 20 74 68 65 20 72 65 71  elow. ** the req
18ab0 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
18ac0 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
18ad0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  ne is a no-op.. 
18ae0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 66  */.static int nf
18af0 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  sUnlock(sqlite3_
18b00 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
18b10 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 72 65 74 75  ileLock){.  retu
18b20 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69  rn posixUnlock(i
18b30 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 31 29  d, eFileLock, 1)
18b40 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64  ;.}..#endif /* d
18b50 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
18b60 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
18b70 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
18b80 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f   */./*.** The co
18b90 64 65 20 61 62 6f 76 65 20 69 73 20 74 68 65 20  de above is the 
18ba0 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  NFS lock impleme
18bb0 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f  ntation.  The co
18bc0 64 65 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a  de is specific.*
18bd0 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20  * to MacOSX and 
18be0 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e  does not work on
18bf0 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74   other unix plat
18c00 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72  forms.  No alter
18c10 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61  native.** is ava
18c20 69 6c 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 2a  ilable.  .**.***
18c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18c40 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 4e 46  ** End of the NF
18c50 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  S lock implement
18c60 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
18c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 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 2a 2a 2a  ****************
18ca0 2a 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 2f 0a 0a 2f 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 2a  ****************
18cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
18d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
18d30 6f 6e 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74  on-locking sqlit
18d40 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 20  e3_file methods 
18d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
18d70 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 64 69 76  .** The next div
18d80 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 69  ision contains i
18d90 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66  mplementations f
18da0 6f 72 20 61 6c 6c 20 6d 65 74 68 6f 64 73 20 6f  or all methods o
18db0 66 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65  f the .** sqlite
18dc0 33 5f 66 69 6c 65 20 6f 62 6a 65 63 74 20 6f 74  3_file object ot
18dd0 68 65 72 20 74 68 61 6e 20 74 68 65 20 6c 6f 63  her than the loc
18de0 6b 69 6e 67 20 6d 65 74 68 6f 64 73 2e 20 20 54  king methods.  T
18df0 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6d 65  he locking.** me
18e00 74 68 6f 64 73 20 77 65 72 65 20 64 65 66 69 6e  thods were defin
18e10 65 64 20 69 6e 20 64 69 76 69 73 69 6f 6e 73 20  ed in divisions 
18e20 61 62 6f 76 65 20 28 6f 6e 65 20 6c 6f 63 6b 69  above (one locki
18e30 6e 67 20 6d 65 74 68 6f 64 20 70 65 72 0a 2a 2a  ng method per.**
18e40 20 64 69 76 69 73 69 6f 6e 29 2e 20 20 54 68 6f   division).  Tho
18e50 73 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20  se methods that 
18e60 61 72 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c  are common to al
18e70 6c 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 0a  l locking modes.
18e80 2a 2a 20 61 72 65 20 67 61 74 68 65 72 20 74 6f  ** are gather to
18e90 67 65 74 68 65 72 20 69 6e 74 6f 20 74 68 69 73  gether into this
18ea0 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f   division..*/../
18eb0 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65  *.** Seek to the
18ec0 20 6f 66 66 73 65 74 20 70 61 73 73 65 64 20 61   offset passed a
18ed0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
18ee0 75 6d 65 6e 74 2c 20 74 68 65 6e 20 72 65 61 64  ument, then read
18ef0 20 63 6e 74 20 0a 2a 2a 20 62 79 74 65 73 20 69   cnt .** bytes i
18f00 6e 74 6f 20 70 42 75 66 2e 20 52 65 74 75 72 6e  nto pBuf. Return
18f10 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
18f20 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65  ytes actually re
18f30 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20 20 49  ad..**.** NB:  I
18f40 66 20 79 6f 75 20 64 65 66 69 6e 65 20 55 53 45  f you define USE
18f50 5f 50 52 45 41 44 20 6f 72 20 55 53 45 5f 50 52  _PREAD or USE_PR
18f60 45 41 44 36 34 2c 20 74 68 65 6e 20 69 74 20 6d  EAD64, then it m
18f70 69 67 68 74 20 61 6c 73 6f 0a 2a 2a 20 62 65 20  ight also.** be 
18f80 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64 65 66  necessary to def
18f90 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43  ine _XOPEN_SOURC
18fa0 45 20 74 6f 20 62 65 20 35 30 30 2e 20 20 54 68  E to be 500.  Th
18fb0 69 73 20 76 61 72 69 65 73 20 66 72 6f 6d 0a 2a  is varies from.*
18fc0 2a 20 6f 6e 65 20 73 79 73 74 65 6d 20 74 6f 20  * one system to 
18fd0 61 6e 6f 74 68 65 72 2e 20 20 53 69 6e 63 65 20  another.  Since 
18fe0 53 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 20  SQLite does not 
18ff0 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44  define USE_PREAD
19000 0a 2a 2a 20 69 6e 20 61 6e 79 20 66 6f 72 6d 20  .** in any form 
19010 62 79 20 64 65 66 61 75 6c 74 2c 20 77 65 20 77  by default, we w
19020 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20  ill not attempt 
19030 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e  to define _XOPEN
19040 5f 53 4f 55 52 43 45 2e 0a 2a 2a 20 53 65 65 20  _SOURCE..** See 
19050 74 69 63 6b 65 74 73 20 23 32 37 34 31 20 61 6e  tickets #2741 an
19060 64 20 23 32 36 38 31 2e 0a 2a 2a 0a 2a 2a 20 54  d #2681..**.** T
19070 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67  o avoid stomping
19080 20 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65   the errno value
19090 20 6f 6e 20 61 20 66 61 69 6c 65 64 20 72 65 61   on a failed rea
190a0 64 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20  d the lastErrno 
190b0 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
190c0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
190d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
190e0 73 65 65 6b 41 6e 64 52 65 61 64 28 75 6e 69 78  seekAndRead(unix
190f0 46 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65  File *id, sqlite
19100 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 2c 20  3_int64 offset, 
19110 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20  void *pBuf, int 
19120 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b  cnt){.  int got;
19130 0a 20 20 69 6e 74 20 70 72 69 6f 72 20 3d 20 30  .  int prior = 0
19140 3b 0a 23 69 66 20 28 21 64 65 66 69 6e 65 64 28  ;.#if (!defined(
19150 55 53 45 5f 50 52 45 41 44 29 20 26 26 20 21 64  USE_PREAD) && !d
19160 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
19170 36 34 29 29 0a 20 20 69 36 34 20 6e 65 77 4f 66  64)).  i64 newOf
19180 66 73 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54  fset;.#endif.  T
19190 49 4d 45 52 5f 53 54 41 52 54 3b 0a 20 20 61 73  IMER_START;.  as
191a0 73 65 72 74 28 20 63 6e 74 3d 3d 28 63 6e 74 26  sert( cnt==(cnt&
191b0 30 78 31 66 66 66 66 29 20 29 3b 0a 20 20 61 73  0x1ffff) );.  as
191c0 73 65 72 74 28 20 69 64 2d 3e 68 3e 32 20 29 3b  sert( id->h>2 );
191d0 0a 20 20 64 6f 7b 0a 23 69 66 20 64 65 66 69 6e  .  do{.#if defin
191e0 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20  ed(USE_PREAD).  
191f0 20 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64 28    got = osPread(
19200 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
19210 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 53  , offset);.    S
19220 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
19230 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 69  got = -1 );.#eli
19240 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
19250 45 41 44 36 34 29 0a 20 20 20 20 67 6f 74 20 3d  EAD64).    got =
19260 20 6f 73 50 72 65 61 64 36 34 28 69 64 2d 3e 68   osPread64(id->h
19270 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66  , pBuf, cnt, off
19280 73 65 74 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  set);.    Simula
19290 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d  teIOError( got =
192a0 20 2d 31 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20   -1 );.#else.   
192b0 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65   newOffset = lse
192c0 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74  ek(id->h, offset
192d0 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20  , SEEK_SET);.   
192e0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
192f0 28 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 2d 31  ( newOffset = -1
19300 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 4f   );.    if( newO
19310 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 20  ffset<0 ){.     
19320 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
19330 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 65  (unixFile*)id, e
19340 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 65 74  rrno);.      ret
19350 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  urn -1;.    }.  
19360 20 20 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 69    got = osRead(i
19370 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29  d->h, pBuf, cnt)
19380 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
19390 20 67 6f 74 3d 3d 63 6e 74 20 29 20 62 72 65 61   got==cnt ) brea
193a0 6b 3b 0a 20 20 20 20 69 66 28 20 67 6f 74 3c 30  k;.    if( got<0
193b0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 72   ){.      if( er
193c0 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 7b 20 67 6f  rno==EINTR ){ go
193d0 74 20 3d 20 31 3b 20 63 6f 6e 74 69 6e 75 65 3b  t = 1; continue;
193e0 20 7d 0a 20 20 20 20 20 20 70 72 69 6f 72 20 3d   }.      prior =
193f0 20 30 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c   0;.      storeL
19400 61 73 74 45 72 72 6e 6f 28 28 75 6e 69 78 46 69  astErrno((unixFi
19410 6c 65 2a 29 69 64 2c 20 20 65 72 72 6e 6f 29 3b  le*)id,  errno);
19420 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
19430 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3e    }else if( got>
19440 30 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 20 2d  0 ){.      cnt -
19450 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 6f 66 66  = got;.      off
19460 73 65 74 20 2b 3d 20 67 6f 74 3b 0a 20 20 20 20  set += got;.    
19470 20 20 70 72 69 6f 72 20 2b 3d 20 67 6f 74 3b 0a    prior += got;.
19480 20 20 20 20 20 20 70 42 75 66 20 3d 20 28 76 6f        pBuf = (vo
19490 69 64 2a 29 28 67 6f 74 20 2b 20 28 63 68 61 72  id*)(got + (char
194a0 2a 29 70 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20  *)pBuf);.    }. 
194b0 20 7d 77 68 69 6c 65 28 20 67 6f 74 3e 30 20 29   }while( got>0 )
194c0 3b 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20  ;.  TIMER_END;. 
194d0 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20   OSTRACE(("READ 
194e0 20 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c     %-3d %5d %7ll
194f0 64 20 25 6c 6c 75 5c 6e 22 2c 0a 20 20 20 20 20  d %llu\n",.     
19500 20 20 20 20 20 20 20 69 64 2d 3e 68 2c 20 67 6f         id->h, go
19510 74 2b 70 72 69 6f 72 2c 20 6f 66 66 73 65 74 2d  t+prior, offset-
19520 70 72 69 6f 72 2c 20 54 49 4d 45 52 5f 45 4c 41  prior, TIMER_ELA
19530 50 53 45 44 29 29 3b 0a 20 20 72 65 74 75 72 6e  PSED));.  return
19540 20 67 6f 74 2b 70 72 69 6f 72 3b 0a 7d 0a 0a 2f   got+prior;.}../
19550 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66  *.** Read data f
19560 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20  rom a file into 
19570 61 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72  a buffer.  Retur
19580 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61  n SQLITE_OK if a
19590 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65  ll.** bytes were
195a0 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
195b0 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f  ly and SQLITE_IO
195c0 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ERR if anything 
195d0 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a  goes.** wrong..*
195e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
195f0 78 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33  xRead(.  sqlite3
19600 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f  _file *id, .  vo
19610 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74  id *pBuf, .  int
19620 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f   amt,.  sqlite3_
19630 69 6e 74 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a  int64 offset.){.
19640 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
19650 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  e = (unixFile *)
19660 69 64 3b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20  id;.  int got;. 
19670 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20   assert( id );. 
19680 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e   assert( offset>
19690 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
196a0 61 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  amt>0 );..  /* I
196b0 66 20 74 68 69 73 20 69 73 20 61 20 64 61 74 61  f this is a data
196c0 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61  base file (not a
196d0 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72   journal, master
196e0 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70  -journal or temp
196f0 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65  .  ** file), the
19700 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f   bytes in the lo
19710 63 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75  cking range shou
19720 6c 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64  ld never be read
19730 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a   or written. */.
19740 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20  #if 0.  assert( 
19750 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d  pFile->pUnused==
19760 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73  0.       || offs
19770 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  et>=PENDING_BYTE
19780 2b 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f  +512.       || o
19790 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49  ffset+amt<=PENDI
197a0 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65  NG_BYTE .  );.#e
197b0 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45  ndif..#if SQLITE
197c0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
197d0 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20  .  /* Deal with 
197e0 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20  as much of this 
197f0 72 65 61 64 20 72 65 71 75 65 73 74 20 61 73 20  read request as 
19800 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61 6e  possible by tran
19810 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74  sfering.  ** dat
19820 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72  a from the memor
19830 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67 20  y mapping using 
19840 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20  memcpy().  */.  
19850 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c 65  if( offset<pFile
19860 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
19870 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74    if( offset+amt
19880 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53   <= pFile->mmapS
19890 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ize ){.      mem
198a0 63 70 79 28 70 42 75 66 2c 20 26 28 28 75 38 20  cpy(pBuf, &((u8 
198b0 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65  *)(pFile->pMapRe
198c0 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20  gion))[offset], 
198d0 61 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  amt);.      retu
198e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
198f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
19900 6e 74 20 6e 43 6f 70 79 20 3d 20 70 46 69 6c 65  nt nCopy = pFile
19910 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66  ->mmapSize - off
19920 73 65 74 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  set;.      memcp
19930 79 28 70 42 75 66 2c 20 26 28 28 75 38 20 2a 29  y(pBuf, &((u8 *)
19940 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69  (pFile->pMapRegi
19950 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 6e 43  on))[offset], nC
19960 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42 75 66  opy);.      pBuf
19970 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75 66 29   = &((u8 *)pBuf)
19980 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61  [nCopy];.      a
19990 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20  mt -= nCopy;.   
199a0 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f     offset += nCo
199b0 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  py;.    }.  }.#e
199c0 6e 64 69 66 0a 0a 20 20 67 6f 74 20 3d 20 73 65  ndif..  got = se
199d0 65 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c  ekAndRead(pFile,
199e0 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61   offset, pBuf, a
199f0 6d 74 29 3b 0a 20 20 69 66 28 20 67 6f 74 3d 3d  mt);.  if( got==
19a00 61 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  amt ){.    retur
19a10 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
19a20 65 6c 73 65 20 69 66 28 20 67 6f 74 3c 30 20 29  else if( got<0 )
19a30 7b 0a 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72  {.    /* lastErr
19a40 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e  no set by seekAn
19a50 64 52 65 61 64 20 2a 2f 0a 20 20 20 20 72 65 74  dRead */.    ret
19a60 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
19a70 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _READ;.  }else{.
19a80 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
19a90 6e 6f 28 70 46 69 6c 65 2c 20 30 29 3b 20 20 20  no(pFile, 0);   
19aa0 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74 65 6d 20  /* not a system 
19ab0 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 2f 2a 20  error */.    /* 
19ac0 55 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66 20  Unread parts of 
19ad0 74 68 65 20 62 75 66 66 65 72 20 6d 75 73 74 20  the buffer must 
19ae0 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a  be zero-filled *
19af0 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28  /.    memset(&((
19b00 63 68 61 72 2a 29 70 42 75 66 29 5b 67 6f 74 5d  char*)pBuf)[got]
19b10 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a 20  , 0, amt-got);. 
19b20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
19b30 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
19b40 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  D;.  }.}../*.** 
19b50 41 74 74 65 6d 70 74 20 74 6f 20 73 65 65 6b 20  Attempt to seek 
19b60 74 68 65 20 66 69 6c 65 2d 64 65 73 63 72 69 70  the file-descrip
19b70 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  tor passed as th
19b80 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
19b90 20 74 6f 0a 2a 2a 20 61 62 73 6f 6c 75 74 65 20   to.** absolute 
19ba0 6f 66 66 73 65 74 20 69 4f 66 66 2c 20 74 68 65  offset iOff, the
19bb0 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69  n attempt to wri
19bc0 74 65 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66  te nBuf bytes of
19bd0 20 64 61 74 61 20 66 72 6f 6d 0a 2a 2a 20 70 42   data from.** pB
19be0 75 66 20 74 6f 20 69 74 2e 20 49 66 20 61 6e 20  uf to it. If an 
19bf0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
19c00 74 75 72 6e 20 2d 31 20 61 6e 64 20 73 65 74 20  turn -1 and set 
19c10 2a 70 69 45 72 72 6e 6f 2e 20 4f 74 68 65 72 77  *piErrno. Otherw
19c20 69 73 65 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20  ise, .** return 
19c30 74 68 65 20 61 63 74 75 61 6c 20 6e 75 6d 62 65  the actual numbe
19c40 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74  r of bytes writt
19c50 65 6e 20 28 77 68 69 63 68 20 6d 61 79 20 62 65  en (which may be
19c60 20 6c 65 73 73 20 74 68 61 6e 0a 2a 2a 20 6e 42   less than.** nB
19c70 75 66 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  uf)..*/.static i
19c80 6e 74 20 73 65 65 6b 41 6e 64 57 72 69 74 65 46  nt seekAndWriteF
19c90 64 28 0a 20 20 69 6e 74 20 66 64 2c 20 20 20 20  d(.  int fd,    
19ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cb0 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
19cc0 63 72 69 70 74 6f 72 20 74 6f 20 77 72 69 74 65  criptor to write
19cd0 20 74 6f 20 2a 2f 0a 20 20 69 36 34 20 69 4f 66   to */.  i64 iOf
19ce0 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
19cf0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
19d00 20 6f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e   offset to begin
19d10 20 77 72 69 74 69 6e 67 20 61 74 20 2a 2f 0a 20   writing at */. 
19d20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75   const void *pBu
19d30 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
19d40 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72   /* Copy data fr
19d50 6f 6d 20 74 68 69 73 20 62 75 66 66 65 72 20 74  om this buffer t
19d60 6f 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  o the file */.  
19d70 69 6e 74 20 6e 42 75 66 2c 20 20 20 20 20 20 20  int nBuf,       
19d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d90 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65  /* Size of buffe
19da0 72 20 70 42 75 66 20 69 6e 20 62 79 74 65 73 20  r pBuf in bytes 
19db0 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 45 72 72 6e  */.  int *piErrn
19dc0 6f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o               
19dd0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72       /* OUT: Err
19de0 6f 72 20 6e 75 6d 62 65 72 20 69 66 20 65 72 72  or number if err
19df0 6f 72 20 6f 63 63 75 72 73 20 2a 2f 0a 29 7b 0a  or occurs */.){.
19e00 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20    int rc = 0;   
19e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
19e30 6e 65 64 20 62 79 20 73 79 73 74 65 6d 20 63 61  ned by system ca
19e40 6c 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ll */..  assert(
19e50 20 6e 42 75 66 3d 3d 28 6e 42 75 66 26 30 78 31   nBuf==(nBuf&0x1
19e60 66 66 66 66 29 20 29 3b 0a 20 20 61 73 73 65 72  ffff) );.  asser
19e70 74 28 20 66 64 3e 32 20 29 3b 0a 20 20 61 73 73  t( fd>2 );.  ass
19e80 65 72 74 28 20 70 69 45 72 72 6e 6f 21 3d 30 20  ert( piErrno!=0 
19e90 29 3b 0a 20 20 6e 42 75 66 20 26 3d 20 30 78 31  );.  nBuf &= 0x1
19ea0 66 66 66 66 3b 0a 20 20 54 49 4d 45 52 5f 53 54  ffff;.  TIMER_ST
19eb0 41 52 54 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65  ART;..#if define
19ec0 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20 64  d(USE_PREAD).  d
19ed0 6f 7b 20 72 63 20 3d 20 28 69 6e 74 29 6f 73 50  o{ rc = (int)osP
19ee0 77 72 69 74 65 28 66 64 2c 20 70 42 75 66 2c 20  write(fd, pBuf, 
19ef0 6e 42 75 66 2c 20 69 4f 66 66 29 3b 20 7d 77 68  nBuf, iOff); }wh
19f00 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72  ile( rc<0 && err
19f10 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6c  no==EINTR );.#el
19f20 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
19f30 52 45 41 44 36 34 29 0a 20 20 64 6f 7b 20 72 63  READ64).  do{ rc
19f40 20 3d 20 28 69 6e 74 29 6f 73 50 77 72 69 74 65   = (int)osPwrite
19f50 36 34 28 66 64 2c 20 70 42 75 66 2c 20 6e 42 75  64(fd, pBuf, nBu
19f60 66 2c 20 69 4f 66 66 29 3b 7d 77 68 69 6c 65 28  f, iOff);}while(
19f70 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d   rc<0 && errno==
19f80 45 49 4e 54 52 29 3b 0a 23 65 6c 73 65 0a 20 20  EINTR);.#else.  
19f90 64 6f 7b 0a 20 20 20 20 69 36 34 20 69 53 65 65  do{.    i64 iSee
19fa0 6b 20 3d 20 6c 73 65 65 6b 28 66 64 2c 20 69 4f  k = lseek(fd, iO
19fb0 66 66 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20  ff, SEEK_SET);. 
19fc0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
19fd0 6f 72 28 20 69 53 65 65 6b 20 3d 20 2d 31 20 29  or( iSeek = -1 )
19fe0 3b 0a 20 20 20 20 69 66 28 20 69 53 65 65 6b 3c  ;.    if( iSeek<
19ff0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1a000 2d 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  -1;.      break;
1a010 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
1a020 6f 73 57 72 69 74 65 28 66 64 2c 20 70 42 75 66  osWrite(fd, pBuf
1a030 2c 20 6e 42 75 66 29 3b 0a 20 20 7d 77 68 69 6c  , nBuf);.  }whil
1a040 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f  e( rc<0 && errno
1a050 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6e 64 69  ==EINTR );.#endi
1a060 66 0a 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a  f..  TIMER_END;.
1a070 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49 54    OSTRACE(("WRIT
1a080 45 20 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c  E   %-3d %5d %7l
1a090 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 66 64 2c 20  ld %llu\n", fd, 
1a0a0 72 63 2c 20 69 4f 66 66 2c 20 54 49 4d 45 52 5f  rc, iOff, TIMER_
1a0b0 45 4c 41 50 53 45 44 29 29 3b 0a 0a 20 20 69 66  ELAPSED));..  if
1a0c0 28 20 72 63 3c 30 20 29 20 2a 70 69 45 72 72 6e  ( rc<0 ) *piErrn
1a0d0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 72 65 74  o = errno;.  ret
1a0e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
1a0f0 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66  * Seek to the of
1a100 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66 66 73  fset in id->offs
1a110 65 74 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74  et then read cnt
1a120 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66   bytes into pBuf
1a130 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ..** Return the 
1a140 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
1a150 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 20 20  actually read.  
1a160 55 70 64 61 74 65 20 74 68 65 20 6f 66 66 73 65  Update the offse
1a170 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69  t..**.** To avoi
1a180 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20 65  d stomping the e
1a190 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20  rrno value on a 
1a1a0 66 61 69 6c 65 64 20 77 72 69 74 65 20 74 68 65  failed write the
1a1b0 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65   lastErrno value
1a1c0 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72  .** is set befor
1a1d0 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
1a1e0 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41  static int seekA
1a1f0 6e 64 57 72 69 74 65 28 75 6e 69 78 46 69 6c 65  ndWrite(unixFile
1a200 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73 65 74   *id, i64 offset
1a210 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42  , const void *pB
1a220 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20  uf, int cnt){.  
1a230 72 65 74 75 72 6e 20 73 65 65 6b 41 6e 64 57 72  return seekAndWr
1a240 69 74 65 46 64 28 69 64 2d 3e 68 2c 20 6f 66 66  iteFd(id->h, off
1a250 73 65 74 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20  set, pBuf, cnt, 
1a260 26 69 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 29 3b  &id->lastErrno);
1a270 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  .}.../*.** Write
1a280 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66   data from a buf
1a290 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e  fer into a file.
1a2a0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
1a2b0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a  OK on success.**
1a2c0 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65   or some other e
1a2d0 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69  rror code on fai
1a2e0 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lure..*/.static 
1a2f0 69 6e 74 20 75 6e 69 78 57 72 69 74 65 28 0a 20  int unixWrite(. 
1a300 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
1a310 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  d, .  const void
1a320 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 61   *pBuf, .  int a
1a330 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  mt,.  sqlite3_in
1a340 74 36 34 20 6f 66 66 73 65 74 20 0a 29 7b 0a 20  t64 offset .){. 
1a350 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
1a360 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
1a370 3b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20 3d 20  ;.  int wrote = 
1a380 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20  0;.  assert( id 
1a390 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74  );.  assert( amt
1a3a0 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  >0 );..  /* If t
1a3b0 68 69 73 20 69 73 20 61 20 64 61 74 61 62 61 73  his is a databas
1a3c0 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f  e file (not a jo
1a3d0 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f  urnal, master-jo
1a3e0 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20  urnal or temp.  
1a3f0 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62 79  ** file), the by
1a400 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69  tes in the locki
1a410 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20  ng range should 
1a420 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 6f 72  never be read or
1a430 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66   written. */.#if
1a440 20 30 0a 20 20 61 73 73 65 72 74 28 20 70 46 69   0.  assert( pFi
1a450 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20  le->pUnused==0. 
1a460 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e        || offset>
1a470 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31  =PENDING_BYTE+51
1a480 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73  2.       || offs
1a490 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f  et+amt<=PENDING_
1a4a0 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69  BYTE .  );.#endi
1a4b0 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
1a4c0 5f 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 77  _DEBUG.  /* If w
1a4d0 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f  e are doing a no
1a4e0 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20  rmal write to a 
1a4f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61  database file (a
1a500 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 2a  s opposed to.  *
1a510 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f  * doing a hot-jo
1a520 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f  urnal rollback o
1a530 72 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d  r a write to som
1a540 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61  e file other tha
1a550 6e 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20  n a.  ** normal 
1a560 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 74  database file) t
1a570 68 65 6e 20 72 65 63 6f 72 64 20 74 68 65 20 66  hen record the f
1a580 61 63 74 20 74 68 61 74 20 74 68 65 20 64 61 74  act that the dat
1a590 61 62 61 73 65 0a 20 20 2a 2a 20 68 61 73 20 63  abase.  ** has c
1a5a0 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20  hanged.  If the 
1a5b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
1a5c0 74 65 72 20 69 73 20 6d 6f 64 69 66 69 65 64 2c  ter is modified,
1a5d0 20 72 65 63 6f 72 64 20 74 68 61 74 0a 20 20 2a   record that.  *
1a5e0 2a 20 66 61 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f  * fact too..  */
1a5f0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e  .  if( pFile->in
1a600 4e 6f 72 6d 61 6c 57 72 69 74 65 20 29 7b 0a 20  NormalWrite ){. 
1a610 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61     pFile->dbUpda
1a620 74 65 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20  te = 1;  /* The 
1a630 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65  database has bee
1a640 6e 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20  n modified */.  
1a650 20 20 69 66 28 20 6f 66 66 73 65 74 3c 3d 32 34    if( offset<=24
1a660 20 26 26 20 6f 66 66 73 65 74 2b 61 6d 74 3e 3d   && offset+amt>=
1a670 32 37 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  27 ){.      int 
1a680 72 63 3b 0a 20 20 20 20 20 20 63 68 61 72 20 6f  rc;.      char o
1a690 6c 64 43 6e 74 72 5b 34 5d 3b 0a 20 20 20 20 20  ldCntr[4];.     
1a6a0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1a6b0 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20  Benign(1);.     
1a6c0 20 72 63 20 3d 20 73 65 65 6b 41 6e 64 52 65 61   rc = seekAndRea
1a6d0 64 28 70 46 69 6c 65 2c 20 32 34 2c 20 6f 6c 64  d(pFile, 24, old
1a6e0 43 6e 74 72 2c 20 34 29 3b 0a 20 20 20 20 20 20  Cntr, 4);.      
1a6f0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
1a700 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
1a710 69 66 28 20 72 63 21 3d 34 20 7c 7c 20 6d 65 6d  if( rc!=4 || mem
1a720 63 6d 70 28 6f 6c 64 43 6e 74 72 2c 20 26 28 28  cmp(oldCntr, &((
1a730 63 68 61 72 2a 29 70 42 75 66 29 5b 32 34 2d 6f  char*)pBuf)[24-o
1a740 66 66 73 65 74 5d 2c 20 34 29 21 3d 30 20 29 7b  ffset], 4)!=0 ){
1a750 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
1a760 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20  transCntrChng = 
1a770 31 3b 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73  1;  /* The trans
1a780 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 68  action counter h
1a790 61 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20  as changed */.  
1a7a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1a7b0 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
1a7c0 6e 65 64 28 53 51 4c 49 54 45 5f 4d 4d 41 50 5f  ned(SQLITE_MMAP_
1a7d0 52 45 41 44 57 52 49 54 45 29 20 26 26 20 53 51  READWRITE) && SQ
1a7e0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
1a7f0 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77  ZE>0.  /* Deal w
1a800 69 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74  ith as much of t
1a810 68 69 73 20 77 72 69 74 65 20 72 65 71 75 65 73  his write reques
1a820 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79  t as possible by
1a830 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a   transfering.  *
1a840 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  * data from the 
1a850 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75  memory mapping u
1a860 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20  sing memcpy().  
1a870 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  */.  if( offset<
1a880 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
1a890 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65  ){.    if( offse
1a8a0 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e  t+amt <= pFile->
1a8b0 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
1a8c0 20 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a    memcpy(&((u8 *
1a8d0 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  )(pFile->pMapReg
1a8e0 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70  ion))[offset], p
1a8f0 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20  Buf, amt);.     
1a900 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1a910 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
1a920 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20      int nCopy = 
1a930 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
1a940 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  - offset;.      
1a950 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28  memcpy(&((u8 *)(
1a960 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
1a970 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75  n))[offset], pBu
1a980 66 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20  f, nCopy);.     
1a990 20 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29   pBuf = &((u8 *)
1a9a0 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20  pBuf)[nCopy];.  
1a9b0 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79      amt -= nCopy
1a9c0 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b  ;.      offset +
1a9d0 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20  = nCopy;.    }. 
1a9e0 20 7d 0a 23 65 6e 64 69 66 0a 20 0a 20 20 77 68   }.#endif. .  wh
1a9f0 69 6c 65 28 20 28 77 72 6f 74 65 20 3d 20 73 65  ile( (wrote = se
1aa00 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c 65  ekAndWrite(pFile
1aa10 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20  , offset, pBuf, 
1aa20 61 6d 74 29 29 3c 61 6d 74 20 26 26 20 77 72 6f  amt))<amt && wro
1aa30 74 65 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74 20  te>0 ){.    amt 
1aa40 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 6f 66  -= wrote;.    of
1aa50 66 73 65 74 20 2b 3d 20 77 72 6f 74 65 3b 0a 20  fset += wrote;. 
1aa60 20 20 20 70 42 75 66 20 3d 20 26 28 28 63 68 61     pBuf = &((cha
1aa70 72 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b  r*)pBuf)[wrote];
1aa80 0a 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65 49  .  }.  SimulateI
1aa90 4f 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 28  OError(( wrote=(
1aaa0 2d 31 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20  -1), amt=1 ));. 
1aab0 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c   SimulateDiskful
1aac0 6c 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 30  lError(( wrote=0
1aad0 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 0a 20 20 69  , amt=1 ));..  i
1aae0 66 28 20 61 6d 74 3e 77 72 6f 74 65 20 29 7b 0a  f( amt>wrote ){.
1aaf0 20 20 20 20 69 66 28 20 77 72 6f 74 65 3c 30 20      if( wrote<0 
1ab00 26 26 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  && pFile->lastEr
1ab10 72 6e 6f 21 3d 45 4e 4f 53 50 43 20 29 7b 0a 20  rno!=ENOSPC ){. 
1ab20 20 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e       /* lastErrn
1ab30 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64  o set by seekAnd
1ab40 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 72  Write */.      r
1ab50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1ab60 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 65  RR_WRITE;.    }e
1ab70 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 6f 72 65  lse{.      store
1ab80 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
1ab90 20 30 29 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79   0); /* not a sy
1aba0 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20  stem error */.  
1abb0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1abc0 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  E_FULL;.    }.  
1abd0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
1abe0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66  TE_OK;.}..#ifdef
1abf0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a   SQLITE_TEST./*.
1ac00 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  ** Count the num
1ac10 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73  ber of fullsyncs
1ac20 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63   and normal sync
1ac30 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
1ac40 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74   to test.** that
1ac50 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73   syncs and fulls
1ac60 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72 72 69  yncs are occurri
1ac70 6e 67 20 61 74 20 74 68 65 20 72 69 67 68 74 20  ng at the right 
1ac80 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  times..*/.int sq
1ac90 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74  lite3_sync_count
1aca0 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65   = 0;.int sqlite
1acb0 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74  3_fullsync_count
1acc0 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
1acd0 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20 74 72  .** We do not tr
1ace0 75 73 74 20 73 79 73 74 65 6d 73 20 74 6f 20 70  ust systems to p
1acf0 72 6f 76 69 64 65 20 61 20 77 6f 72 6b 69 6e 67  rovide a working
1ad00 20 66 64 61 74 61 73 79 6e 63 28 29 2e 20 20 53   fdatasync().  S
1ad10 6f 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65 72  ome do..** Other
1ad20 73 20 64 6f 20 6e 6f 2e 20 20 54 6f 20 62 65 20  s do no.  To be 
1ad30 73 61 66 65 2c 20 77 65 20 77 69 6c 6c 20 73 74  safe, we will st
1ad40 69 63 6b 20 77 69 74 68 20 74 68 65 20 28 73 6c  ick with the (sl
1ad50 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 29 0a 2a  ightly slower).*
1ad60 2a 20 66 73 79 6e 63 28 29 2e 20 49 66 20 79 6f  * fsync(). If yo
1ad70 75 20 6b 6e 6f 77 20 74 68 61 74 20 79 6f 75 72  u know that your
1ad80 20 73 79 73 74 65 6d 20 64 6f 65 73 20 73 75 70   system does sup
1ad90 70 6f 72 74 20 66 64 61 74 61 73 79 6e 63 28 29  port fdatasync()
1ada0 20 63 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a 20 74   correctly,.** t
1adb0 68 65 6e 20 73 69 6d 70 6c 79 20 63 6f 6d 70 69  hen simply compi
1adc0 6c 65 20 77 69 74 68 20 2d 44 66 64 61 74 61 73  le with -Dfdatas
1add0 79 6e 63 3d 66 64 61 74 61 73 79 6e 63 20 6f 72  ync=fdatasync or
1ade0 20 2d 44 48 41 56 45 5f 46 44 41 54 41 53 59 4e   -DHAVE_FDATASYN
1adf0 43 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  C.*/.#if !define
1ae00 64 28 66 64 61 74 61 73 79 6e 63 29 20 26 26 20  d(fdatasync) && 
1ae10 21 48 41 56 45 5f 46 44 41 54 41 53 59 4e 43 0a  !HAVE_FDATASYNC.
1ae20 23 20 64 65 66 69 6e 65 20 66 64 61 74 61 73 79  # define fdatasy
1ae30 6e 63 20 66 73 79 6e 63 0a 23 65 6e 64 69 66 0a  nc fsync.#endif.
1ae40 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 48 41  ./*.** Define HA
1ae50 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 74 6f 20  VE_FULLFSYNC to 
1ae60 30 20 6f 72 20 31 20 64 65 70 65 6e 64 69 6e 67  0 or 1 depending
1ae70 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
1ae80 6f 74 0a 2a 2a 20 74 68 65 20 46 5f 46 55 4c 4c  ot.** the F_FULL
1ae90 46 53 59 4e 43 20 6d 61 63 72 6f 20 69 73 20 64  FSYNC macro is d
1aea0 65 66 69 6e 65 64 2e 20 20 46 5f 46 55 4c 4c 46  efined.  F_FULLF
1aeb0 53 59 4e 43 20 69 73 20 63 75 72 72 65 6e 74 6c  SYNC is currentl
1aec0 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61 69 6c 61  y.** only availa
1aed0 62 6c 65 20 6f 6e 20 4d 61 63 20 4f 53 20 58 2e  ble on Mac OS X.
1aee0 20 20 42 75 74 20 74 68 61 74 20 63 6f 75 6c 64    But that could
1aef0 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64   change..*/.#ifd
1af00 65 66 20 46 5f 46 55 4c 4c 46 53 59 4e 43 0a 23  ef F_FULLFSYNC.#
1af10 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c   define HAVE_FUL
1af20 4c 46 53 59 4e 43 20 31 0a 23 65 6c 73 65 0a 23  LFSYNC 1.#else.#
1af30 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c   define HAVE_FUL
1af40 4c 46 53 59 4e 43 20 30 0a 23 65 6e 64 69 66 0a  LFSYNC 0.#endif.
1af50 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73 79 6e  ../*.** The fsyn
1af60 63 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  c() system call 
1af70 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 61 73  does not work as
1af80 20 61 64 76 65 72 74 69 73 65 64 20 6f 6e 20 6d   advertised on m
1af90 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79 73 74  any.** unix syst
1afa0 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ems.  The follow
1afb0 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 69 73  ing procedure is
1afc0 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 6d   an attempt to m
1afd0 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b 20 62  ake.** it work b
1afe0 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  etter..**.** The
1aff0 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
1b000 6d 61 63 72 6f 20 64 69 73 61 62 6c 65 73 20 61  macro disables a
1b010 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20 20 54 68  ll fsync()s.  Th
1b020 69 73 20 69 73 20 75 73 65 66 75 6c 0a 2a 2a 20  is is useful.** 
1b030 66 6f 72 20 74 65 73 74 69 6e 67 20 77 68 65 6e  for testing when
1b040 20 77 65 20 77 61 6e 74 20 74 6f 20 72 75 6e 20   we want to run 
1b050 74 68 72 6f 75 67 68 20 74 68 65 20 74 65 73 74  through the test
1b060 20 73 75 69 74 65 20 71 75 69 63 6b 6c 79 2e 0a   suite quickly..
1b070 2a 2a 20 59 6f 75 20 61 72 65 20 73 74 72 6f 6e  ** You are stron
1b080 67 6c 79 20 61 64 76 69 73 65 64 20 2a 6e 6f 74  gly advised *not
1b090 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77 69 74 68  * to deploy with
1b0a0 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a   SQLITE_NO_SYNC.
1b0b0 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f 77 65  ** enabled, howe
1b0c0 76 65 72 2c 20 73 69 6e 63 65 20 77 69 74 68 20  ver, since with 
1b0d0 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65  SQLITE_NO_SYNC e
1b0e0 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20 63 72  nabled, an OS cr
1b0f0 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20  ash.** or power 
1b100 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c 69 6b  failure will lik
1b110 65 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65 20  ely corrupt the 
1b120 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1b130 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65 74 73  *.** SQLite sets
1b140 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c   the dataOnly fl
1b150 61 67 20 69 66 20 74 68 65 20 73 69 7a 65 20 6f  ag if the size o
1b160 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e  f the file is un
1b170 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 54 68 65 20  changed..** The 
1b180 69 64 65 61 20 62 65 68 69 6e 64 20 64 61 74 61  idea behind data
1b190 4f 6e 6c 79 20 69 73 20 74 68 61 74 20 69 74 20  Only is that it 
1b1a0 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 77 72 69 74  should only writ
1b1b0 65 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 65  e the file conte
1b1c0 6e 74 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c 20 6e  nt.** to disk, n
1b1d0 6f 74 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 57  ot the inode.  W
1b1e0 65 20 6f 6e 6c 79 20 73 65 74 20 64 61 74 61 4f  e only set dataO
1b1f0 6e 6c 79 20 69 66 20 74 68 65 20 66 69 6c 65 20  nly if the file 
1b200 73 69 7a 65 20 69 73 20 0a 2a 2a 20 75 6e 63 68  size is .** unch
1b210 61 6e 67 65 64 20 73 69 6e 63 65 20 74 68 65 20  anged since the 
1b220 66 69 6c 65 20 73 69 7a 65 20 69 73 20 70 61 72  file size is par
1b230 74 20 6f 66 20 74 68 65 20 69 6e 6f 64 65 2e 20  t of the inode. 
1b240 20 48 6f 77 65 76 65 72 2c 20 0a 2a 2a 20 54 65   However, .** Te
1b250 64 20 54 73 27 6f 20 74 65 6c 6c 73 20 75 73 20  d Ts'o tells us 
1b260 74 68 61 74 20 66 64 61 74 61 73 79 6e 63 28 29  that fdatasync()
1b270 20 77 69 6c 6c 20 61 6c 73 6f 20 77 72 69 74 65   will also write
1b280 20 74 68 65 20 69 6e 6f 64 65 20 69 66 20 74 68   the inode if th
1b290 65 0a 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 68  e.** file size h
1b2a0 61 73 20 63 68 61 6e 67 65 64 2e 20 20 54 68 65  as changed.  The
1b2b0 20 6f 6e 6c 79 20 72 65 61 6c 20 64 69 66 66 65   only real diffe
1b2c0 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 66 64  rence between fd
1b2d0 61 74 61 73 79 6e 63 28 29 0a 2a 2a 20 61 6e 64  atasync().** and
1b2e0 20 66 73 79 6e 63 28 29 2c 20 54 65 64 20 74 65   fsync(), Ted te
1b2f0 6c 6c 73 20 75 73 2c 20 69 73 20 74 68 61 74 20  lls us, is that 
1b300 66 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c 6c  fdatasync() will
1b310 20 6e 6f 74 20 66 6c 75 73 68 20 74 68 65 0a 2a   not flush the.*
1b320 2a 20 69 6e 6f 64 65 20 69 66 20 74 68 65 20 6d  * inode if the m
1b330 74 69 6d 65 20 6f 72 20 6f 77 6e 65 72 20 6f 72  time or owner or
1b340 20 6f 74 68 65 72 20 69 6e 6f 64 65 20 61 74 74   other inode att
1b350 72 69 62 75 74 65 73 20 68 61 76 65 20 63 68 61  ributes have cha
1b360 6e 67 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e 6c 79  nged..** We only
1b370 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20   care about the 
1b380 66 69 6c 65 20 73 69 7a 65 2c 20 6e 6f 74 20 74  file size, not t
1b390 68 65 20 6f 74 68 65 72 20 66 69 6c 65 20 61 74  he other file at
1b3a0 74 72 69 62 75 74 65 73 2c 20 73 6f 0a 2a 2a 20  tributes, so.** 
1b3b0 61 73 20 66 61 72 20 61 73 20 53 51 4c 69 74 65  as far as SQLite
1b3c0 20 69 73 20 63 6f 6e 63 65 72 6e 65 64 2c 20 61   is concerned, a
1b3d0 6e 20 66 64 61 74 61 73 79 6e 63 28 29 20 69 73  n fdatasync() is
1b3e0 20 61 6c 77 61 79 73 20 61 64 65 71 75 61 74 65   always adequate
1b3f0 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20 61 6c 77 61  ..** So, we alwa
1b400 79 73 20 75 73 65 20 66 64 61 74 61 73 79 6e 63  ys use fdatasync
1b410 28 29 20 69 66 20 69 74 20 69 73 20 61 76 61 69  () if it is avai
1b420 6c 61 62 6c 65 2c 20 72 65 67 61 72 64 6c 65 73  lable, regardles
1b430 73 20 6f 66 0a 2a 2a 20 74 68 65 20 76 61 6c 75  s of.** the valu
1b440 65 20 6f 66 20 74 68 65 20 64 61 74 61 4f 6e 6c  e of the dataOnl
1b450 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61 74 69  y flag..*/.stati
1b460 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63  c int full_fsync
1b470 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 66 75 6c  (int fd, int ful
1b480 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61 74 61 4f  lSync, int dataO
1b490 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  nly){.  int rc;.
1b4a0 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
1b4b0 69 6e 67 20 22 69 66 64 65 66 2f 65 6c 69 66 2f  ing "ifdef/elif/
1b4c0 65 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68 61 73  else/" block has
1b4d0 20 74 68 65 20 73 61 6d 65 20 73 74 72 75 63 74   the same struct
1b4e0 75 72 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20  ure as.  ** the 
1b4f0 6f 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20 69 73  one below. It is
1b500 20 72 65 70 6c 69 63 61 74 65 64 20 68 65 72 65   replicated here
1b510 20 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f 69 64   solely to avoid
1b520 20 63 6c 75 74 74 65 72 69 6e 67 20 0a 20 20 2a   cluttering .  *
1b530 2a 20 75 70 20 74 68 65 20 72 65 61 6c 20 63 6f  * up the real co
1b540 64 65 20 77 69 74 68 20 74 68 65 20 55 4e 55 53  de with the UNUS
1b550 45 44 5f 50 41 52 41 4d 45 54 45 52 28 29 20 6d  ED_PARAMETER() m
1b560 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69 66 64  acros..  */.#ifd
1b570 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ef SQLITE_NO_SYN
1b580 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  C.  UNUSED_PARAM
1b590 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55 53  ETER(fd);.  UNUS
1b5a0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c  ED_PARAMETER(ful
1b5b0 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44  lSync);.  UNUSED
1b5c0 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f  _PARAMETER(dataO
1b5d0 6e 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41 56 45  nly);.#elif HAVE
1b5e0 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55 4e 55  _FULLFSYNC.  UNU
1b5f0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61  SED_PARAMETER(da
1b600 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65 0a 20  taOnly);.#else. 
1b610 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1b620 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55  R(fullSync);.  U
1b630 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1b640 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e 64 69  dataOnly);.#endi
1b650 66 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74  f..  /* Record t
1b660 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d  he number of tim
1b670 65 73 20 74 68 61 74 20 77 65 20 64 6f 20 61 20  es that we do a 
1b680 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29 20 61  normal fsync() a
1b690 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59 4e  nd .  ** FULLSYN
1b6a0 43 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  C.  This is used
1b6b0 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 20   during testing 
1b6c0 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74  to verify that t
1b6d0 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a 20 20  his procedure.  
1b6e0 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77  ** gets called w
1b6f0 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20  ith the correct 
1b700 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a  arguments..  */.
1b710 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
1b720 53 54 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e  ST.  if( fullSyn
1b730 63 20 29 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c  c ) sqlite3_full
1b740 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20  sync_count++;.  
1b750 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75  sqlite3_sync_cou
1b760 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nt++;.#endif..  
1b770 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c 65  /* If we compile
1b780 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54  d with the SQLIT
1b790 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20  E_NO_SYNC flag, 
1b7a0 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73 20  then syncing is 
1b7b0 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a  a.  ** no-op.  *
1b7c0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1b7d0 4e 4f 5f 53 59 4e 43 0a 20 20 72 63 20 3d 20 53  NO_SYNC.  rc = S
1b7e0 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 69 66 20  QLITE_OK;.#elif 
1b7f0 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20  HAVE_FULLFSYNC. 
1b800 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 7b   if( fullSync ){
1b810 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74  .    rc = osFcnt
1b820 6c 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53 59 4e  l(fd, F_FULLFSYN
1b830 43 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  C, 0);.  }else{.
1b840 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a      rc = 1;.  }.
1b850 20 20 2f 2a 20 49 66 20 74 68 65 20 46 55 4c 4c    /* If the FULL
1b860 46 53 59 4e 43 20 66 61 69 6c 65 64 2c 20 66 61  FSYNC failed, fa
1b870 6c 6c 20 62 61 63 6b 20 74 6f 20 61 74 74 65 6d  ll back to attem
1b880 70 74 69 6e 67 20 61 6e 20 66 73 79 6e 63 28 29  pting an fsync()
1b890 2e 0a 20 20 2a 2a 20 49 74 20 73 68 6f 75 6c 64  ..  ** It should
1b8a0 6e 27 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  n't be possible 
1b8b0 66 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20 74 6f  for fullfsync to
1b8c0 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c 6f 63   fail on the loc
1b8d0 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 73 79  al .  ** file sy
1b8e0 73 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c 20 73  stem (on OSX), s
1b8f0 6f 20 66 61 69 6c 75 72 65 20 69 6e 64 69 63 61  o failure indica
1b900 74 65 73 20 74 68 61 74 20 46 55 4c 4c 46 53 59  tes that FULLFSY
1b910 4e 43 0a 20 20 2a 2a 20 69 73 6e 27 74 20 73 75  NC.  ** isn't su
1b920 70 70 6f 72 74 65 64 20 66 6f 72 20 74 68 69 73  pported for this
1b930 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 53 6f   file system. So
1b940 2c 20 61 74 74 65 6d 70 74 20 61 6e 20 66 73 79  , attempt an fsy
1b950 6e 63 20 0a 20 20 2a 2a 20 61 6e 64 20 28 66 6f  nc .  ** and (fo
1b960 72 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20 74 68  r now) ignore th
1b970 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20 61 20  e overhead of a 
1b980 73 75 70 65 72 66 6c 75 6f 75 73 20 66 63 6e 74  superfluous fcnt
1b990 6c 20 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a 20 49  l call.  .  ** I
1b9a0 74 27 64 20 62 65 20 62 65 74 74 65 72 20 74 6f  t'd be better to
1b9b0 20 64 65 74 65 63 74 20 66 75 6c 6c 66 73 79 6e   detect fullfsyn
1b9c0 63 20 73 75 70 70 6f 72 74 20 6f 6e 63 65 20 61  c support once a
1b9d0 6e 64 20 61 76 6f 69 64 20 0a 20 20 2a 2a 20 74  nd avoid .  ** t
1b9e0 68 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20 65 76  he fcntl call ev
1b9f0 65 72 79 20 74 69 6d 65 20 73 79 6e 63 20 69 73  ery time sync is
1ba00 20 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20   called..  */.  
1ba10 69 66 28 20 72 63 20 29 20 72 63 20 3d 20 66 73  if( rc ) rc = fs
1ba20 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 69 66 20  ync(fd);..#elif 
1ba30 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
1ba40 5f 29 0a 20 20 2f 2a 20 66 64 61 74 61 73 79 6e  _).  /* fdatasyn
1ba50 63 28 29 20 6f 6e 20 48 46 53 2b 20 64 6f 65 73  c() on HFS+ does
1ba60 6e 27 74 20 79 65 74 20 66 6c 75 73 68 20 74 68  n't yet flush th
1ba70 65 20 66 69 6c 65 20 73 69 7a 65 20 69 66 20 69  e file size if i
1ba80 74 20 63 68 61 6e 67 65 64 20 63 6f 72 72 65 63  t changed correc
1ba90 74 6c 79 0a 20 20 2a 2a 20 73 6f 20 63 75 72 72  tly.  ** so curr
1baa0 65 6e 74 6c 79 20 77 65 20 64 65 66 61 75 6c 74  ently we default
1bab0 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 74 68   to the macro th
1bac0 61 74 20 72 65 64 65 66 69 6e 65 73 20 66 64 61  at redefines fda
1bad0 74 61 73 79 6e 63 20 74 6f 20 66 73 79 6e 63 0a  tasync to fsync.
1bae0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66 73 79 6e    */.  rc = fsyn
1baf0 63 28 66 64 29 3b 0a 23 65 6c 73 65 20 0a 20 20  c(fd);.#else .  
1bb00 72 63 20 3d 20 66 64 61 74 61 73 79 6e 63 28 66  rc = fdatasync(f
1bb10 64 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  d);.#if OS_VXWOR
1bb20 4b 53 0a 20 20 69 66 28 20 72 63 3d 3d 2d 31 20  KS.  if( rc==-1 
1bb30 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 53 55  && errno==ENOTSU
1bb40 50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 73  P ){.    rc = fs
1bb50 79 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e  ync(fd);.  }.#en
1bb60 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b  dif /* OS_VXWORK
1bb70 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 69  S */.#endif /* i
1bb80 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  fdef SQLITE_NO_S
1bb90 59 4e 43 20 65 6c 69 66 20 48 41 56 45 5f 46 55  YNC elif HAVE_FU
1bba0 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20 20 69 66  LLFSYNC */..  if
1bbb0 28 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20  ( OS_VXWORKS && 
1bbc0 72 63 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 72  rc!= -1 ){.    r
1bbd0 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  c = 0;.  }.  ret
1bbe0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1bbf0 20 4f 70 65 6e 20 61 20 66 69 6c 65 20 64 65 73   Open a file des
1bc00 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 64  criptor to the d
1bc10 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e  irectory contain
1bc20 69 6e 67 20 66 69 6c 65 20 7a 46 69 6c 65 6e 61  ing file zFilena
1bc30 6d 65 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  me..** If succes
1bc40 73 66 75 6c 2c 20 2a 70 46 64 20 69 73 20 73 65  sful, *pFd is se
1bc50 74 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20  t to the opened 
1bc60 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1bc70 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  and.** SQLITE_OK
1bc80 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
1bc90 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1bca0 2c 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f  , either SQLITE_
1bcb0 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49  NOMEM.** or SQLI
1bcc0 54 45 5f 43 41 4e 54 4f 50 45 4e 20 69 73 20 72  TE_CANTOPEN is r
1bcd0 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 46 64  eturned and *pFd
1bce0 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 75 6e   is set to an un
1bcf0 64 65 66 69 6e 65 64 0a 2a 2a 20 76 61 6c 75 65  defined.** value
1bd00 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 72 65  ..**.** The dire
1bd10 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72  ctory file descr
1bd20 69 70 74 6f 72 20 69 73 20 75 73 65 64 20 66 6f  iptor is used fo
1bd30 72 20 6f 6e 6c 79 20 6f 6e 65 20 74 68 69 6e 67  r only one thing
1bd40 20 2d 20 74 6f 0a 2a 2a 20 66 73 79 6e 63 28 29   - to.** fsync()
1bd50 20 61 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20   a directory to 
1bd60 6d 61 6b 65 20 73 75 72 65 20 66 69 6c 65 20 63  make sure file c
1bd70 72 65 61 74 69 6f 6e 20 61 6e 64 20 64 65 6c 65  reation and dele
1bd80 74 69 6f 6e 20 65 76 65 6e 74 73 0a 2a 2a 20 61  tion events.** a
1bd90 72 65 20 66 6c 75 73 68 65 64 20 74 6f 20 64 69  re flushed to di
1bda0 73 6b 2e 20 20 53 75 63 68 20 66 73 79 6e 63 73  sk.  Such fsyncs
1bdb0 20 61 72 65 20 6e 6f 74 20 6e 65 65 64 65 64 20   are not needed 
1bdc0 6f 6e 20 6e 65 77 65 72 0a 2a 2a 20 6a 6f 75 72  on newer.** jour
1bdd0 6e 61 6c 69 6e 67 20 66 69 6c 65 73 79 73 74 65  naling filesyste
1bde0 6d 73 2c 20 62 75 74 20 61 72 65 20 72 65 71 75  ms, but are requ
1bdf0 69 72 65 64 20 6f 6e 20 6f 6c 64 65 72 20 66 69  ired on older fi
1be00 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a  lesystems..**.**
1be10 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
1be20 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20  n be overridden 
1be30 75 73 69 6e 67 20 74 68 65 20 78 53 65 74 53 79  using the xSetSy
1be40 73 43 61 6c 6c 20 69 6e 74 65 72 66 61 63 65 2e  sCall interface.
1be50 0a 2a 2a 20 54 68 65 20 61 62 69 6c 69 74 79 20  .** The ability 
1be60 74 6f 20 6f 76 65 72 72 69 64 65 20 74 68 69 73  to override this
1be70 20 72 6f 75 74 69 6e 65 20 77 61 73 20 61 64 64   routine was add
1be80 65 64 20 69 6e 20 73 75 70 70 6f 72 74 20 6f 66  ed in support of
1be90 20 74 68 65 0a 2a 2a 20 63 68 72 6f 6d 69 75 6d   the.** chromium
1bea0 20 73 61 6e 64 62 6f 78 2e 20 20 4f 70 65 6e 69   sandbox.  Openi
1beb0 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79 20 69  ng a directory i
1bec0 73 20 61 20 73 65 63 75 72 69 74 79 20 72 69 73  s a security ris
1bed0 6b 20 28 77 65 20 61 72 65 0a 2a 2a 20 74 6f 6c  k (we are.** tol
1bee0 64 29 20 73 6f 20 6d 61 6b 69 6e 67 20 69 74 20  d) so making it 
1bef0 6f 76 65 72 72 69 64 65 61 62 6c 65 20 61 6c 6c  overrideable all
1bf00 6f 77 73 20 74 68 65 20 63 68 72 6f 6d 69 75 6d  ows the chromium
1bf10 20 73 61 6e 64 62 6f 78 20 74 6f 0a 2a 2a 20 72   sandbox to.** r
1bf20 65 70 6c 61 63 65 20 74 68 69 73 20 72 6f 75 74  eplace this rout
1bf30 69 6e 65 20 77 69 74 68 20 61 20 68 61 72 6d 6c  ine with a harml
1bf40 65 73 73 20 6e 6f 2d 6f 70 2e 20 20 54 6f 20 6d  ess no-op.  To m
1bf50 61 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ake this routine
1bf60 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2c 20 72 65 70  .** a no-op, rep
1bf70 6c 61 63 65 20 69 74 20 77 69 74 68 20 61 20 73  lace it with a s
1bf80 74 75 62 20 74 68 61 74 20 72 65 74 75 72 6e 73  tub that returns
1bf90 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c   SQLITE_OK but l
1bfa0 65 61 76 65 73 0a 2a 2a 20 2a 70 46 64 20 73 65  eaves.** *pFd se
1bfb0 74 20 74 6f 20 61 20 6e 65 67 61 74 69 76 65 20  t to a negative 
1bfc0 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  number..**.** If
1bfd0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1bfe0 74 75 72 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c  turned, the call
1bff0 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  er is responsibl
1c000 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 0a 2a 2a  e for closing.**
1c010 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
1c020 70 74 6f 72 20 2a 70 46 64 20 75 73 69 6e 67 20  ptor *pFd using 
1c030 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  close()..*/.stat
1c040 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72 65 63  ic int openDirec
1c050 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61 72 20  tory(const char 
1c060 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20  *zFilename, int 
1c070 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 69 69 3b  *pFd){.  int ii;
1c080 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a  .  int fd = -1;.
1c090 20 20 63 68 61 72 20 7a 44 69 72 6e 61 6d 65 5b    char zDirname[
1c0a0 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b  MAX_PATHNAME+1];
1c0b0 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ..  sqlite3_snpr
1c0c0 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d  intf(MAX_PATHNAM
1c0d0 45 2c 20 7a 44 69 72 6e 61 6d 65 2c 20 22 25 73  E, zDirname, "%s
1c0e0 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ", zFilename);. 
1c0f0 20 66 6f 72 28 69 69 3d 28 69 6e 74 29 73 74 72   for(ii=(int)str
1c100 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3b 20 69  len(zDirname); i
1c110 69 3e 31 20 26 26 20 7a 44 69 72 6e 61 6d 65 5b  i>1 && zDirname[
1c120 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d 29 3b  ii]!='/'; ii--);
1c130 0a 20 20 69 66 28 20 69 69 3e 30 20 29 7b 0a 20  .  if( ii>0 ){. 
1c140 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 20     zDirname[ii] 
1c150 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66 64 20 3d  = '\0';.    fd =
1c160 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 44 69   robust_open(zDi
1c170 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c  rname, O_RDONLY|
1c180 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20  O_BINARY, 0);.  
1c190 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20    if( fd>=0 ){. 
1c1a0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f       OSTRACE(("O
1c1b0 50 45 4e 44 49 52 20 25 2d 33 64 20 25 73 5c 6e  PENDIR %-3d %s\n
1c1c0 22 2c 20 66 64 2c 20 7a 44 69 72 6e 61 6d 65 29  ", fd, zDirname)
1c1d0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  );.    }.  }.  *
1c1e0 70 46 64 20 3d 20 66 64 3b 0a 20 20 69 66 28 20  pFd = fd;.  if( 
1c1f0 66 64 3e 3d 30 20 29 20 72 65 74 75 72 6e 20 53  fd>=0 ) return S
1c200 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72 65 74 75  QLITE_OK;.  retu
1c210 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  rn unixLogError(
1c220 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
1c230 42 4b 50 54 2c 20 22 6f 70 65 6e 44 69 72 65 63  BKPT, "openDirec
1c240 74 6f 72 79 22 2c 20 7a 44 69 72 6e 61 6d 65 29  tory", zDirname)
1c250 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
1c260 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20  sure all writes 
1c270 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  to a particular 
1c280 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74  file are committ
1c290 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  ed to disk..**.*
1c2a0 2a 20 49 66 20 64 61 74 61 4f 6e 6c 79 3d 3d 30  * If dataOnly==0
1c2b0 20 74 68 65 6e 20 62 6f 74 68 20 74 68 65 20 66   then both the f
1c2c0 69 6c 65 20 69 74 73 65 6c 66 20 61 6e 64 20 69  ile itself and i
1c2d0 74 73 20 6d 65 74 61 64 61 74 61 20 28 66 69 6c  ts metadata (fil
1c2e0 65 0a 2a 2a 20 73 69 7a 65 2c 20 61 63 63 65 73  e.** size, acces
1c2f0 73 20 74 69 6d 65 2c 20 65 74 63 29 20 61 72 65  s time, etc) are
1c300 20 73 79 6e 63 65 64 2e 20 20 49 66 20 64 61 74   synced.  If dat
1c310 61 4f 6e 6c 79 21 3d 30 20 74 68 65 6e 20 6f 6e  aOnly!=0 then on
1c320 6c 79 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64  ly the.** file d
1c330 61 74 61 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a  ata is synced..*
1c340 2a 0a 2a 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c  *.** Under Unix,
1c350 20 61 6c 73 6f 20 6d 61 6b 65 20 73 75 72 65 20   also make sure 
1c360 74 68 61 74 20 74 68 65 20 64 69 72 65 63 74 6f  that the directo
1c370 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ry entry for the
1c380 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65   file.** has bee
1c390 6e 20 63 72 65 61 74 65 64 20 62 79 20 66 73 79  n created by fsy
1c3a0 6e 63 2d 69 6e 67 20 74 68 65 20 64 69 72 65 63  nc-ing the direc
1c3b0 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69  tory that contai
1c3c0 6e 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20  ns the file..** 
1c3d0 49 66 20 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20  If we do not do 
1c3e0 74 68 69 73 20 61 6e 64 20 77 65 20 65 6e 63 6f  this and we enco
1c3f0 75 6e 74 65 72 20 61 20 70 6f 77 65 72 20 66 61  unter a power fa
1c400 69 6c 75 72 65 2c 20 74 68 65 20 64 69 72 65 63  ilure, the direc
1c410 74 6f 72 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f  tory.** entry fo
1c420 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69  r the journal mi
1c430 67 68 74 20 6e 6f 74 20 65 78 69 73 74 20 61 66  ght not exist af
1c440 74 65 72 20 77 65 20 72 65 62 6f 6f 74 2e 20 20  ter we reboot.  
1c450 54 68 65 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69  The next.** SQLi
1c460 74 65 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  te to access the
1c470 20 66 69 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b   file will not k
1c480 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6a 6f 75  now that the jou
1c490 72 6e 61 6c 20 65 78 69 73 74 73 20 28 62 65 63  rnal exists (bec
1c4a0 61 75 73 65 0a 2a 2a 20 74 68 65 20 64 69 72 65  ause.** the dire
1c4b0 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20  ctory entry for 
1c4c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
1c4d0 6e 65 76 65 72 20 63 72 65 61 74 65 64 29 20 61  never created) a
1c4e0 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nd the transacti
1c4f0 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72  on.** will not r
1c500 6f 6c 6c 20 62 61 63 6b 20 2d 20 70 6f 73 73 69  oll back - possi
1c510 62 6c 79 20 6c 65 61 64 69 6e 67 20 74 6f 20 64  bly leading to d
1c520 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
1c530 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
1c540 74 20 75 6e 69 78 53 79 6e 63 28 73 71 6c 69 74  t unixSync(sqlit
1c550 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
1c560 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 72   flags){.  int r
1c570 63 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  c;.  unixFile *p
1c580 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
1c590 2a 29 69 64 3b 0a 0a 20 20 69 6e 74 20 69 73 44  *)id;..  int isD
1c5a0 61 74 61 4f 6e 6c 79 20 3d 20 28 66 6c 61 67 73  ataOnly = (flags
1c5b0 26 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54  &SQLITE_SYNC_DAT
1c5c0 41 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73  AONLY);.  int is
1c5d0 46 75 6c 6c 73 79 6e 63 20 3d 20 28 66 6c 61 67  Fullsync = (flag
1c5e0 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
1c5f0 53 59 4e 43 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a  SYNC_FULL;..  /*
1c600 20 43 68 65 63 6b 20 74 68 61 74 20 6f 6e 65 20   Check that one 
1c610 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  of SQLITE_SYNC_N
1c620 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61  ORMAL or FULL wa
1c630 73 20 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73  s passed */.  as
1c640 73 65 72 74 28 28 66 6c 61 67 73 26 30 78 30 46  sert((flags&0x0F
1c650 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  )==SQLITE_SYNC_N
1c660 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28  ORMAL.      || (
1c670 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c  flags&0x0F)==SQL
1c680 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20  ITE_SYNC_FULL.  
1c690 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61  );..  /* Unix ca
1c6a0 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73  nnot, but some s
1c6b0 79 73 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72  ystems may retur
1c6c0 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72  n SQLITE_FULL fr
1c6d0 6f 6d 20 68 65 72 65 2e 20 54 68 69 73 0a 20 20  om here. This.  
1c6e0 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65  ** line is to te
1c6f0 73 74 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f  st that doing so
1c700 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20   does not cause 
1c710 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20  any problems..  
1c720 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73  */.  SimulateDis
1c730 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 75  kfullError( retu
1c740 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29  rn SQLITE_FULL )
1c750 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
1c760 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
1c770 28 22 53 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e  ("SYNC    %-3d\n
1c780 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
1c790 20 72 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63   rc = full_fsync
1c7a0 28 70 46 69 6c 65 2d 3e 68 2c 20 69 73 46 75 6c  (pFile->h, isFul
1c7b0 6c 73 79 6e 63 2c 20 69 73 44 61 74 61 4f 6e 6c  lsync, isDataOnl
1c7c0 79 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  y);.  SimulateIO
1c7d0 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20  Error( rc=1 );. 
1c7e0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73   if( rc ){.    s
1c7f0 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
1c800 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  ile, errno);.   
1c810 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45   return unixLogE
1c820 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1c830 52 5f 46 53 59 4e 43 2c 20 22 66 75 6c 6c 5f 66  R_FSYNC, "full_f
1c840 73 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  sync", pFile->zP
1c850 61 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ath);.  }..  /* 
1c860 41 6c 73 6f 20 66 73 79 6e 63 20 74 68 65 20 64  Also fsync the d
1c870 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e  irectory contain
1c880 69 6e 67 20 74 68 65 20 66 69 6c 65 20 69 66 20  ing the file if 
1c890 74 68 65 20 44 49 52 53 59 4e 43 20 66 6c 61 67  the DIRSYNC flag
1c8a0 0a 20 20 2a 2a 20 69 73 20 73 65 74 2e 20 20 54  .  ** is set.  T
1c8b0 68 69 73 20 69 73 20 61 20 6f 6e 65 2d 74 69 6d  his is a one-tim
1c8c0 65 20 6f 63 63 75 72 72 65 6e 63 65 2e 20 20 4d  e occurrence.  M
1c8d0 61 6e 79 20 73 79 73 74 65 6d 73 20 28 65 78 61  any systems (exa
1c8e0 6d 70 6c 65 73 3a 20 41 49 58 29 0a 20 20 2a 2a  mples: AIX).  **
1c8f0 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 66   are unable to f
1c900 73 79 6e 63 20 61 20 64 69 72 65 63 74 6f 72 79  sync a directory
1c910 2c 20 73 6f 20 69 67 6e 6f 72 65 20 65 72 72 6f  , so ignore erro
1c920 72 73 20 6f 6e 20 74 68 65 20 66 73 79 6e 63 2e  rs on the fsync.
1c930 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
1c940 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55  e->ctrlFlags & U
1c950 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 20  NIXFILE_DIRSYNC 
1c960 29 7b 0a 20 20 20 20 69 6e 74 20 64 69 72 66 64  ){.    int dirfd
1c970 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
1c980 44 49 52 53 59 4e 43 20 25 73 20 28 68 61 76 65  DIRSYNC %s (have
1c990 5f 66 75 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75  _fullfsync=%d fu
1c9a0 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70  llsync=%d)\n", p
1c9b0 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 0a 20 20 20  File->zPath,.   
1c9c0 20 20 20 20 20 20 20 20 20 48 41 56 45 5f 46 55           HAVE_FU
1c9d0 4c 4c 46 53 59 4e 43 2c 20 69 73 46 75 6c 6c 73  LLFSYNC, isFulls
1c9e0 79 6e 63 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  ync));.    rc = 
1c9f0 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  osOpenDirectory(
1ca00 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 64  pFile->zPath, &d
1ca10 69 72 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72  irfd);.    if( r
1ca20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1ca30 20 20 20 20 20 20 66 75 6c 6c 5f 66 73 79 6e 63        full_fsync
1ca40 28 64 69 72 66 64 2c 20 30 2c 20 30 29 3b 0a 20  (dirfd, 0, 0);. 
1ca50 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73       robust_clos
1ca60 65 28 70 46 69 6c 65 2c 20 64 69 72 66 64 2c 20  e(pFile, dirfd, 
1ca70 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d  __LINE__);.    }
1ca80 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
1ca90 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43  rt( rc==SQLITE_C
1caa0 41 4e 54 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20  ANTOPEN );.     
1cab0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1cac0 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65  .    }.    pFile
1cad0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e  ->ctrlFlags &= ~
1cae0 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43  UNIXFILE_DIRSYNC
1caf0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1cb00 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  c;.}../*.** Trun
1cb10 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c  cate an open fil
1cb20 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65 64  e to a specified
1cb30 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20   size.*/.static 
1cb40 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61 74 65  int unixTruncate
1cb50 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
1cb60 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20  d, i64 nByte){. 
1cb70 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
1cb80 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69   = (unixFile *)i
1cb90 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  d;.  int rc;.  a
1cba0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
1cbb0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1cbc0 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
1cbd0 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 20  _IOERR_TRUNCATE 
1cbe0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
1cbf0 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69 67 75  user has configu
1cc00 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65  red a chunk-size
1cc10 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20   for this file, 
1cc20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 2a  truncate the.  *
1cc30 2a 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69  * file so that i
1cc40 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e  t consists of an
1cc50 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20   integer number 
1cc60 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20  of chunks (i.e. 
1cc70 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20  the.  ** actual 
1cc80 66 69 6c 65 20 73 69 7a 65 20 61 66 74 65 72 20  file size after 
1cc90 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61  the operation ma
1cca0 79 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e  y be larger than
1ccb0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 0a 20   the requested. 
1ccc0 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a   ** size)..  */.
1ccd0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43    if( pFile->szC
1cce0 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 6e 42  hunk>0 ){.    nB
1ccf0 79 74 65 20 3d 20 28 28 6e 42 79 74 65 20 2b 20  yte = ((nByte + 
1cd00 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d  pFile->szChunk -
1cd10 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75   1)/pFile->szChu
1cd20 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43  nk) * pFile->szC
1cd30 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  hunk;.  }..  rc 
1cd40 3d 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61  = robust_ftrunca
1cd50 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79  te(pFile->h, nBy
1cd60 74 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  te);.  if( rc ){
1cd70 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72  .    storeLastEr
1cd80 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f  rno(pFile, errno
1cd90 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e  );.    return un
1cda0 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
1cdb0 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
1cdc0 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70  , "ftruncate", p
1cdd0 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
1cde0 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51  }else{.#ifdef SQ
1cdf0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f  LITE_DEBUG.    /
1ce00 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e  * If we are doin
1ce10 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65  g a normal write
1ce20 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 66   to a database f
1ce30 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64 20  ile (as opposed 
1ce40 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20  to.    ** doing 
1ce50 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
1ce60 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74  llback or a writ
1ce70 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f  e to some file o
1ce80 74 68 65 72 20 74 68 61 6e 20 61 0a 20 20 20 20  ther than a.    
1ce90 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61  ** normal databa
1cea0 73 65 20 66 69 6c 65 29 20 61 6e 64 20 77 65 20  se file) and we 
1ceb0 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c  truncate the fil
1cec0 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68  e to zero length
1ced0 2c 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 65 66  ,.    ** that ef
1cee0 66 65 63 74 69 76 65 6c 79 20 75 70 64 61 74 65  fectively update
1cef0 73 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75  s the change cou
1cf00 6e 74 65 72 2e 20 20 54 68 69 73 20 6d 69 67 68  nter.  This migh
1cf10 74 20 68 61 70 70 65 6e 0a 20 20 20 20 2a 2a 20  t happen.    ** 
1cf20 77 68 65 6e 20 72 65 73 74 6f 72 69 6e 67 20 61  when restoring a
1cf30 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20   database using 
1cf40 74 68 65 20 62 61 63 6b 75 70 20 41 50 49 20 66  the backup API f
1cf50 72 6f 6d 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74  rom a zero-lengt
1cf60 68 0a 20 20 20 20 2a 2a 20 73 6f 75 72 63 65 2e  h.    ** source.
1cf70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1cf80 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
1cf90 72 69 74 65 20 26 26 20 6e 42 79 74 65 3d 3d 30  rite && nByte==0
1cfa0 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
1cfb0 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d  >transCntrChng =
1cfc0 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
1cfd0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
1cfe0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20  _MMAP_SIZE>0.   
1cff0 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
1d000 77 61 73 20 6a 75 73 74 20 74 72 75 6e 63 61 74  was just truncat
1d010 65 64 20 74 6f 20 61 20 73 69 7a 65 20 73 6d 61  ed to a size sma
1d020 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 63 75  ller than the cu
1d030 72 72 65 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 6d  rrently.    ** m
1d040 61 70 70 65 64 20 72 65 67 69 6f 6e 2c 20 72 65  apped region, re
1d050 64 75 63 65 20 74 68 65 20 65 66 66 65 63 74 69  duce the effecti
1d060 76 65 20 6d 61 70 70 69 6e 67 20 73 69 7a 65 20  ve mapping size 
1d070 61 73 20 77 65 6c 6c 2e 20 53 51 4c 69 74 65 20  as well. SQLite 
1d080 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 20  will.    ** use 
1d090 72 65 61 64 28 29 20 61 6e 64 20 77 72 69 74 65  read() and write
1d0a0 28 29 20 74 6f 20 61 63 63 65 73 73 20 64 61 74  () to access dat
1d0b0 61 20 62 65 79 6f 6e 64 20 74 68 69 73 20 70 6f  a beyond this po
1d0c0 69 6e 74 20 66 72 6f 6d 20 6e 6f 77 20 6f 6e 2e  int from now on.
1d0d0 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66    .    */.    if
1d0e0 28 20 6e 42 79 74 65 3c 70 46 69 6c 65 2d 3e 6d  ( nByte<pFile->m
1d0f0 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  mapSize ){.     
1d100 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
1d110 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d 0a   = nByte;.    }.
1d120 23 65 6e 64 69 66 0a 0a 20 20 20 20 72 65 74 75  #endif..    retu
1d130 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1d140 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  }.}../*.** Deter
1d150 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74  mine the current
1d160 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20   size of a file 
1d170 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74  in bytes.*/.stat
1d180 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 53  ic int unixFileS
1d190 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
1d1a0 20 2a 69 64 2c 20 69 36 34 20 2a 70 53 69 7a 65   *id, i64 *pSize
1d1b0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
1d1c0 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
1d1d0 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a    assert( id );.
1d1e0 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28 28    rc = osFstat((
1d1f0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
1d200 68 2c 20 26 62 75 66 29 3b 0a 20 20 53 69 6d 75  h, &buf);.  Simu
1d210 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d  lateIOError( rc=
1d220 31 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30  1 );.  if( rc!=0
1d230 20 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73   ){.    storeLas
1d240 74 45 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65  tErrno((unixFile
1d250 2a 29 69 64 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  *)id, errno);.  
1d260 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d270 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 7d  IOERR_FSTAT;.  }
1d280 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62 75 66 2e  .  *pSize = buf.
1d290 73 74 5f 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 57  st_size;..  /* W
1d2a0 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 7a 65  hen opening a ze
1d2b0 72 6f 2d 73 69 7a 65 20 64 61 74 61 62 61 73 65  ro-size database
1d2c0 2c 20 74 68 65 20 66 69 6e 64 49 6e 6f 64 65 49  , the findInodeI
1d2d0 6e 66 6f 28 29 20 70 72 6f 63 65 64 75 72 65 0a  nfo() procedure.
1d2e0 20 20 2a 2a 20 77 72 69 74 65 73 20 61 20 73 69    ** writes a si
1d2f0 6e 67 6c 65 20 62 79 74 65 20 69 6e 74 6f 20 74  ngle byte into t
1d300 68 61 74 20 66 69 6c 65 20 69 6e 20 6f 72 64 65  hat file in orde
1d310 72 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  r to work around
1d320 20 61 20 62 75 67 0a 20 20 2a 2a 20 69 6e 20 74   a bug.  ** in t
1d330 68 65 20 4f 53 2d 58 20 6d 73 64 6f 73 20 66 69  he OS-X msdos fi
1d340 6c 65 73 79 73 74 65 6d 2e 20 20 49 6e 20 6f 72  lesystem.  In or
1d350 64 65 72 20 74 6f 20 61 76 6f 69 64 20 70 72 6f  der to avoid pro
1d360 62 6c 65 6d 73 20 77 69 74 68 20 75 70 70 65 72  blems with upper
1d370 0a 20 20 2a 2a 20 6c 61 79 65 72 73 2c 20 77 65  .  ** layers, we
1d380 20 6e 65 65 64 20 74 6f 20 72 65 70 6f 72 74 20   need to report 
1d390 74 68 69 73 20 66 69 6c 65 20 73 69 7a 65 20 61  this file size a
1d3a0 73 20 7a 65 72 6f 20 65 76 65 6e 20 74 68 6f 75  s zero even thou
1d3b0 67 68 20 69 74 20 69 73 0a 20 20 2a 2a 20 72 65  gh it is.  ** re
1d3c0 61 6c 6c 79 20 31 2e 20 20 20 54 69 63 6b 65 74  ally 1.   Ticket
1d3d0 20 23 33 32 36 30 2e 0a 20 20 2a 2f 0a 20 20 69   #3260..  */.  i
1d3e0 66 28 20 2a 70 53 69 7a 65 3d 3d 31 20 29 20 2a  f( *pSize==1 ) *
1d3f0 70 53 69 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20 72  pSize = 0;...  r
1d400 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1d410 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .}..#if SQLITE_E
1d420 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1d430 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
1d440 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20  _APPLE__)./*.** 
1d450 48 61 6e 64 6c 65 72 20 66 6f 72 20 70 72 6f 78  Handler for prox
1d460 79 2d 6c 6f 63 6b 69 6e 67 20 66 69 6c 65 2d 63  y-locking file-c
1d470 6f 6e 74 72 6f 6c 20 76 65 72 62 73 2e 20 20 44  ontrol verbs.  D
1d480 65 66 69 6e 65 64 20 62 65 6c 6f 77 20 69 6e 20  efined below in 
1d490 74 68 65 0a 2a 2a 20 70 72 6f 78 79 69 6e 67 20  the.** proxying 
1d4a0 6c 6f 63 6b 69 6e 67 20 64 69 76 69 73 69 6f 6e  locking division
1d4b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d4c0 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c  proxyFileControl
1d4d0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69  (sqlite3_file*,i
1d4e0 6e 74 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69  nt,void*);.#endi
1d4f0 66 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66  f../* .** This f
1d500 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1d510 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  d to handle the 
1d520 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a  SQLITE_FCNTL_SIZ
1d530 45 5f 48 49 4e 54 20 0a 2a 2a 20 66 69 6c 65 2d  E_HINT .** file-
1d540 63 6f 6e 74 72 6f 6c 20 6f 70 65 72 61 74 69 6f  control operatio
1d550 6e 2e 20 20 45 6e 6c 61 72 67 65 20 74 68 65 20  n.  Enlarge the 
1d560 64 61 74 61 62 61 73 65 20 74 6f 20 6e 42 79 74  database to nByt
1d570 65 73 20 69 6e 20 73 69 7a 65 0a 2a 2a 20 28 72  es in size.** (r
1d580 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 74 68 65  ounded up to the
1d590 20 6e 65 78 74 20 63 68 75 6e 6b 2d 73 69 7a 65   next chunk-size
1d5a0 29 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  ).  If the datab
1d5b0 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  ase is already.*
1d5c0 2a 20 6e 42 79 74 65 73 20 6f 72 20 6c 61 72 67  * nBytes or larg
1d5d0 65 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  er, this routine
1d5e0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
1d5f0 73 74 61 74 69 63 20 69 6e 74 20 66 63 6e 74 6c  static int fcntl
1d600 53 69 7a 65 48 69 6e 74 28 75 6e 69 78 46 69 6c  SizeHint(unixFil
1d610 65 20 2a 70 46 69 6c 65 2c 20 69 36 34 20 6e 42  e *pFile, i64 nB
1d620 79 74 65 29 7b 0a 20 20 69 66 28 20 70 46 69 6c  yte){.  if( pFil
1d630 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a  e->szChunk>0 ){.
1d640 20 20 20 20 69 36 34 20 6e 53 69 7a 65 3b 20 20      i64 nSize;  
1d650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d660 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 66 69    /* Required fi
1d670 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73  le size */.    s
1d680 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 20  truct stat buf; 
1d690 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d6a0 55 73 65 64 20 74 6f 20 68 6f 6c 64 20 72 65 74  Used to hold ret
1d6b0 75 72 6e 20 76 61 6c 75 65 73 20 6f 66 20 66 73  urn values of fs
1d6c0 74 61 74 28 29 20 2a 2f 0a 20 20 20 0a 20 20 20  tat() */.   .   
1d6d0 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 46 69   if( osFstat(pFi
1d6e0 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20 29 7b 0a  le->h, &buf) ){.
1d6f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1d700 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b  ITE_IOERR_FSTAT;
1d710 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 53 69 7a  .    }..    nSiz
1d720 65 20 3d 20 28 28 6e 42 79 74 65 2b 70 46 69 6c  e = ((nByte+pFil
1d730 65 2d 3e 73 7a 43 68 75 6e 6b 2d 31 29 20 2f 20  e->szChunk-1) / 
1d740 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20  pFile->szChunk) 
1d750 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  * pFile->szChunk
1d760 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e  ;.    if( nSize>
1d770 28 69 36 34 29 62 75 66 2e 73 74 5f 73 69 7a 65  (i64)buf.st_size
1d780 20 29 7b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64   ){..#if defined
1d790 28 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c  (HAVE_POSIX_FALL
1d7a0 4f 43 41 54 45 29 20 26 26 20 48 41 56 45 5f 50  OCATE) && HAVE_P
1d7b0 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 0a 20  OSIX_FALLOCATE. 
1d7c0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65       /* The code
1d7d0 20 62 65 6c 6f 77 20 69 73 20 68 61 6e 64 6c 69   below is handli
1d7e0 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  ng the return va
1d7f0 6c 75 65 20 6f 66 20 6f 73 46 61 6c 6c 6f 63 61  lue of osFalloca
1d800 74 65 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 63  te() .      ** c
1d810 6f 72 72 65 63 74 6c 79 2e 20 70 6f 73 69 78 5f  orrectly. posix_
1d820 66 61 6c 6c 6f 63 61 74 65 28 29 20 69 73 20 64  fallocate() is d
1d830 65 66 69 6e 65 64 20 74 6f 20 22 72 65 74 75 72  efined to "retur
1d840 6e 73 20 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65  ns zero on succe
1d850 73 73 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f 72  ss, .      ** or
1d860 20 61 6e 20 65 72 72 6f 72 20 6e 75 6d 62 65 72   an error number
1d870 20 6f 6e 20 20 66 61 69 6c 75 72 65 22 2e 20 53   on  failure". S
1d880 65 65 20 74 68 65 20 6d 61 6e 70 61 67 65 20 66  ee the manpage f
1d890 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20  or details. */. 
1d8a0 20 20 20 20 20 69 6e 74 20 65 72 72 3b 0a 20 20       int err;.  
1d8b0 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20      do{.        
1d8c0 65 72 72 20 3d 20 6f 73 46 61 6c 6c 6f 63 61 74  err = osFallocat
1d8d0 65 28 70 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2e  e(pFile->h, buf.
1d8e0 73 74 5f 73 69 7a 65 2c 20 6e 53 69 7a 65 2d 62  st_size, nSize-b
1d8f0 75 66 2e 73 74 5f 73 69 7a 65 29 3b 0a 20 20 20  uf.st_size);.   
1d900 20 20 20 7d 77 68 69 6c 65 28 20 65 72 72 3d 3d     }while( err==
1d910 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 20 20 69  EINTR );.      i
1d920 66 28 20 65 72 72 20 29 20 72 65 74 75 72 6e 20  f( err ) return 
1d930 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49  SQLITE_IOERR_WRI
1d940 54 45 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  TE;.#else.      
1d950 2f 2a 20 49 66 20 74 68 65 20 4f 53 20 64 6f 65  /* If the OS doe
1d960 73 20 6e 6f 74 20 68 61 76 65 20 70 6f 73 69 78  s not have posix
1d970 5f 66 61 6c 6c 6f 63 61 74 65 28 29 2c 20 66 61  _fallocate(), fa
1d980 6b 65 20 69 74 2e 20 57 72 69 74 65 20 61 20 0a  ke it. Write a .
1d990 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20        ** single 
1d9a0 62 79 74 65 20 74 6f 20 74 68 65 20 6c 61 73 74  byte to the last
1d9b0 20 62 79 74 65 20 69 6e 20 65 61 63 68 20 62 6c   byte in each bl
1d9c0 6f 63 6b 20 74 68 61 74 20 66 61 6c 6c 73 20 65  ock that falls e
1d9d0 6e 74 69 72 65 6c 79 0a 20 20 20 20 20 20 2a 2a  ntirely.      **
1d9e0 20 77 69 74 68 69 6e 20 74 68 65 20 65 78 74 65   within the exte
1d9f0 6e 64 65 64 20 72 65 67 69 6f 6e 2e 20 54 68 65  nded region. The
1da00 6e 2c 20 69 66 20 72 65 71 75 69 72 65 64 2c 20  n, if required, 
1da10 61 20 73 69 6e 67 6c 65 20 62 79 74 65 0a 20 20  a single byte.  
1da20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74      ** at offset
1da30 20 28 6e 53 69 7a 65 2d 31 29 2c 20 74 6f 20 73   (nSize-1), to s
1da40 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  et the size of t
1da50 68 65 20 66 69 6c 65 20 63 6f 72 72 65 63 74 6c  he file correctl
1da60 79 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  y..      ** This
1da70 20 69 73 20 61 20 73 69 6d 69 6c 61 72 20 74 65   is a similar te
1da80 63 68 6e 69 71 75 65 20 74 6f 20 74 68 61 74 20  chnique to that 
1da90 75 73 65 64 20 62 79 20 67 6c 69 62 63 20 6f 6e  used by glibc on
1daa0 20 73 79 73 74 65 6d 73 0a 20 20 20 20 20 20 2a   systems.      *
1dab0 2a 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 68 61  * that do not ha
1dac0 76 65 20 61 20 72 65 61 6c 20 66 61 6c 6c 6f 63  ve a real falloc
1dad0 61 74 65 28 29 20 63 61 6c 6c 2e 0a 20 20 20 20  ate() call..    
1dae0 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e    */.      int n
1daf0 42 6c 6b 20 3d 20 62 75 66 2e 73 74 5f 62 6c 6b  Blk = buf.st_blk
1db00 73 69 7a 65 3b 20 20 2f 2a 20 46 69 6c 65 2d 73  size;  /* File-s
1db10 79 73 74 65 6d 20 62 6c 6f 63 6b 20 73 69 7a 65  ystem block size
1db20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 57   */.      int nW
1db30 72 69 74 65 20 3d 20 30 3b 20 20 20 20 20 20 20  rite = 0;       
1db40 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1db50 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e  of bytes written
1db60 20 62 79 20 73 65 65 6b 41 6e 64 57 72 69 74 65   by seekAndWrite
1db70 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69 57   */.      i64 iW
1db80 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  rite;           
1db90 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 6f 66        /* Next of
1dba0 66 73 65 74 20 74 6f 20 77 72 69 74 65 20 74 6f  fset to write to
1dbb0 20 2a 2f 0a 0a 20 20 20 20 20 20 69 57 72 69 74   */..      iWrit
1dbc0 65 20 3d 20 28 62 75 66 2e 73 74 5f 73 69 7a 65  e = (buf.st_size
1dbd0 2f 6e 42 6c 6b 29 2a 6e 42 6c 6b 20 2b 20 6e 42  /nBlk)*nBlk + nB
1dbe0 6c 6b 20 2d 20 31 3b 0a 20 20 20 20 20 20 61 73  lk - 1;.      as
1dbf0 73 65 72 74 28 20 69 57 72 69 74 65 3e 3d 62 75  sert( iWrite>=bu
1dc00 66 2e 73 74 5f 73 69 7a 65 20 29 3b 0a 20 20 20  f.st_size );.   
1dc10 20 20 20 61 73 73 65 72 74 28 20 28 28 69 57 72     assert( ((iWr
1dc20 69 74 65 2b 31 29 25 6e 42 6c 6b 29 3d 3d 30 20  ite+1)%nBlk)==0 
1dc30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 2f 2a 6e  );.      for(/*n
1dc40 6f 2d 6f 70 2a 2f 3b 20 69 57 72 69 74 65 3c 6e  o-op*/; iWrite<n
1dc50 53 69 7a 65 2b 6e 42 6c 6b 2d 31 3b 20 69 57 72  Size+nBlk-1; iWr
1dc60 69 74 65 2b 3d 6e 42 6c 6b 20 29 7b 0a 20 20 20  ite+=nBlk ){.   
1dc70 20 20 20 20 20 69 66 28 20 69 57 72 69 74 65 3e       if( iWrite>
1dc80 3d 6e 53 69 7a 65 20 29 20 69 57 72 69 74 65 20  =nSize ) iWrite 
1dc90 3d 20 6e 53 69 7a 65 20 2d 20 31 3b 0a 20 20 20  = nSize - 1;.   
1dca0 20 20 20 20 20 6e 57 72 69 74 65 20 3d 20 73 65       nWrite = se
1dcb0 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c 65  ekAndWrite(pFile
1dcc0 2c 20 69 57 72 69 74 65 2c 20 22 22 2c 20 31 29  , iWrite, "", 1)
1dcd0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 57  ;.        if( nW
1dce0 72 69 74 65 21 3d 31 20 29 20 72 65 74 75 72 6e  rite!=1 ) return
1dcf0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52   SQLITE_IOERR_WR
1dd00 49 54 45 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  ITE;.      }.#en
1dd10 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23  dif.    }.  }..#
1dd20 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
1dd30 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20  AP_SIZE>0.  if( 
1dd40 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d  pFile->mmapSizeM
1dd50 61 78 3e 30 20 26 26 20 6e 42 79 74 65 3e 70 46  ax>0 && nByte>pF
1dd60 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
1dd70 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
1dd80 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68   if( pFile->szCh
1dd90 75 6e 6b 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20  unk<=0 ){.      
1dda0 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e  if( robust_ftrun
1ddb0 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 6e  cate(pFile->h, n
1ddc0 42 79 74 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Byte) ){.       
1ddd0 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
1dde0 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20  pFile, errno);. 
1ddf0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e         return un
1de00 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
1de10 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
1de20 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70  , "ftruncate", p
1de30 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
1de40 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1de50 20 72 63 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c   rc = unixMapfil
1de60 65 28 70 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b  e(pFile, nByte);
1de70 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1de80 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
1de90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1dea0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41 72  }../*.** If *pAr
1deb0 67 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e  g is initially n
1dec0 65 67 61 74 69 76 65 20 74 68 65 6e 20 74 68 69  egative then thi
1ded0 73 20 69 73 20 61 20 71 75 65 72 79 2e 20 20 53  s is a query.  S
1dee0 65 74 20 2a 70 41 72 67 20 74 6f 0a 2a 2a 20 31  et *pArg to.** 1
1def0 20 6f 72 20 30 20 64 65 70 65 6e 64 69 6e 67 20   or 0 depending 
1df00 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
1df10 74 20 62 69 74 20 6d 61 73 6b 20 6f 66 20 70 46  t bit mask of pF
1df20 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 69  ile->ctrlFlags i
1df30 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  s set..**.** If 
1df40 2a 70 41 72 67 20 69 73 20 30 20 6f 72 20 31 2c  *pArg is 0 or 1,
1df50 20 74 68 65 6e 20 63 6c 65 61 72 20 6f 72 20 73   then clear or s
1df60 65 74 20 74 68 65 20 6d 61 73 6b 20 62 69 74 20  et the mask bit 
1df70 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  of pFile->ctrlFl
1df80 61 67 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ags..*/.static v
1df90 6f 69 64 20 75 6e 69 78 4d 6f 64 65 42 69 74 28  oid unixModeBit(
1dfa0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
1dfb0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d   unsigned char m
1dfc0 61 73 6b 2c 20 69 6e 74 20 2a 70 41 72 67 29 7b  ask, int *pArg){
1dfd0 0a 20 20 69 66 28 20 2a 70 41 72 67 3c 30 20 29  .  if( *pArg<0 )
1dfe0 7b 0a 20 20 20 20 2a 70 41 72 67 20 3d 20 28 70  {.    *pArg = (p
1dff0 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
1e000 26 20 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 7d 65  & mask)!=0;.  }e
1e010 6c 73 65 20 69 66 28 20 28 2a 70 41 72 67 29 3d  lse if( (*pArg)=
1e020 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  =0 ){.    pFile-
1e030 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 6d  >ctrlFlags &= ~m
1e040 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ask;.  }else{.  
1e050 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61    pFile->ctrlFla
1e060 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a  gs |= mask;.  }.
1e070 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65  }../* Forward de
1e080 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61  claration */.sta
1e090 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 54  tic int unixGetT
1e0a0 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66  empname(int nBuf
1e0b0 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 3b 0a 0a  , char *zBuf);..
1e0c0 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f  /*.** Informatio
1e0d0 6e 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f 66  n and control of
1e0e0 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 68 61   an open file ha
1e0f0 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndle..*/.static 
1e100 69 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74  int unixFileCont
1e110 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  rol(sqlite3_file
1e120 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f   *id, int op, vo
1e130 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 75 6e 69  id *pArg){.  uni
1e140 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
1e150 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
1e160 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
1e170 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1e180 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b  NTL_LOCKSTATE: {
1e190 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41  .      *(int*)pA
1e1a0 72 67 20 3d 20 70 46 69 6c 65 2d 3e 65 46 69 6c  rg = pFile->eFil
1e1b0 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 72 65 74  eLock;.      ret
1e1c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1e1d0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1e1e0 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 41 53 54 5f  LITE_FCNTL_LAST_
1e1f0 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a  ERRNO: {.      *
1e200 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69  (int*)pArg = pFi
1e210 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  le->lastErrno;. 
1e220 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1e230 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1e240 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1e250 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b  TL_CHUNK_SIZE: {
1e260 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 7a  .      pFile->sz
1e270 43 68 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a 29  Chunk = *(int *)
1e280 70 41 72 67 3b 0a 20 20 20 20 20 20 72 65 74 75  pArg;.      retu
1e290 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1e2a0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
1e2b0 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48  ITE_FCNTL_SIZE_H
1e2c0 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  INT: {.      int
1e2d0 20 72 63 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c   rc;.      Simul
1e2e0 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
1e2f0 28 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  (1);.      rc = 
1e300 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 70 46  fcntlSizeHint(pF
1e310 69 6c 65 2c 20 2a 28 69 36 34 20 2a 29 70 41 72  ile, *(i64 *)pAr
1e320 67 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  g);.      Simula
1e330 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
1e340 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
1e350 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63   rc;.    }.    c
1e360 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1e370 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a  _PERSIST_WAL: {.
1e380 20 20 20 20 20 20 75 6e 69 78 4d 6f 64 65 42 69        unixModeBi
1e390 74 28 70 46 69 6c 65 2c 20 55 4e 49 58 46 49 4c  t(pFile, UNIXFIL
1e3a0 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20 28  E_PERSIST_WAL, (
1e3b0 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20  int*)pArg);.    
1e3c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e3d0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
1e3e0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1e3f0 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
1e400 49 54 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69  ITE: {.      uni
1e410 78 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20  xModeBit(pFile, 
1e420 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 2c 20 28  UNIXFILE_PSOW, (
1e430 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20  int*)pArg);.    
1e440 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e450 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
1e460 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1e470 56 46 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20  VFSNAME: {.     
1e480 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d   *(char**)pArg =
1e490 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
1e4a0 28 22 25 73 22 2c 20 70 46 69 6c 65 2d 3e 70 56  ("%s", pFile->pV
1e4b0 66 73 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  fs->zName);.    
1e4c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e4d0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
1e4e0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1e4f0 54 45 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a  TEMPFILENAME: {.
1e500 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 46 69        char *zTFi
1e510 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  le = sqlite3_mal
1e520 6c 6f 63 36 34 28 20 70 46 69 6c 65 2d 3e 70 56  loc64( pFile->pV
1e530 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29  fs->mxPathname )
1e540 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 54 46 69  ;.      if( zTFi
1e550 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 6e  le ){.        un
1e560 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 46  ixGetTempname(pF
1e570 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ile->pVfs->mxPat
1e580 68 6e 61 6d 65 2c 20 7a 54 46 69 6c 65 29 3b 0a  hname, zTFile);.
1e590 20 20 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a          *(char**
1e5a0 29 70 41 72 67 20 3d 20 7a 54 46 69 6c 65 3b 0a  )pArg = zTFile;.
1e5b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
1e5c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1e5d0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1e5e0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 48 41 53 5f  QLITE_FCNTL_HAS_
1e5f0 4d 4f 56 45 44 3a 20 7b 0a 20 20 20 20 20 20 2a  MOVED: {.      *
1e600 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 66 69 6c  (int*)pArg = fil
1e610 65 48 61 73 4d 6f 76 65 64 28 70 46 69 6c 65 29  eHasMoved(pFile)
1e620 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1e630 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1e640 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
1e650 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 63  MAP_SIZE>0.    c
1e660 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1e670 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20  _MMAP_SIZE: {.  
1e680 20 20 20 20 69 36 34 20 6e 65 77 4c 69 6d 69 74      i64 newLimit
1e690 20 3d 20 2a 28 69 36 34 2a 29 70 41 72 67 3b 0a   = *(i64*)pArg;.
1e6a0 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53        int rc = S
1e6b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1e6c0 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 73 71 6c  if( newLimit>sql
1e6d0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1e6e0 2e 6d 78 4d 6d 61 70 20 29 7b 0a 20 20 20 20 20  .mxMmap ){.     
1e6f0 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 73 71     newLimit = sq
1e700 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1e710 67 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20  g.mxMmap;.      
1e720 7d 0a 20 20 20 20 20 20 2a 28 69 36 34 2a 29 70  }.      *(i64*)p
1e730 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  Arg = pFile->mma
1e740 70 53 69 7a 65 4d 61 78 3b 0a 20 20 20 20 20 20  pSizeMax;.      
1e750 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20  if( newLimit>=0 
1e760 26 26 20 6e 65 77 4c 69 6d 69 74 21 3d 70 46 69  && newLimit!=pFi
1e770 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20  le->mmapSizeMax 
1e780 26 26 20 70 46 69 6c 65 2d 3e 6e 46 65 74 63 68  && pFile->nFetch
1e790 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Out==0 ){.      
1e7a0 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a    pFile->mmapSiz
1e7b0 65 4d 61 78 20 3d 20 6e 65 77 4c 69 6d 69 74 3b  eMax = newLimit;
1e7c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46 69  .        if( pFi
1e7d0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29  le->mmapSize>0 )
1e7e0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69 78  {.          unix
1e7f0 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29  Unmapfile(pFile)
1e800 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1e810 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 69   unixMapfile(pFi
1e820 6c 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20  le, -1);.       
1e830 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1e840 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1e850 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  }.#endif.#ifdef 
1e860 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
1e870 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61   /* The pager ca
1e880 6c 6c 73 20 74 68 69 73 20 6d 65 74 68 6f 64 20  lls this method 
1e890 74 6f 20 73 69 67 6e 61 6c 20 74 68 61 74 20 69  to signal that i
1e8a0 74 20 68 61 73 20 64 6f 6e 65 0a 20 20 20 20 2a  t has done.    *
1e8b0 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64  * a rollback and
1e8c0 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
1e8d0 73 65 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  se is therefore 
1e8e0 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 0a 20 20  unchanged and.  
1e8f0 20 20 2a 2a 20 69 74 20 68 65 6e 63 65 20 69 74    ** it hence it
1e900 20 69 73 20 4f 4b 20 66 6f 72 20 74 68 65 20 74   is OK for the t
1e910 72 61 6e 73 61 63 74 69 6f 6e 20 63 68 61 6e 67  ransaction chang
1e920 65 20 63 6f 75 6e 74 65 72 20 74 6f 20 62 65 0a  e counter to be.
1e930 20 20 20 20 2a 2a 20 75 6e 63 68 61 6e 67 65 64      ** unchanged
1e940 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1e950 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44  e SQLITE_FCNTL_D
1e960 42 5f 55 4e 43 48 41 4e 47 45 44 3a 20 7b 0a 20  B_UNCHANGED: {. 
1e970 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a       ((unixFile*
1e980 29 69 64 29 2d 3e 64 62 55 70 64 61 74 65 20 3d  )id)->dbUpdate =
1e990 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
1e9a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1e9b0 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  }.#endif.#if SQL
1e9c0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1e9d0 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
1e9e0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
1e9f0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1ea00 43 4e 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  CNTL_SET_LOCKPRO
1ea10 58 59 46 49 4c 45 3a 0a 20 20 20 20 63 61 73 65  XYFILE:.    case
1ea20 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 47 45   SQLITE_FCNTL_GE
1ea30 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a  T_LOCKPROXYFILE:
1ea40 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
1ea50 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c  proxyFileControl
1ea60 28 69 64 2c 6f 70 2c 70 41 72 67 29 3b 0a 20 20  (id,op,pArg);.  
1ea70 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
1ea80 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1ea90 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
1eaa0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
1eab0 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  */.  }.  return 
1eac0 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b  SQLITE_NOTFOUND;
1ead0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1eae0 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
1eaf0 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65   in bytes of the
1eb00 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63   underlying bloc
1eb10 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20  k device for.** 
1eb20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
1eb30 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f  le. This is almo
1eb40 73 74 20 61 6c 77 61 79 73 20 35 31 32 20 62 79  st always 512 by
1eb50 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a  tes, but may be.
1eb60 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f  ** larger for so
1eb70 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a  me devices..**.*
1eb80 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73  * SQLite code as
1eb90 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74  sumes this funct
1eba0 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e  ion cannot fail.
1ebb0 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73   It also assumes
1ebc0 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20   that.** if two 
1ebd0 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65  files are create
1ebe0 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69  d in the same fi
1ebf0 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74  le-system direct
1ec00 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64  ory (i.e..** a d
1ec10 61 74 61 62 61 73 65 20 61 6e 64 20 69 74 73 20  atabase and its 
1ec20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68  journal file) th
1ec30 61 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  at the sector si
1ec40 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a  ze will be the.*
1ec50 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e  * same for both.
1ec60 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 51 4e  .*/.#ifndef __QN
1ec70 58 4e 54 4f 5f 5f 20 0a 73 74 61 74 69 63 20 69  XNTO__ .static i
1ec80 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a  nt unixSectorSiz
1ec90 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
1eca0 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53  NotUsed){.  UNUS
1ecb0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
1ecc0 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
1ecd0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53  SQLITE_DEFAULT_S
1ece0 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 23 65  ECTOR_SIZE;.}.#e
1ecf0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
1ed00 66 6f 6c 6c 6f 77 69 6e 67 20 76 65 72 73 69 6f  following versio
1ed10 6e 20 6f 66 20 75 6e 69 78 53 65 63 74 6f 72 53  n of unixSectorS
1ed20 69 7a 65 28 29 20 69 73 20 6f 70 74 69 6d 69 7a  ize() is optimiz
1ed30 65 64 20 66 6f 72 20 51 4e 58 2e 0a 2a 2f 0a 23  ed for QNX..*/.#
1ed40 69 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f  ifdef __QNXNTO__
1ed50 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 64  .#include <sys/d
1ed60 63 6d 64 5f 62 6c 6b 2e 68 3e 0a 23 69 6e 63 6c  cmd_blk.h>.#incl
1ed70 75 64 65 20 3c 73 79 73 2f 73 74 61 74 76 66 73  ude <sys/statvfs
1ed80 2e 68 3e 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .h>.static int u
1ed90 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28 73 71  nixSectorSize(sq
1eda0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
1edb0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
1edc0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
1edd0 69 64 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  id;.  if( pFile-
1ede0 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 3d 20 30  >sectorSize == 0
1edf0 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73   ){.    struct s
1ee00 74 61 74 76 66 73 20 66 73 49 6e 66 6f 3b 0a 20  tatvfs fsInfo;. 
1ee10 20 20 20 20 20 20 0a 20 20 20 20 2f 2a 20 53 65        .    /* Se
1ee20 74 20 64 65 66 61 75 6c 74 73 20 66 6f 72 20 6e  t defaults for n
1ee30 6f 6e 2d 73 75 70 70 6f 72 74 65 64 20 66 69 6c  on-supported fil
1ee40 65 73 79 73 74 65 6d 73 20 2a 2f 0a 20 20 20 20  esystems */.    
1ee50 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
1ee60 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  e = SQLITE_DEFAU
1ee70 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  LT_SECTOR_SIZE;.
1ee80 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63      pFile->devic
1ee90 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1eea0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 66 73   = 0;.    if( fs
1eeb0 74 61 74 76 66 73 28 70 46 69 6c 65 2d 3e 68 2c  tatvfs(pFile->h,
1eec0 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20   &fsInfo) == -1 
1eed0 29 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ) {.      return
1eee0 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
1eef0 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ze;.    }..    i
1ef00 66 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66  f( !strcmp(fsInf
1ef10 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 74  o.f_basetype, "t
1ef20 6d 70 22 29 20 29 20 7b 0a 20 20 20 20 20 20 70  mp") ) {.      p
1ef30 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
1ef40 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a   = fsInfo.f_bsiz
1ef50 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e;.      pFile->
1ef60 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
1ef70 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20  stics =.        
1ef80 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
1ef90 4d 49 43 34 4b 20 7c 20 20 20 20 20 20 20 2f 2a  MIC4K |       /*
1efa0 20 41 6c 6c 20 72 61 6d 20 66 69 6c 65 73 79 73   All ram filesys
1efb0 74 65 6d 20 77 72 69 74 65 73 20 61 72 65 20 61  tem writes are a
1efc0 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20  tomic */.       
1efd0 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41   SQLITE_IOCAP_SA
1efe0 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f  FE_APPEND |    /
1eff0 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69  * growing the fi
1f000 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75  le does not occu
1f010 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20  r until.        
1f020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1f040 20 74 68 65 20 77 72 69 74 65 20 73 75 63 63 65   the write succe
1f050 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  eds */.        S
1f060 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
1f070 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20  ENTIAL |     /* 
1f080 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74  The ram filesyst
1f090 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20  em has no write 
1f0a0 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20  behind.         
1f0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1f0d0 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65 64  so it is ordered
1f0e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20   */.        0;. 
1f0f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
1f100 73 74 72 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73  str(fsInfo.f_bas
1f110 65 74 79 70 65 2c 20 22 65 74 66 73 22 29 20 29  etype, "etfs") )
1f120 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
1f130 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e  ectorSize = fsIn
1f140 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20  fo.f_bsize;.    
1f150 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43    pFile->deviceC
1f160 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d  haracteristics =
1f170 0a 20 20 20 20 20 20 20 20 2f 2a 20 65 74 66 73  .        /* etfs
1f180 20 63 6c 75 73 74 65 72 20 73 69 7a 65 20 77 72   cluster size wr
1f190 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63 20  ites are atomic 
1f1a0 2a 2f 0a 20 20 20 20 20 20 20 20 28 70 46 69 6c  */.        (pFil
1f1b0 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20  e->sectorSize / 
1f1c0 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43  512 * SQLITE_IOC
1f1d0 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 7c 0a  AP_ATOMIC512) |.
1f1e0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
1f1f0 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
1f200 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67   |    /* growing
1f210 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e   the file does n
1f220 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20  ot occur until. 
1f230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f250 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74       ** the writ
1f260 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20  e succeeds */.  
1f270 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
1f280 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20  AP_SEQUENTIAL | 
1f290 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66      /* The ram f
1f2a0 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f  ilesystem has no
1f2b0 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20   write behind.  
1f2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2e0 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20      ** so it is 
1f2f0 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20  ordered */.     
1f300 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20     0;.    }else 
1f310 69 66 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e  if( !strcmp(fsIn
1f320 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22  fo.f_basetype, "
1f330 71 6e 78 36 22 29 20 29 7b 0a 20 20 20 20 20 20  qnx6") ){.      
1f340 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
1f350 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69  e = fsInfo.f_bsi
1f360 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ze;.      pFile-
1f370 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72  >deviceCharacter
1f380 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20  istics =.       
1f390 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54   SQLITE_IOCAP_AT
1f3a0 4f 4d 49 43 20 7c 20 20 20 20 20 20 20 20 20 2f  OMIC |         /
1f3b0 2a 20 41 6c 6c 20 66 69 6c 65 73 79 73 74 65 6d  * All filesystem
1f3c0 20 77 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d   writes are atom
1f3d0 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51  ic */.        SQ
1f3e0 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
1f3f0 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67  APPEND |    /* g
1f400 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20  rowing the file 
1f410 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75  does not occur u
1f420 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20  ntil.           
1f430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f440 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
1f450 65 20 77 72 69 74 65 20 73 75 63 63 65 65 64 73  e write succeeds
1f460 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49   */.        SQLI
1f470 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
1f480 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65  IAL |     /* The
1f490 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20   ram filesystem 
1f4a0 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68  has no write beh
1f4b0 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ind.            
1f4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20            ** so 
1f4e0 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f  it is ordered */
1f4f0 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20  .        0;.    
1f500 7d 65 6c 73 65 20 69 66 28 20 21 73 74 72 63 6d  }else if( !strcm
1f510 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74  p(fsInfo.f_baset
1f520 79 70 65 2c 20 22 71 6e 78 34 22 29 20 29 7b 0a  ype, "qnx4") ){.
1f530 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63        pFile->sec
1f540 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f  torSize = fsInfo
1f550 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20  .f_bsize;.      
1f560 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61  pFile->deviceCha
1f570 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20  racteristics =. 
1f580 20 20 20 20 20 20 20 2f 2a 20 66 75 6c 6c 20 62         /* full b
1f590 69 74 73 65 74 20 6f 66 20 61 74 6f 6d 69 63 73  itset of atomics
1f5a0 20 66 72 6f 6d 20 6d 61 78 20 73 65 63 74 6f 72   from max sector
1f5b0 20 73 69 7a 65 20 61 6e 64 20 73 6d 61 6c 6c 65   size and smalle
1f5c0 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 28 28 70  r */.        ((p
1f5d0 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
1f5e0 20 2f 20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f   / 512 * SQLITE_
1f5f0 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 29  IOCAP_ATOMIC512)
1f600 20 3c 3c 20 31 29 20 2d 20 32 20 7c 0a 20 20 20   << 1) - 2 |.   
1f610 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
1f620 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20  P_SEQUENTIAL |  
1f630 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69     /* The ram fi
1f640 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20  lesystem has no 
1f650 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20  write behind.   
1f660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f680 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f     ** so it is o
1f690 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20  rdered */.      
1f6a0 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69    0;.    }else i
1f6b0 66 28 20 73 74 72 73 74 72 28 66 73 49 6e 66 6f  f( strstr(fsInfo
1f6c0 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 64 6f  .f_basetype, "do
1f6d0 73 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  s") ){.      pFi
1f6e0 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  le->sectorSize =
1f6f0 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b   fsInfo.f_bsize;
1f700 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65  .      pFile->de
1f710 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1f720 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a  ics =.        /*
1f730 20 66 75 6c 6c 20 62 69 74 73 65 74 20 6f 66 20   full bitset of 
1f740 61 74 6f 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78  atomics from max
1f750 20 73 65 63 74 6f 72 20 73 69 7a 65 20 61 6e 64   sector size and
1f760 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20   smaller */.    
1f770 20 20 20 20 28 28 70 46 69 6c 65 2d 3e 73 65 63      ((pFile->sec
1f780 74 6f 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20  torSize / 512 * 
1f790 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
1f7a0 4d 49 43 35 31 32 29 20 3c 3c 20 31 29 20 2d 20  MIC512) << 1) - 
1f7b0 32 20 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49  2 |.        SQLI
1f7c0 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
1f7d0 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65  IAL |     /* The
1f7e0 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20   ram filesystem 
1f7f0 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68  has no write beh
1f800 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ind.            
1f810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f820 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20            ** so 
1f830 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f  it is ordered */
1f840 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20  .        0;.    
1f850 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69  }else{.      pFi
1f860 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63  le->deviceCharac
1f870 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20  teristics =.    
1f880 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
1f890 5f 41 54 4f 4d 49 43 35 31 32 20 7c 20 20 20 20  _ATOMIC512 |    
1f8a0 20 20 2f 2a 20 62 6c 6f 63 6b 73 20 61 72 65 20    /* blocks are 
1f8b0 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20  atomic */.      
1f8c0 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53    SQLITE_IOCAP_S
1f8d0 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20  AFE_APPEND |    
1f8e0 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66  /* growing the f
1f8f0 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63  ile does not occ
1f900 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20  ur until.       
1f910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1f930 2a 20 74 68 65 20 77 72 69 74 65 20 73 75 63 63  * the write succ
1f940 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  eeds */.        
1f950 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f  0;.    }.  }.  /
1f960 2a 20 4c 61 73 74 20 63 68 61 6e 63 65 20 76 65  * Last chance ve
1f970 72 69 66 69 63 61 74 69 6f 6e 2e 20 20 49 66 20  rification.  If 
1f980 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  the sector size 
1f990 69 73 6e 27 74 20 61 20 6d 75 6c 74 69 70 6c 65  isn't a multiple
1f9a0 20 6f 66 20 35 31 32 0a 20 20 2a 2a 20 74 68 65   of 512.  ** the
1f9b0 6e 20 69 74 20 69 73 6e 27 74 20 76 61 6c 69 64  n it isn't valid
1f9c0 2e 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  .*/.  if( pFile-
1f9d0 3e 73 65 63 74 6f 72 53 69 7a 65 20 25 20 35 31  >sectorSize % 51
1f9e0 32 20 21 3d 20 30 20 29 7b 0a 20 20 20 20 70 46  2 != 0 ){.    pF
1f9f0 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
1fa00 63 74 65 72 69 73 74 69 63 73 20 3d 20 30 3b 0a  cteristics = 0;.
1fa10 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f      pFile->secto
1fa20 72 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44  rSize = SQLITE_D
1fa30 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49  EFAULT_SECTOR_SI
1fa40 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ZE;.  }.  return
1fa50 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
1fa60 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ze;.}.#endif /* 
1fa70 5f 5f 51 4e 58 4e 54 4f 5f 5f 20 2a 2f 0a 0a 2f  __QNXNTO__ */../
1fa80 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1fa90 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  device character
1faa0 69 73 74 69 63 73 20 66 6f 72 20 74 68 65 20 66  istics for the f
1fab0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ile..**.** This 
1fac0 56 46 53 20 69 73 20 73 65 74 20 75 70 20 74 6f  VFS is set up to
1fad0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1fae0 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f  OCAP_POWERSAFE_O
1faf0 56 45 52 57 52 49 54 45 20 62 79 20 64 65 66 61  VERWRITE by defa
1fb00 75 6c 74 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c  ult..** However,
1fb10 20 74 68 61 74 20 63 68 6f 69 63 65 20 69 73 20   that choice is 
1fb20 63 6f 6e 74 72 6f 76 65 72 73 69 61 6c 20 73 69  controversial si
1fb30 6e 63 65 20 74 65 63 68 6e 69 63 61 6c 6c 79 20  nce technically 
1fb40 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a  the underlying.*
1fb50 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20 64 6f  * file system do
1fb60 65 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 70 72  es not always pr
1fb70 6f 76 69 64 65 20 70 6f 77 65 72 73 61 66 65 20  ovide powersafe 
1fb80 6f 76 65 72 77 72 69 74 65 73 2e 20 20 28 49 6e  overwrites.  (In
1fb90 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c   other.** words,
1fba0 20 61 66 74 65 72 20 61 20 70 6f 77 65 72 2d 6c   after a power-l
1fbb0 6f 73 73 20 65 76 65 6e 74 2c 20 70 61 72 74 73  oss event, parts
1fbc0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 68 61   of the file tha
1fbd0 74 20 77 65 72 65 20 6e 65 76 65 72 0a 2a 2a 20  t were never.** 
1fbe0 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20 65 6e  written might en
1fbf0 64 20 75 70 20 62 65 69 6e 67 20 61 6c 74 65 72  d up being alter
1fc00 65 64 2e 29 20 20 48 6f 77 65 76 65 72 2c 20 6e  ed.)  However, n
1fc10 6f 6e 2d 50 53 4f 57 20 62 65 68 61 76 69 6f 72  on-PSOW behavior
1fc20 20 69 73 20 76 65 72 79 2c 0a 2a 2a 20 76 65 72   is very,.** ver
1fc30 79 20 72 61 72 65 2e 20 20 41 6e 64 20 61 73 73  y rare.  And ass
1fc40 65 72 74 69 6e 67 20 50 53 4f 57 20 6d 61 6b 65  erting PSOW make
1fc50 73 20 61 20 6c 61 72 67 65 20 72 65 64 75 63 74  s a large reduct
1fc60 69 6f 6e 20 69 6e 20 74 68 65 20 61 6d 6f 75 6e  ion in the amoun
1fc70 74 0a 2a 2a 20 6f 66 20 72 65 71 75 69 72 65 64  t.** of required
1fc80 20 49 2f 4f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c   I/O for journal
1fc90 69 6e 67 2c 20 73 69 6e 63 65 20 61 20 6c 6f 74  ing, since a lot
1fca0 20 6f 66 20 70 61 64 64 69 6e 67 20 69 73 20 65   of padding is e
1fcb0 6c 69 6d 69 6e 61 74 65 64 2e 0a 2a 2a 20 20 48  liminated..**  H
1fcc0 65 6e 63 65 2c 20 77 68 69 6c 65 20 50 4f 57 45  ence, while POWE
1fcd0 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20  RSAFE_OVERWRITE 
1fce0 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74  is on by default
1fcf0 2c 20 74 68 65 72 65 20 69 73 20 61 20 66 69 6c  , there is a fil
1fd00 65 2d 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 61 76 61  e-control.** ava
1fd10 69 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e 20 69  ilable to turn i
1fd20 74 20 6f 66 66 20 61 6e 64 20 55 52 49 20 71 75  t off and URI qu
1fd30 65 72 79 20 70 61 72 61 6d 65 74 65 72 20 61 76  ery parameter av
1fd40 61 69 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e 20  ailable to turn 
1fd50 69 74 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69  it off..*/.stati
1fd60 63 20 69 6e 74 20 75 6e 69 78 44 65 76 69 63 65  c int unixDevice
1fd70 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
1fd80 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1fd90 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
1fda0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
1fdb0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
1fdc0 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f  #ifdef __QNXNTO_
1fdd0 5f 0a 20 20 69 66 28 20 70 2d 3e 73 65 63 74 6f  _.  if( p->secto
1fde0 72 53 69 7a 65 3d 3d 30 20 29 20 75 6e 69 78 53  rSize==0 ) unixS
1fdf0 65 63 74 6f 72 53 69 7a 65 28 69 64 29 3b 0a 20  ectorSize(id);. 
1fe00 20 72 63 20 3d 20 70 2d 3e 64 65 76 69 63 65 43   rc = p->deviceC
1fe10 68 61 72 61 63 74 65 72 69 73 74 69 63 73 3b 0a  haracteristics;.
1fe20 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e  #endif.  if( p->
1fe30 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
1fe40 46 49 4c 45 5f 50 53 4f 57 20 29 7b 0a 20 20 20  FILE_PSOW ){.   
1fe50 20 72 63 20 7c 3d 20 53 51 4c 49 54 45 5f 49 4f   rc |= SQLITE_IO
1fe60 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  CAP_POWERSAFE_OV
1fe70 45 52 57 52 49 54 45 3b 0a 20 20 7d 0a 20 20 72  ERWRITE;.  }.  r
1fe80 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
1fe90 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1fea0 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51  _OMIT_WAL) || SQ
1feb0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
1fec0 5a 45 3e 30 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ZE>0../*.** Retu
1fed0 72 6e 20 74 68 65 20 73 79 73 74 65 6d 20 70 61  rn the system pa
1fee0 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54  ge size..**.** T
1fef0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
1ff00 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65  uld not be calle
1ff10 64 20 64 69 72 65 63 74 6c 79 20 62 79 20 6f 74  d directly by ot
1ff20 68 65 72 20 63 6f 64 65 20 69 6e 20 74 68 69 73  her code in this
1ff30 20 66 69 6c 65 2e 20 0a 2a 2a 20 49 6e 73 74 65   file. .** Inste
1ff40 61 64 2c 20 69 74 20 73 68 6f 75 6c 64 20 62 65  ad, it should be
1ff50 20 63 61 6c 6c 65 64 20 76 69 61 20 6d 61 63 72   called via macr
1ff60 6f 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65 28  o osGetpagesize(
1ff70 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
1ff80 20 75 6e 69 78 47 65 74 70 61 67 65 73 69 7a 65   unixGetpagesize
1ff90 28 76 6f 69 64 29 7b 0a 23 69 66 20 4f 53 5f 56  (void){.#if OS_V
1ffa0 58 57 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e 20  XWORKS.  return 
1ffb0 31 30 32 34 3b 0a 23 65 6c 69 66 20 64 65 66 69  1024;.#elif defi
1ffc0 6e 65 64 28 5f 42 53 44 5f 53 4f 55 52 43 45 29  ned(_BSD_SOURCE)
1ffd0 0a 20 20 72 65 74 75 72 6e 20 67 65 74 70 61 67  .  return getpag
1ffe0 65 73 69 7a 65 28 29 3b 0a 23 65 6c 73 65 0a 20  esize();.#else. 
1fff0 20 72 65 74 75 72 6e 20 28 69 6e 74 29 73 79 73   return (int)sys
20000 63 6f 6e 66 28 5f 53 43 5f 50 41 47 45 53 49 5a  conf(_SC_PAGESIZ
20010 45 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 65  E);.#endif.}..#e
20020 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
20030 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c  (SQLITE_OMIT_WAL
20040 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ) || SQLITE_MAX_
20050 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a  MMAP_SIZE>0 */..
20060 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
20070 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 4f  MIT_WAL../*.** O
20080 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72 65  bject used to re
20090 70 72 65 73 65 6e 74 20 61 6e 20 73 68 61 72 65  present an share
200a0 64 20 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 2e  d memory buffer.
200b0 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75    .**.** When mu
200c0 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 20 61  ltiple threads a
200d0 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ll reference the
200e0 20 73 61 6d 65 20 77 61 6c 2d 69 6e 64 65 78 2c   same wal-index,
200f0 20 65 61 63 68 20 74 68 72 65 61 64 0a 2a 2a 20   each thread.** 
20100 68 61 73 20 69 74 73 20 6f 77 6e 20 75 6e 69 78  has its own unix
20110 53 68 6d 20 6f 62 6a 65 63 74 2c 20 62 75 74 20  Shm object, but 
20120 74 68 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74  they all point t
20130 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61  o a single insta
20140 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 75  nce.** of this u
20150 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
20160 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  t.  In other wor
20170 64 73 2c 20 65 61 63 68 20 77 61 6c 2d 69 6e 64  ds, each wal-ind
20180 65 78 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20  ex is opened.** 
20190 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72  only once per pr
201a0 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63  ocess..**.** Eac
201b0 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  h unixShmNode ob
201c0 6a 65 63 74 20 69 73 20 63 6f 6e 6e 65 63 74 65  ject is connecte
201d0 64 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 75 6e  d to a single un
201e0 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
201f0 63 74 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20  ct..** We could 
20200 63 6f 61 6c 65 73 63 65 20 74 68 69 73 20 6f 62  coalesce this ob
20210 6a 65 63 74 20 69 6e 74 6f 20 75 6e 69 78 49 6e  ject into unixIn
20220 6f 64 65 49 6e 66 6f 2c 20 62 75 74 20 74 68 61  odeInfo, but tha
20230 74 20 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20  t would mean.** 
20240 65 76 65 72 79 20 6f 70 65 6e 20 66 69 6c 65 20  every open file 
20250 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73  that does not us
20260 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
20270 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  (in other words,
20280 20 6d 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20 66 69   most.** open fi
20290 6c 65 73 29 20 77 6f 75 6c 64 20 68 61 76 65 20  les) would have 
202a0 74 6f 20 63 61 72 72 79 20 61 72 6f 75 6e 64 20  to carry around 
202b0 74 68 69 73 20 65 78 74 72 61 20 69 6e 66 6f 72  this extra infor
202c0 6d 61 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74  mation.  So.** t
202d0 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  he unixInodeInfo
202e0 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73   object contains
202f0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
20300 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f  is unixShmNode o
20310 62 6a 65 63 74 0a 2a 2a 20 61 6e 64 20 74 68 65  bject.** and the
20320 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
20330 65 63 74 20 69 73 20 63 72 65 61 74 65 64 20 6f  ect is created o
20340 6e 6c 79 20 77 68 65 6e 20 6e 65 65 64 65 64 2e  nly when needed.
20350 0a 2a 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78  .**.** unixMutex
20360 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74  Held() must be t
20370 72 75 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e  rue when creatin
20380 67 20 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a  g or destroying.
20390 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f  ** this object o
203a0 72 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20  r while reading 
203b0 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 66  or writing the f
203c0 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a  ollowing fields:
203d0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66  .**.**      nRef
203e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
203f0 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20  wing fields are 
20400 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20  read-only after 
20410 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72  the object is cr
20420 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20  eated:.** .**   
20430 20 20 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a     fid.**      z
20440 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45  Filename.**.** E
20450 69 74 68 65 72 20 75 6e 69 78 53 68 6d 4e 6f 64  ither unixShmNod
20460 65 2e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20  e.mutex must be 
20470 68 65 6c 64 20 6f 72 20 75 6e 69 78 53 68 6d 4e  held or unixShmN
20480 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a  ode.nRef==0 and.
20490 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  ** unixMutexHeld
204a0 28 29 20 69 73 20 74 72 75 65 20 77 68 65 6e 20  () is true when 
204b0 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
204c0 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65  ng any other fie
204d0 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74  ld.** in this st
204e0 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75  ructure..*/.stru
204f0 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 7b  ct unixShmNode {
20500 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
20510 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 2f 2a   *pInode;     /*
20520 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 74   unixInodeInfo t
20530 68 61 74 20 6f 77 6e 73 20 74 68 69 73 20 53 48  hat owns this SH
20540 4d 20 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  M node */.  sqli
20550 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
20560 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20  ;      /* Mutex 
20570 74 6f 20 61 63 63 65 73 73 20 74 68 69 73 20 6f  to access this o
20580 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20  bject */.  char 
20590 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  *zFilename;     
205a0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
205b0 20 74 68 65 20 6d 6d 61 70 70 65 64 20 66 69 6c   the mmapped fil
205c0 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20  e */.  int h;   
205d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205e0 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64    /* Open file d
205f0 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69  escriptor */.  i
20600 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20  nt szRegion;    
20610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
20620 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f  e of shared-memo
20630 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20  ry regions */.  
20640 75 31 36 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20  u16 nRegion;    
20650 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
20660 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70 52 65  ze of array apRe
20670 67 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 69 73 52  gion */.  u8 isR
20680 65 61 64 6f 6e 6c 79 3b 20 20 20 20 20 20 20 20  eadonly;        
20690 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
206a0 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 63  read-only */.  c
206b0 68 61 72 20 2a 2a 61 70 52 65 67 69 6f 6e 3b 20  har **apRegion; 
206c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
206d0 61 79 20 6f 66 20 6d 61 70 70 65 64 20 73 68 61  ay of mapped sha
206e0 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
206f0 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  ns */.  int nRef
20700 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20710 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
20720 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20  unixShm objects 
20730 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73  pointing to this
20740 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70   */.  unixShm *p
20750 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
20760 20 2f 2a 20 41 6c 6c 20 75 6e 69 78 53 68 6d 20   /* All unixShm 
20770 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67  objects pointing
20780 20 74 6f 20 74 68 69 73 20 2a 2f 0a 23 69 66 64   to this */.#ifd
20790 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
207a0 20 20 75 38 20 65 78 63 6c 4d 61 73 6b 3b 20 20    u8 exclMask;  
207b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
207c0 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76  Mask of exclusiv
207d0 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  e locks held */.
207e0 20 20 75 38 20 73 68 61 72 65 64 4d 61 73 6b 3b    u8 sharedMask;
207f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20800 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c  Mask of shared l
20810 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75  ocks held */.  u
20820 38 20 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20  8 nextShmId;    
20830 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
20840 74 20 61 76 61 69 6c 61 62 6c 65 20 75 6e 69 78  t available unix
20850 53 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a  Shm.id value */.
20860 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
20870 20 53 74 72 75 63 74 75 72 65 20 75 73 65 64 20   Structure used 
20880 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68  internally by th
20890 69 73 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64  is VFS to record
208a0 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e   the state of an
208b0 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20  .** open shared 
208c0 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f  memory connectio
208d0 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  n..**.** The fol
208e0 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72  lowing fields ar
208f0 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68  e initialized wh
20900 65 6e 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69  en this object i
20910 73 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a  s created and.**
20920 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74   are read-only t
20930 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a  hereafter:.**.**
20940 20 20 20 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c      unixShm.pFil
20950 65 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e  e.**    unixShm.
20960 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68  id.**.** All oth
20970 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 72 65  er fields are re
20980 61 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20 75  ad/write.  The u
20990 6e 69 78 53 68 6d 2e 70 46 69 6c 65 2d 3e 6d 75  nixShm.pFile->mu
209a0 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64  tex must be held
209b0 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73  .** while access
209c0 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69  ing any read/wri
209d0 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74  te fields..*/.st
209e0 72 75 63 74 20 75 6e 69 78 53 68 6d 20 7b 0a 20  ruct unixShm {. 
209f0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
20a00 68 6d 4e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 54  hmNode;     /* T
20a10 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 75 6e  he underlying un
20a20 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
20a30 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70   */.  unixShm *p
20a40 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20  Next;           
20a50 20 2f 2a 20 4e 65 78 74 20 75 6e 69 78 53 68 6d   /* Next unixShm
20a60 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 75   with the same u
20a70 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  nixShmNode */.  
20a80 75 38 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20  u8 hasMutex;    
20a90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
20aa0 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68  ue if holding th
20ab0 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6d 75  e unixShmNode mu
20ac0 74 65 78 20 2a 2f 0a 20 20 75 38 20 69 64 3b 20  tex */.  u8 id; 
20ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ae0 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69      /* Id of thi
20af0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  s connection wit
20b00 68 69 6e 20 69 74 73 20 75 6e 69 78 53 68 6d 4e  hin its unixShmN
20b10 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 73 68 61  ode */.  u16 sha
20b20 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  redMask;        
20b30 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73      /* Mask of s
20b40 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64  hared locks held
20b50 20 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d 61   */.  u16 exclMa
20b60 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
20b70 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c   /* Mask of excl
20b80 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64  usive locks held
20b90 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f   */.};../*.** Co
20ba0 6e 73 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72  nstants used for
20bb0 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66   locking.*/.#def
20bc0 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53  ine UNIX_SHM_BAS
20bd0 45 20 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f  E   ((22+SQLITE_
20be0 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20  SHM_NLOCK)*4)   
20bf0 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c        /* first l
20c00 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66  ock byte */.#def
20c10 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53  ine UNIX_SHM_DMS
20c20 20 20 20 20 28 55 4e 49 58 5f 53 48 4d 5f 42 41      (UNIX_SHM_BA
20c30 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c  SE+SQLITE_SHM_NL
20c40 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e  OCK)  /* deadman
20c50 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a   switch */../*.*
20c60 2a 20 41 70 70 6c 79 20 70 6f 73 69 78 20 61 64  * Apply posix ad
20c70 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72  visory locks for
20c80 20 61 6c 6c 20 62 79 74 65 73 20 66 72 6f 6d 20   all bytes from 
20c90 6f 66 73 74 20 74 68 72 6f 75 67 68 20 6f 66 73  ofst through ofs
20ca0 74 2b 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63  t+n-1..**.** Loc
20cb0 6b 73 20 62 6c 6f 63 6b 20 69 66 20 74 68 65 20  ks block if the 
20cc0 6d 61 73 6b 20 69 73 20 65 78 61 63 74 6c 79 20  mask is exactly 
20cd0 55 4e 49 58 5f 53 48 4d 5f 43 20 61 6e 64 20 61  UNIX_SHM_C and a
20ce0 72 65 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a  re non-blocking.
20cf0 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  ** otherwise..*/
20d00 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
20d10 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20  ShmSystemLock(. 
20d20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
20d30 2c 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20  ,       /* Open 
20d40 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68  connection to th
20d50 65 20 57 41 4c 20 66 69 6c 65 20 2a 2f 0a 20 20  e WAL file */.  
20d60 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20  int lockType,   
20d70 20 20 20 20 20 20 20 2f 2a 20 46 5f 55 4e 4c 43         /* F_UNLC
20d80 4b 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 72 20 46  K, F_RDLCK, or F
20d90 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20  _WRLCK */.  int 
20da0 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  ofst,           
20db0 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
20dc0 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   of the locking 
20dd0 72 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  range */.  int n
20de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20df0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
20e00 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  ytes to lock */.
20e10 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ){.  unixShmNode
20e20 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20 41   *pShmNode; /* A
20e30 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68  pply locks to th
20e40 69 73 20 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d  is open shared-m
20e50 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f  emory segment */
20e60 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
20e70 66 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  f;        /* The
20e80 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20   posix advisory 
20e90 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72  locking structur
20ea0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  e */.  int rc = 
20eb0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a  SQLITE_OK;    /*
20ec0 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72   Result code for
20ed0 6d 20 66 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20  m fcntl() */..  
20ee0 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68 65  /* Access to the
20ef0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
20f00 65 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65  ect is serialize
20f10 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
20f20 2a 2f 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  */.  pShmNode = 
20f30 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pFile->pInode->p
20f40 53 68 6d 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72  ShmNode;.  asser
20f50 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
20f60 5f 68 65 6c 64 28 70 53 68 6d 4e 6f 64 65 2d 3e  _held(pShmNode->
20f70 6d 75 74 65 78 29 20 7c 7c 20 70 53 68 6d 4e 6f  mutex) || pShmNo
20f80 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a  de->nRef==0 );..
20f90 20 20 2f 2a 20 53 68 61 72 65 64 20 6c 6f 63 6b    /* Shared lock
20fa0 73 20 6e 65 76 65 72 20 73 70 61 6e 20 6d 6f 72  s never span mor
20fb0 65 20 74 68 61 6e 20 6f 6e 65 20 62 79 74 65 20  e than one byte 
20fc0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d  */.  assert( n==
20fd0 31 20 7c 7c 20 6c 6f 63 6b 54 79 70 65 21 3d 46  1 || lockType!=F
20fe0 5f 52 44 4c 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  _RDLCK );..  /* 
20ff0 4c 6f 63 6b 73 20 61 72 65 20 77 69 74 68 69 6e  Locks are within
21000 20 72 61 6e 67 65 20 2a 2f 0a 20 20 61 73 73 65   range */.  asse
21010 72 74 28 20 6e 3e 3d 31 20 26 26 20 6e 3c 53 51  rt( n>=1 && n<SQ
21020 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29  LITE_SHM_NLOCK )
21030 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  ;..  if( pShmNod
21040 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 2f  e->h>=0 ){.    /
21050 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
21060 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74   locking paramet
21070 65 72 73 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  ers */.    memse
21080 74 28 26 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&f, 0, sizeof(
21090 66 29 29 3b 0a 20 20 20 20 66 2e 6c 5f 74 79 70  f));.    f.l_typ
210a0 65 20 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a 20 20  e = lockType;.  
210b0 20 20 66 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53    f.l_whence = S
210c0 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 66 2e 6c  EEK_SET;.    f.l
210d0 5f 73 74 61 72 74 20 3d 20 6f 66 73 74 3b 0a 20  _start = ofst;. 
210e0 20 20 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b 0a     f.l_len = n;.
210f0 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74  .    rc = osFcnt
21100 6c 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 46  l(pShmNode->h, F
21110 5f 53 45 54 4c 4b 2c 20 26 66 29 3b 0a 20 20 20  _SETLK, &f);.   
21120 20 72 63 20 3d 20 28 72 63 21 3d 28 2d 31 29 29   rc = (rc!=(-1))
21130 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53   ? SQLITE_OK : S
21140 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
21150 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
21160 20 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73 74 61   global lock sta
21170 74 65 20 61 6e 64 20 64 6f 20 64 65 62 75 67 20  te and do debug 
21180 74 72 61 63 69 6e 67 20 2a 2f 0a 23 69 66 64 65  tracing */.#ifde
21190 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
211a0 20 7b 20 75 31 36 20 6d 61 73 6b 3b 0a 20 20 4f   { u16 mask;.  O
211b0 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43  STRACE(("SHM-LOC
211c0 4b 20 22 29 29 3b 0a 20 20 6d 61 73 6b 20 3d 20  K "));.  mask = 
211d0 6f 66 73 74 3e 33 31 20 3f 20 30 78 66 66 66 66  ofst>31 ? 0xffff
211e0 20 3a 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29   : (1<<(ofst+n))
211f0 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20   - (1<<ofst);.  
21200 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
21210 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63  K ){.    if( loc
21220 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29  kType==F_UNLCK )
21230 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
21240 28 22 75 6e 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c  ("unlock %d ok",
21250 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70   ofst));.      p
21260 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73  ShmNode->exclMas
21270 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
21280 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72    pShmNode->shar
21290 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  edMask &= ~mask;
212a0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  .    }else if( l
212b0 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  ockType==F_RDLCK
212c0 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   ){.      OSTRAC
212d0 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 25 64  E(("read-lock %d
212e0 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20   ok", ofst));.  
212f0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78      pShmNode->ex
21300 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  clMask &= ~mask;
21310 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
21320 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d  >sharedMask |= m
21330 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ask;.    }else{.
21340 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f        assert( lo
21350 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20  ckType==F_WRLCK 
21360 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
21370 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64  (("write-lock %d
21380 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20   ok", ofst));.  
21390 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78      pShmNode->ex
213a0 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  clMask |= mask;.
213b0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
213c0 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d  sharedMask &= ~m
213d0 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ask;.    }.  }el
213e0 73 65 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b  se{.    if( lock
213f0 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  Type==F_UNLCK ){
21400 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
21410 22 75 6e 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65  "unlock %d faile
21420 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20  d", ofst));.    
21430 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79  }else if( lockTy
21440 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20  pe==F_RDLCK ){. 
21450 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 72       OSTRACE(("r
21460 65 61 64 2d 6c 6f 63 6b 20 66 61 69 6c 65 64 22  ead-lock failed"
21470 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
21480 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63       assert( loc
21490 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  kType==F_WRLCK )
214a0 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
214b0 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20  ("write-lock %d 
214c0 66 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b  failed", ofst));
214d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54  .    }.  }.  OST
214e0 52 41 43 45 28 28 22 20 2d 20 61 66 74 65 72 77  RACE((" - afterw
214f0 61 72 64 73 20 25 30 33 78 2c 25 30 33 78 5c 6e  ards %03x,%03x\n
21500 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 53  ",.           pS
21510 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61  hmNode->sharedMa
21520 73 6b 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78  sk, pShmNode->ex
21530 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 7d 0a 23 65  clMask));.  }.#e
21540 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
21550 63 3b 20 20 20 20 20 20 20 20 0a 7d 0a 0a 2f 2a  c;        .}../*
21560 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d  .** Return the m
21570 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  inimum number of
21580 20 33 32 4b 42 20 73 68 6d 20 72 65 67 69 6f 6e   32KB shm region
21590 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  s that should be
215a0 20 6d 61 70 70 65 64 20 61 74 0a 2a 2a 20 61 20   mapped at.** a 
215b0 74 69 6d 65 2c 20 61 73 73 75 6d 69 6e 67 20 74  time, assuming t
215c0 68 61 74 20 65 61 63 68 20 6d 61 70 70 69 6e 67  hat each mapping
215d0 20 6d 75 73 74 20 62 65 20 61 6e 20 69 6e 74 65   must be an inte
215e0 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20  ger multiple of 
215f0 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 73  the.** current s
21600 79 73 74 65 6d 20 70 61 67 65 2d 73 69 7a 65 2e  ystem page-size.
21610 0a 2a 2a 0a 2a 2a 20 55 73 75 61 6c 6c 79 2c 20  .**.** Usually, 
21620 74 68 69 73 20 69 73 20 31 2e 20 54 68 65 20 65  this is 1. The e
21630 78 63 65 70 74 69 6f 6e 20 73 65 65 6d 73 20 74  xception seems t
21640 6f 20 62 65 20 73 79 73 74 65 6d 73 20 74 68 61  o be systems tha
21650 74 20 61 72 65 20 63 6f 6e 66 69 67 75 72 65 64  t are configured
21660 0a 2a 2a 20 74 6f 20 75 73 65 20 36 34 4b 42 20  .** to use 64KB 
21670 70 61 67 65 73 20 2d 20 69 6e 20 74 68 69 73 20  pages - in this 
21680 63 61 73 65 20 65 61 63 68 20 6d 61 70 70 69 6e  case each mappin
21690 67 20 6d 75 73 74 20 63 6f 76 65 72 20 61 74 20  g must cover at 
216a0 6c 65 61 73 74 20 74 77 6f 0a 2a 2a 20 73 68 6d  least two.** shm
216b0 20 72 65 67 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61   regions..*/.sta
216c0 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 52  tic int unixShmR
216d0 65 67 69 6f 6e 50 65 72 4d 61 70 28 76 6f 69 64  egionPerMap(void
216e0 29 7b 0a 20 20 69 6e 74 20 73 68 6d 73 7a 20 3d  ){.  int shmsz =
216f0 20 33 32 2a 31 30 32 34 3b 20 20 20 20 20 20 20   32*1024;       
21700 20 20 20 20 20 2f 2a 20 53 48 4d 20 72 65 67 69       /* SHM regi
21710 6f 6e 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74  on size */.  int
21720 20 70 67 73 7a 20 3d 20 6f 73 47 65 74 70 61 67   pgsz = osGetpag
21730 65 73 69 7a 65 28 29 3b 20 20 20 2f 2a 20 53 79  esize();   /* Sy
21740 73 74 65 6d 20 70 61 67 65 20 73 69 7a 65 20 2a  stem page size *
21750 2f 0a 20 20 61 73 73 65 72 74 28 20 28 28 70 67  /.  assert( ((pg
21760 73 7a 2d 31 29 26 70 67 73 7a 29 3d 3d 30 20 29  sz-1)&pgsz)==0 )
21770 3b 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65  ;   /* Page size
21780 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72   must be a power
21790 20 6f 66 20 32 20 2a 2f 0a 20 20 69 66 28 20 70   of 2 */.  if( p
217a0 67 73 7a 3c 73 68 6d 73 7a 20 29 20 72 65 74 75  gsz<shmsz ) retu
217b0 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70  rn 1;.  return p
217c0 67 73 7a 2f 73 68 6d 73 7a 3b 0a 7d 0a 0a 2f 2a  gsz/shmsz;.}../*
217d0 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 75 6e  .** Purge the un
217e0 69 78 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69  ixShmNodeList li
217f0 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65  st of all entrie
21800 73 20 77 69 74 68 20 75 6e 69 78 53 68 6d 4e 6f  s with unixShmNo
21810 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a  de.nRef==0..**.*
21820 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20  * This is not a 
21830 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  VFS shared-memor
21840 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20  y method; it is 
21850 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  a utility functi
21860 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20  on called.** by 
21870 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  VFS shared-memor
21880 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74  y methods..*/.st
21890 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68  atic void unixSh
218a0 6d 50 75 72 67 65 28 75 6e 69 78 46 69 6c 65 20  mPurge(unixFile 
218b0 2a 70 46 64 29 7b 0a 20 20 75 6e 69 78 53 68 6d  *pFd){.  unixShm
218c0 4e 6f 64 65 20 2a 70 20 3d 20 70 46 64 2d 3e 70  Node *p = pFd->p
218d0 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b  Inode->pShmNode;
218e0 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d  .  assert( unixM
218f0 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20  utexHeld() );.  
21900 69 66 28 20 70 20 26 26 20 70 2d 3e 6e 52 65 66  if( p && p->nRef
21910 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ==0 ){.    int n
21920 53 68 6d 50 65 72 4d 61 70 20 3d 20 75 6e 69 78  ShmPerMap = unix
21930 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d 61 70 28  ShmRegionPerMap(
21940 29 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  );.    int i;.  
21950 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 49 6e    assert( p->pIn
21960 6f 64 65 3d 3d 70 46 64 2d 3e 70 49 6e 6f 64 65  ode==pFd->pInode
21970 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
21980 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75  mutex_free(p->mu
21990 74 65 78 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  tex);.    for(i=
219a0 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b  0; i<p->nRegion;
219b0 20 69 2b 3d 6e 53 68 6d 50 65 72 4d 61 70 29 7b   i+=nShmPerMap){
219c0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 68 3e  .      if( p->h>
219d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 73  =0 ){.        os
219e0 4d 75 6e 6d 61 70 28 70 2d 3e 61 70 52 65 67 69  Munmap(p->apRegi
219f0 6f 6e 5b 69 5d 2c 20 70 2d 3e 73 7a 52 65 67 69  on[i], p->szRegi
21a00 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  on);.      }else
21a10 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
21a20 33 5f 66 72 65 65 28 70 2d 3e 61 70 52 65 67 69  3_free(p->apRegi
21a30 6f 6e 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  on[i]);.      }.
21a40 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
21a50 33 5f 66 72 65 65 28 70 2d 3e 61 70 52 65 67 69  3_free(p->apRegi
21a60 6f 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  on);.    if( p->
21a70 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 6f  h>=0 ){.      ro
21a80 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 64 2c 20  bust_close(pFd, 
21a90 70 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  p->h, __LINE__);
21aa0 0a 20 20 20 20 20 20 70 2d 3e 68 20 3d 20 2d 31  .      p->h = -1
21ab0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70  ;.    }.    p->p
21ac0 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20  Inode->pShmNode 
21ad0 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
21ae0 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a  _free(p);.  }.}.
21af0 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 73 68  ./*.** Open a sh
21b00 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61  ared-memory area
21b10 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
21b20 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
21b30 69 6c 65 20 70 44 62 46 64 2e 20 20 0a 2a 2a 20  ile pDbFd.  .** 
21b40 54 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20  This particular 
21b50 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75  implementation u
21b60 73 65 73 20 6d 6d 61 70 70 65 64 20 66 69 6c 65  ses mmapped file
21b70 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6c  s..**.** The fil
21b80 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
21b90 65 6e 74 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ent shared-memor
21ba0 79 20 69 73 20 69 6e 20 74 68 65 20 73 61 6d 65  y is in the same
21bb0 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 61 73   directory.** as
21bc0 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
21bd0 73 65 20 66 69 6c 65 20 61 6e 64 20 68 61 73 20  se file and has 
21be0 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73  the same name as
21bf0 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
21c00 73 65 0a 2a 2a 20 66 69 6c 65 20 77 69 74 68 20  se.** file with 
21c10 74 68 65 20 22 2d 73 68 6d 22 20 73 75 66 66 69  the "-shm" suffi
21c20 78 20 61 64 64 65 64 2e 20 20 46 6f 72 20 65 78  x added.  For ex
21c30 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 64 61  ample, if the da
21c40 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69  tabase file.** i
21c50 73 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63  s "/home/user1/c
21c60 6f 6e 66 69 67 2e 64 62 22 20 74 68 65 6e 20 74  onfig.db" then t
21c70 68 65 20 66 69 6c 65 20 74 68 61 74 20 69 73 20  he file that is 
21c80 63 72 65 61 74 65 64 20 61 6e 64 20 6d 6d 61 70  created and mmap
21c90 70 65 64 0a 2a 2a 20 66 6f 72 20 73 68 61 72 65  ped.** for share
21ca0 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65  d memory will be
21cb0 20 63 61 6c 6c 65 64 20 22 2f 68 6f 6d 65 2f 75   called "/home/u
21cc0 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62 2d 73  ser1/config.db-s
21cd0 68 6d 22 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f  hm".  .**.** Ano
21ce0 74 68 65 72 20 61 70 70 72 6f 61 63 68 20 74 6f  ther approach to
21cf0 20 69 73 20 74 6f 20 75 73 65 20 66 69 6c 65 73   is to use files
21d00 20 69 6e 20 2f 64 65 76 2f 73 68 6d 20 6f 72 20   in /dev/shm or 
21d10 2f 64 65 76 2f 74 6d 70 20 6f 72 20 61 6e 0a 2a  /dev/tmp or an.*
21d20 2a 20 73 6f 6d 65 20 6f 74 68 65 72 20 74 6d 70  * some other tmp
21d30 66 73 20 6d 6f 75 6e 74 2e 20 42 75 74 20 69 66  fs mount. But if
21d40 20 61 20 66 69 6c 65 20 69 6e 20 61 20 64 69 66   a file in a dif
21d50 66 65 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79  ferent directory
21d60 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 61 74  .** from the dat
21d70 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75 73  abase file is us
21d80 65 64 2c 20 74 68 65 6e 20 64 69 66 66 65 72 69  ed, then differi
21d90 6e 67 20 61 63 63 65 73 73 20 70 65 72 6d 69 73  ng access permis
21da0 73 69 6f 6e 73 0a 2a 2a 20 6f 72 20 61 20 63 68  sions.** or a ch
21db0 72 6f 6f 74 28 29 20 6d 69 67 68 74 20 63 61 75  root() might cau
21dc0 73 65 20 74 77 6f 20 64 69 66 66 65 72 65 6e 74  se two different
21dd0 20 70 72 6f 63 65 73 73 65 73 20 6f 6e 20 74 68   processes on th
21de0 65 20 73 61 6d 65 0a 2a 2a 20 64 61 74 61 62 61  e same.** databa
21df0 73 65 20 74 6f 20 65 6e 64 20 75 70 20 75 73 69  se to end up usi
21e00 6e 67 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c  ng different fil
21e10 65 73 20 66 6f 72 20 73 68 61 72 65 64 20 6d 65  es for shared me
21e20 6d 6f 72 79 20 2d 20 0a 2a 2a 20 6d 65 61 6e 69  mory - .** meani
21e30 6e 67 20 74 68 61 74 20 74 68 65 69 72 20 6d 65  ng that their me
21e40 6d 6f 72 79 20 77 6f 75 6c 64 20 6e 6f 74 20 72  mory would not r
21e50 65 61 6c 6c 79 20 62 65 20 73 68 61 72 65 64 20  eally be shared 
21e60 2d 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 69  - resulting.** i
21e70 6e 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  n database corru
21e80 70 74 69 6f 6e 2e 20 20 4e 65 76 65 72 74 68 65  ption.  Neverthe
21e90 6c 65 73 73 2c 20 74 68 69 73 20 74 6d 70 66 73  less, this tmpfs
21ea0 20 66 69 6c 65 20 75 73 61 67 65 0a 2a 2a 20 63   file usage.** c
21eb0 61 6e 20 62 65 20 65 6e 61 62 6c 65 64 20 61 74  an be enabled at
21ec0 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 75 73   compile-time us
21ed0 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 53 48 4d  ing -DSQLITE_SHM
21ee0 5f 44 49 52 45 43 54 4f 52 59 3d 22 2f 64 65 76  _DIRECTORY="/dev
21ef0 2f 73 68 6d 22 0a 2a 2a 20 6f 72 20 74 68 65 20  /shm".** or the 
21f00 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 54 68 65  equivalent.  The
21f10 20 75 73 65 20 6f 66 20 74 68 65 20 53 51 4c 49   use of the SQLI
21f20 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
21f30 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 2a 2a   compile-time.**
21f40 20 6f 70 74 69 6f 6e 20 72 65 73 75 6c 74 73 20   option results 
21f50 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  in an incompatib
21f60 6c 65 20 62 75 69 6c 64 20 6f 66 20 53 51 4c 69  le build of SQLi
21f70 74 65 3b 20 20 62 75 69 6c 64 73 20 6f 66 20 53  te;  builds of S
21f80 51 4c 69 74 65 0a 2a 2a 20 74 68 61 74 20 77 69  QLite.** that wi
21f90 74 68 20 64 69 66 66 65 72 69 6e 67 20 53 51 4c  th differing SQL
21fa0 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
21fb0 59 20 73 65 74 74 69 6e 67 73 20 61 74 74 65 6d  Y settings attem
21fc0 70 74 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a  pt to use the.**
21fd0 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66   same database f
21fe0 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20  ile at the same 
21ff0 74 69 6d 65 2c 20 64 61 74 61 62 61 73 65 20 63  time, database c
22000 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 6c  orruption will l
22010 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 2e  ikely.** result.
22020 20 54 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f   The SQLITE_SHM_
22030 44 49 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c  DIRECTORY compil
22040 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
22050 20 63 6f 6e 73 69 64 65 72 65 64 0a 2a 2a 20 22   considered.** "
22060 75 6e 73 75 70 70 6f 72 74 65 64 22 20 61 6e 64  unsupported" and
22070 20 6d 61 79 20 67 6f 20 61 77 61 79 20 69 6e 20   may go away in 
22080 61 20 66 75 74 75 72 65 20 53 51 4c 69 74 65 20  a future SQLite 
22090 72 65 6c 65 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 57  release..**.** W
220a0 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65  hen opening a ne
220b0 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  w shared-memory 
220c0 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65  file, if no othe
220d0 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  r instances of t
220e0 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20  hat.** file are 
220f0 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20  currently open, 
22100 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
22110 6f 72 20 69 6e 20 6f 74 68 65 72 20 70 72 6f 63  or in other proc
22120 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74  esses, then.** t
22130 68 65 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  he file must be 
22140 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
22150 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68 61 76 65  o length or have
22160 20 69 74 73 20 68 65 61 64 65 72 20 63 6c 65 61   its header clea
22170 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  red..**.** If th
22180 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
22190 61 73 65 20 66 69 6c 65 20 28 70 44 62 46 64 29  ase file (pDbFd)
221a0 20 69 73 20 75 73 69 6e 67 20 74 68 65 20 22 75   is using the "u
221b0 6e 69 78 2d 65 78 63 6c 22 20 56 46 53 0a 2a 2a  nix-excl" VFS.**
221c0 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74   that means that
221d0 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
221e0 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
221f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
22200 61 6e 64 0a 2a 2a 20 74 68 61 74 20 6e 6f 20 6f  and.** that no o
22210 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 61  ther processes a
22220 72 65 20 61 62 6c 65 20 74 6f 20 72 65 61 64 20  re able to read 
22230 6f 72 20 77 72 69 74 65 20 74 68 65 20 64 61 74  or write the dat
22240 61 62 61 73 65 2e 20 20 49 6e 0a 2a 2a 20 74 68  abase.  In.** th
22250 61 74 20 63 61 73 65 2c 20 77 65 20 64 6f 20 6e  at case, we do n
22260 6f 74 20 72 65 61 6c 6c 79 20 6e 65 65 64 20 73  ot really need s
22270 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 4e  hared memory.  N
22280 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 0a  o shared memory.
22290 2a 2a 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  ** file is creat
222a0 65 64 2e 20 20 54 68 65 20 73 68 61 72 65 64 20  ed.  The shared 
222b0 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 73  memory will be s
222c0 69 6d 75 6c 61 74 65 64 20 77 69 74 68 20 68 65  imulated with he
222d0 61 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  ap memory..*/.st
222e0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65  atic int unixOpe
222f0 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 75 6e  nSharedMemory(un
22300 69 78 46 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a  ixFile *pDbFd){.
22310 20 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d    struct unixShm
22320 20 2a 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20   *p = 0;        
22330 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74    /* The connect
22340 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 64  ion to be opened
22350 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69   */.  struct uni
22360 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
22370 64 65 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64  de;   /* The und
22380 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64 20  erlying mmapped 
22390 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  file */.  int rc
223a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
223b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
223c0 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e  ult code */.  un
223d0 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
223e0 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ode;          /*
223f0 20 54 68 65 20 69 6e 6f 64 65 20 6f 66 20 66 64   The inode of fd
22400 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 68 6d   */.  char *zShm
22410 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
22420 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
22430 20 74 68 65 20 66 69 6c 65 20 75 73 65 64 20 66   the file used f
22440 6f 72 20 53 48 4d 20 2a 2f 0a 20 20 69 6e 74 20  or SHM */.  int 
22450 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20  nShmFilename;   
22460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
22470 69 7a 65 20 6f 66 20 74 68 65 20 53 48 4d 20 66  ize of the SHM f
22480 69 6c 65 6e 61 6d 65 20 69 6e 20 62 79 74 65 73  ilename in bytes
22490 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   */..  /* Alloca
224a0 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  te space for the
224b0 20 6e 65 77 20 75 6e 69 78 53 68 6d 20 6f 62 6a   new unixShm obj
224c0 65 63 74 2e 20 2a 2f 0a 20 20 70 20 3d 20 73 71  ect. */.  p = sq
224d0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20  lite3_malloc64( 
224e0 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20  sizeof(*p) );.  
224f0 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
22500 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
22510 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
22520 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 61 73  izeof(*p));.  as
22530 73 65 72 74 28 20 70 44 62 46 64 2d 3e 70 53 68  sert( pDbFd->pSh
22540 6d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  m==0 );..  /* Ch
22550 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 20  eck to see if a 
22560 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
22570 63 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ct already exist
22580 73 2e 20 52 65 75 73 65 20 61 6e 20 65 78 69 73  s. Reuse an exis
22590 74 69 6e 67 0a 20 20 2a 2a 20 6f 6e 65 20 69 66  ting.  ** one if
225a0 20 70 72 65 73 65 6e 74 2e 20 43 72 65 61 74 65   present. Create
225b0 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65   a new one if ne
225c0 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
225d0 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
225e0 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 44 62  ;.  pInode = pDb
225f0 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 70 53  Fd->pInode;.  pS
22600 68 6d 4e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d  hmNode = pInode-
22610 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 66 28  >pShmNode;.  if(
22620 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a   pShmNode==0 ){.
22630 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
22640 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20  sStat;          
22650 20 20 20 20 20 20 20 2f 2a 20 66 73 74 61 74 28         /* fstat(
22660 29 20 69 6e 66 6f 20 66 6f 72 20 64 61 74 61 62  ) info for datab
22670 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23 69 66 6e  ase file */.#ifn
22680 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  def SQLITE_SHM_D
22690 49 52 45 43 54 4f 52 59 0a 20 20 20 20 63 6f 6e  IRECTORY.    con
226a0 73 74 20 63 68 61 72 20 2a 7a 42 61 73 65 50 61  st char *zBasePa
226b0 74 68 20 3d 20 70 44 62 46 64 2d 3e 7a 50 61 74  th = pDbFd->zPat
226c0 68 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f  h;.#endif..    /
226d0 2a 20 43 61 6c 6c 20 66 73 74 61 74 28 29 20 74  * Call fstat() t
226e0 6f 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 65  o figure out the
226f0 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20   permissions on 
22700 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
22710 65 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 6e  e. If.    ** a n
22720 65 77 20 2a 2d 73 68 6d 20 66 69 6c 65 20 69 73  ew *-shm file is
22730 20 63 72 65 61 74 65 64 2c 20 61 6e 20 61 74 74   created, an att
22740 65 6d 70 74 20 77 69 6c 6c 20 62 65 20 6d 61 64  empt will be mad
22750 65 20 74 6f 20 63 72 65 61 74 65 20 69 74 0a 20  e to create it. 
22760 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 73     ** with the s
22770 61 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e  ame permissions.
22780 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
22790 6f 73 46 73 74 61 74 28 70 44 62 46 64 2d 3e 68  osFstat(pDbFd->h
227a0 2c 20 26 73 53 74 61 74 29 20 26 26 20 70 49 6e  , &sStat) && pIn
227b0 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
227c0 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  k==0 ){.      rc
227d0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
227e0 46 53 54 41 54 3b 0a 20 20 20 20 20 20 67 6f 74  FSTAT;.      got
227f0 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
22800 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
22810 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
22820 52 59 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e  RY.    nShmFilen
22830 61 6d 65 20 3d 20 73 69 7a 65 6f 66 28 53 51 4c  ame = sizeof(SQL
22840 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
22850 59 29 20 2b 20 33 31 3b 0a 23 65 6c 73 65 0a 20  Y) + 31;.#else. 
22860 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20     nShmFilename 
22870 3d 20 36 20 2b 20 28 69 6e 74 29 73 74 72 6c 65  = 6 + (int)strle
22880 6e 28 7a 42 61 73 65 50 61 74 68 29 3b 0a 23 65  n(zBasePath);.#e
22890 6e 64 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64  ndif.    pShmNod
228a0 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e = sqlite3_mall
228b0 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 53  oc64( sizeof(*pS
228c0 68 6d 4e 6f 64 65 29 20 2b 20 6e 53 68 6d 46 69  hmNode) + nShmFi
228d0 6c 65 6e 61 6d 65 20 29 3b 0a 20 20 20 20 69 66  lename );.    if
228e0 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b  ( pShmNode==0 ){
228f0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
22900 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
22910 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
22920 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  r;.    }.    mem
22930 73 65 74 28 70 53 68 6d 4e 6f 64 65 2c 20 30 2c  set(pShmNode, 0,
22940 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64   sizeof(*pShmNod
22950 65 29 2b 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 29  e)+nShmFilename)
22960 3b 0a 20 20 20 20 7a 53 68 6d 46 69 6c 65 6e 61  ;.    zShmFilena
22970 6d 65 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a  me = pShmNode->z
22980 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72  Filename = (char
22990 2a 29 26 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a  *)&pShmNode[1];.
229a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48  #ifdef SQLITE_SH
229b0 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20  M_DIRECTORY.    
229c0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
229d0 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a  (nShmFilename, z
229e0 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20  ShmFilename, .  
229f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a00 20 20 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49     SQLITE_SHM_DI
22a10 52 45 43 54 4f 52 59 20 22 2f 73 71 6c 69 74 65  RECTORY "/sqlite
22a20 2d 73 68 6d 2d 25 78 2d 25 78 22 2c 0a 20 20 20  -shm-%x-%x",.   
22a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a40 20 20 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f    (u32)sStat.st_
22a50 69 6e 6f 2c 20 28 75 33 32 29 73 53 74 61 74 2e  ino, (u32)sStat.
22a60 73 74 5f 64 65 76 29 3b 0a 23 65 6c 73 65 0a 20  st_dev);.#else. 
22a70 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
22a80 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65  ntf(nShmFilename
22a90 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20  , zShmFilename, 
22aa0 22 25 73 2d 73 68 6d 22 2c 20 7a 42 61 73 65 50  "%s-shm", zBaseP
22ab0 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ath);.    sqlite
22ac0 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 44 62  3FileSuffix3(pDb
22ad0 46 64 2d 3e 7a 50 61 74 68 2c 20 7a 53 68 6d 46  Fd->zPath, zShmF
22ae0 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66  ilename);.#endif
22af0 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  .    pShmNode->h
22b00 20 3d 20 2d 31 3b 0a 20 20 20 20 70 44 62 46 64   = -1;.    pDbFd
22b10 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  ->pInode->pShmNo
22b20 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 20  de = pShmNode;. 
22b30 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e     pShmNode->pIn
22b40 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e  ode = pDbFd->pIn
22b50 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64  ode;.    pShmNod
22b60 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74  e->mutex = sqlit
22b70 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
22b80 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54  QLITE_MUTEX_FAST
22b90 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e  );.    if( pShmN
22ba0 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b  ode->mutex==0 ){
22bb0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
22bc0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
22bd0 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
22be0 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  r;.    }..    if
22bf0 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ( pInode->bProce
22c00 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  ssLock==0 ){.   
22c10 20 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73     int openFlags
22c20 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52   = O_RDWR | O_CR
22c30 45 41 54 3b 0a 20 20 20 20 20 20 69 66 28 20 73  EAT;.      if( s
22c40 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65  qlite3_uri_boole
22c50 61 6e 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c  an(pDbFd->zPath,
22c60 20 22 72 65 61 64 6f 6e 6c 79 5f 73 68 6d 22 2c   "readonly_shm",
22c70 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6f   0) ){.        o
22c80 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 4f  penFlags = O_RDO
22c90 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 70 53 68  NLY;.        pSh
22ca0 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c  mNode->isReadonl
22cb0 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  y = 1;.      }. 
22cc0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68       pShmNode->h
22cd0 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a   = robust_open(z
22ce0 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 6f 70 65  ShmFilename, ope
22cf0 6e 46 6c 61 67 73 2c 20 28 73 53 74 61 74 2e 73  nFlags, (sStat.s
22d00 74 5f 6d 6f 64 65 26 30 37 37 37 29 29 3b 0a 20  t_mode&0777));. 
22d10 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64       if( pShmNod
22d20 65 2d 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20 20  e->h<0 ){.      
22d30 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
22d40 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
22d50 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22  PEN_BKPT, "open"
22d60 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b  , zShmFilename);
22d70 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68  .        goto sh
22d80 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
22d90 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
22da0 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73   this process is
22db0 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74   running as root
22dc0 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  , make sure that
22dd0 20 74 68 65 20 53 48 4d 20 66 69 6c 65 0a 20 20   the SHM file.  
22de0 20 20 20 20 2a 2a 20 69 73 20 6f 77 6e 65 64 20      ** is owned 
22df0 62 79 20 74 68 65 20 73 61 6d 65 20 75 73 65 72  by the same user
22e00 20 74 68 61 74 20 6f 77 6e 73 20 74 68 65 20 6f   that owns the o
22e10 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
22e20 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20  .  Otherwise,.  
22e30 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69      ** the origi
22e40 6e 61 6c 20 6f 77 6e 65 72 20 77 69 6c 6c 20 6e  nal owner will n
22e50 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 63 6f  ot be able to co
22e60 6e 6e 65 63 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  nnect..      */.
22e70 20 20 20 20 20 20 72 6f 62 75 73 74 46 63 68 6f        robustFcho
22e80 77 6e 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  wn(pShmNode->h, 
22e90 73 53 74 61 74 2e 73 74 5f 75 69 64 2c 20 73 53  sStat.st_uid, sS
22ea0 74 61 74 2e 73 74 5f 67 69 64 29 3b 0a 20 20 0a  tat.st_gid);.  .
22eb0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
22ec0 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72  o see if another
22ed0 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64   process is hold
22ee0 69 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e  ing the dead-man
22ef0 20 73 77 69 74 63 68 2e 0a 20 20 20 20 20 20 2a   switch..      *
22f00 2a 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61  * If not, trunca
22f10 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a  te the file to z
22f20 65 72 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20  ero length. .   
22f30 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
22f40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
22f50 20 20 69 66 28 20 75 6e 69 78 53 68 6d 53 79 73    if( unixShmSys
22f60 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46  temLock(pDbFd, F
22f70 5f 57 52 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d  _WRLCK, UNIX_SHM
22f80 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45  _DMS, 1)==SQLITE
22f90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
22fa0 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63  f( robust_ftrunc
22fb0 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  ate(pShmNode->h,
22fc0 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   0) ){.         
22fd0 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
22fe0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
22ff0 53 48 4d 4f 50 45 4e 2c 20 22 66 74 72 75 6e 63  SHMOPEN, "ftrunc
23000 61 74 65 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61  ate", zShmFilena
23010 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  me);.        }. 
23020 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
23030 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23040 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75  {.        rc = u
23050 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
23060 28 70 44 62 46 64 2c 20 46 5f 52 44 4c 43 4b 2c  (pDbFd, F_RDLCK,
23070 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31   UNIX_SHM_DMS, 1
23080 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
23090 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73   if( rc ) goto s
230a0 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
230b0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b   }.  }..  /* Mak
230c0 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63  e the new connec
230d0 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20  tion a child of 
230e0 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  the unixShmNode 
230f0 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  */.  p->pShmNode
23100 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66   = pShmNode;.#if
23110 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
23120 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e  .  p->id = pShmN
23130 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b  ode->nextShmId++
23140 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e  ;.#endif.  pShmN
23150 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70  ode->nRef++;.  p
23160 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a  DbFd->pShm = p;.
23170 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
23180 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65  ();..  /* The re
23190 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e  ference count on
231a0 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c   pShmNode has al
231b0 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
231c0 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20 2a  mented under.  *
231d0 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20 74  * the cover of t
231e0 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  he unixEnterMute
231f0 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68  x() mutex and th
23200 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74  e pointer from t
23210 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72  he.  ** new (str
23220 75 63 74 20 75 6e 69 78 53 68 6d 29 20 6f 62 6a  uct unixShm) obj
23230 65 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d 4e  ect to the pShmN
23240 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73 65 74  ode has been set
23250 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20 20  . All that is.  
23260 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69 73  ** left to do is
23270 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77   to link the new
23280 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68 65   object into the
23290 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61   linked list sta
232a0 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53  rting.  ** at pS
232b0 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20  hmNode->pFirst. 
232c0 54 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e  This must be don
232d0 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20  e while holding 
232e0 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  the pShmNode->mu
232f0 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e  tex .  ** mutex.
23300 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  .  */.  sqlite3_
23310 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
23320 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
23330 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e  p->pNext = pShmN
23340 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70  ode->pFirst;.  p
23350 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20  ShmNode->pFirst 
23360 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = p;.  sqlite3_m
23370 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
23380 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  ode->mutex);.  r
23390 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
233a0 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
233b0 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f   on any error */
233c0 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20  .shm_open_err:. 
233d0 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44   unixShmPurge(pD
233e0 62 46 64 29 3b 20 20 20 20 20 20 20 2f 2a 20 54  bFd);       /* T
233f0 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70  his call frees p
23400 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69  ShmNode if requi
23410 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  red */.  sqlite3
23420 5f 66 72 65 65 28 70 29 3b 0a 20 20 75 6e 69 78  _free(p);.  unix
23430 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
23440 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
23450 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
23460 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  n is called to o
23470 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20  btain a pointer 
23480 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 69 6f  to region iRegio
23490 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 68 61  n of the .** sha
234a0 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63  red-memory assoc
234b0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 64  iated with the d
234c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 64 2e  atabase file fd.
234d0 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   Shared-memory r
234e0 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e  egions .** are n
234f0 75 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67  umbered starting
23500 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68   from zero. Each
23510 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
23520 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f  egion is szRegio
23530 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73  n .** bytes in s
23540 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ize..**.** If an
23550 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
23560 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
23570 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
23580 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
23590 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
235a0 2c 20 69 66 20 74 68 65 20 62 45 78 74 65 6e 64  , if the bExtend
235b0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 20   parameter is 0 
235c0 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65  and the requeste
235d0 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a  d shared-memory.
235e0 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f  ** region has no
235f0 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
23600 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c   (by any client,
23610 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72   including one r
23620 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73  unning in a.** s
23630 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 29  eparate process)
23640 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73 65  , then *pp is se
23650 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51  t to NULL and SQ
23660 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
23670 2e 20 49 66 20 0a 2a 2a 20 62 45 78 74 65 6e 64  . If .** bExtend
23680 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64   is non-zero and
23690 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
236a0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
236b0 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ion has not yet 
236c0 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  .** been allocat
236d0 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63 61  ed, it is alloca
236e0 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
236f0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tion..**.** If t
23700 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  he shared-memory
23710 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72 65   region has alre
23720 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
23730 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74  ed or is allocat
23740 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63 61  ed by.** this ca
23750 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65 64 20  ll as described 
23760 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20 69  above, then it i
23770 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68  s mapped into th
23780 69 73 20 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a  is processes .**
23790 20 61 64 64 72 65 73 73 20 73 70 61 63 65 20 28   address space (
237a0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
237b0 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73 65  eady), *pp is se
237c0 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
237d0 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d  e mapped .** mem
237e0 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ory and SQLITE_O
237f0 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  K returned..*/.s
23800 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
23810 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f  mMap(.  sqlite3_
23820 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
23830 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
23840 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62 61  e open on databa
23850 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
23860 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20   iRegion,       
23870 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23880 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72 69 65  Region to retrie
23890 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65  ve */.  int szRe
238a0 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  gion,           
238b0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
238c0 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20  of regions */.  
238d0 69 6e 74 20 62 45 78 74 65 6e 64 2c 20 20 20 20  int bExtend,    
238e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238f0 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74 65 6e  /* True to exten
23900 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65 73 73  d file if necess
23910 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f  ary */.  void vo
23920 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20 20 20  latile **pp     
23930 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
23940 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a   Mapped memory *
23950 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  /.){.  unixFile 
23960 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69  *pDbFd = (unixFi
23970 6c 65 2a 29 66 64 3b 0a 20 20 75 6e 69 78 53 68  le*)fd;.  unixSh
23980 6d 20 2a 70 3b 0a 20 20 75 6e 69 78 53 68 6d 4e  m *p;.  unixShmN
23990 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode *pShmNode;. 
239a0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
239b0 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 53 68 6d 50  _OK;.  int nShmP
239c0 65 72 4d 61 70 20 3d 20 75 6e 69 78 53 68 6d 52  erMap = unixShmR
239d0 65 67 69 6f 6e 50 65 72 4d 61 70 28 29 3b 0a 20  egionPerMap();. 
239e0 20 69 6e 74 20 6e 52 65 71 52 65 67 69 6f 6e 3b   int nReqRegion;
239f0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 68  ..  /* If the sh
23a00 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
23a10 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
23a20 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69  n opened, open i
23a30 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69 66 28 20  t now. */.  if( 
23a40 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29  pDbFd->pShm==0 )
23a50 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4f  {.    rc = unixO
23a60 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28  penSharedMemory(
23a70 70 44 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20  pDbFd);.    if( 
23a80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
23a90 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
23aa0 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68    p = pDbFd->pSh
23ab0 6d 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  m;.  pShmNode = 
23ac0 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 73  p->pShmNode;.  s
23ad0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
23ae0 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
23af0 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ex);.  assert( s
23b00 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64  zRegion==pShmNod
23b10 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70  e->szRegion || p
23b20 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
23b30 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
23b40 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
23b50 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
23b60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
23b70 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20  hmNode->h>=0 || 
23b80 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pDbFd->pInode->b
23b90 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29  ProcessLock==1 )
23ba0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
23bb0 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62  Node->h<0 || pDb
23bc0 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  Fd->pInode->bPro
23bd0 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a  cessLock==0 );..
23be0 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6e 75 6d    /* Minimum num
23bf0 62 65 72 20 6f 66 20 72 65 67 69 6f 6e 73 20 72  ber of regions r
23c00 65 71 75 69 72 65 64 20 74 6f 20 62 65 20 6d 61  equired to be ma
23c10 70 70 65 64 2e 20 2a 2f 0a 20 20 6e 52 65 71 52  pped. */.  nReqR
23c20 65 67 69 6f 6e 20 3d 20 28 28 69 52 65 67 69 6f  egion = ((iRegio
23c30 6e 2b 6e 53 68 6d 50 65 72 4d 61 70 29 20 2f 20  n+nShmPerMap) / 
23c40 6e 53 68 6d 50 65 72 4d 61 70 29 20 2a 20 6e 53  nShmPerMap) * nS
23c50 68 6d 50 65 72 4d 61 70 3b 0a 0a 20 20 69 66 28  hmPerMap;..  if(
23c60 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
23c70 6f 6e 3c 6e 52 65 71 52 65 67 69 6f 6e 20 29 7b  on<nReqRegion ){
23c80 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 70 4e 65  .    char **apNe
23c90 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
23ca0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 61          /* New a
23cb0 70 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20  pRegion[] array 
23cc0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  */.    int nByte
23cd0 20 3d 20 6e 52 65 71 52 65 67 69 6f 6e 2a 73 7a   = nReqRegion*sz
23ce0 52 65 67 69 6f 6e 3b 20 20 20 2f 2a 20 4d 69 6e  Region;   /* Min
23cf0 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66 69  imum required fi
23d00 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73  le size */.    s
23d10 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74  truct stat sStat
23d20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23d30 20 20 2f 2a 20 55 73 65 64 20 62 79 20 66 73 74    /* Used by fst
23d40 61 74 28 29 20 2a 2f 0a 0a 20 20 20 20 70 53 68  at() */..    pSh
23d50 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20  mNode->szRegion 
23d60 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20  = szRegion;..   
23d70 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68   if( pShmNode->h
23d80 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  >=0 ){.      /* 
23d90 54 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65  The requested re
23da0 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70  gion is not mapp
23db0 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f  ed into this pro
23dc0 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73  cesses address s
23dd0 70 61 63 65 2e 0a 20 20 20 20 20 20 2a 2a 20 43  pace..      ** C
23de0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
23df0 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  t has been alloc
23e00 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20 74 68  ated (i.e. if th
23e10 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65  e wal-index file
23e20 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6c 61 72   is.      ** lar
23e30 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e  ge enough to con
23e40 74 61 69 6e 20 74 68 65 20 72 65 71 75 65 73 74  tain the request
23e50 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20  ed region)..    
23e60 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6f    */.      if( o
23e70 73 46 73 74 61 74 28 70 53 68 6d 4e 6f 64 65 2d  sFstat(pShmNode-
23e80 3e 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20  >h, &sStat) ){. 
23e90 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
23ea0 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
23eb0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
23ec0 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
23ed0 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 69 66 28    }.  .      if(
23ee0 20 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 3c 6e   sStat.st_size<n
23ef0 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Byte ){.        
23f00 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
23f10 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64   memory region d
23f20 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 49  oes not exist. I
23f30 66 20 62 45 78 74 65 6e 64 20 69 73 20 73 65 74  f bExtend is set
23f40 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 66   to.        ** f
23f50 61 6c 73 65 2c 20 65 78 69 74 20 65 61 72 6c 79  alse, exit early
23f60 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20 73 65  . *pp will be se
23f70 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51  t to NULL and SQ
23f80 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
23f90 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
23fa0 20 20 20 20 20 69 66 28 20 21 62 45 78 74 65 6e       if( !bExten
23fb0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  d ){.          g
23fc0 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
23fd0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
23fe0 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69      /* Alternati
23ff0 76 65 6c 79 2c 20 69 66 20 62 45 78 74 65 6e 64  vely, if bExtend
24000 20 69 73 20 74 72 75 65 2c 20 65 78 74 65 6e 64   is true, extend
24010 20 74 68 65 20 66 69 6c 65 2e 20 44 6f 20 74 68   the file. Do th
24020 69 73 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a  is by.        **
24030 20 77 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c   writing a singl
24040 65 20 62 79 74 65 20 74 6f 20 74 68 65 20 65 6e  e byte to the en
24050 64 20 6f 66 20 65 61 63 68 20 28 4f 53 29 20 70  d of each (OS) p
24060 61 67 65 20 62 65 69 6e 67 0a 20 20 20 20 20 20  age being.      
24070 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 6f    ** allocated o
24080 72 20 65 78 74 65 6e 64 65 64 2e 20 54 65 63 68  r extended. Tech
24090 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6e 65 65 64  nically, we need
240a0 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 6f 20 74   only write to t
240b0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 61  he.        ** la
240c0 73 74 20 70 61 67 65 20 69 6e 20 6f 72 64 65 72  st page in order
240d0 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20 66   to extend the f
240e0 69 6c 65 2e 20 42 75 74 20 77 72 69 74 69 6e 67  ile. But writing
240f0 20 74 6f 20 61 6c 6c 20 6e 65 77 0a 20 20 20 20   to all new.    
24100 20 20 20 20 2a 2a 20 70 61 67 65 73 20 66 6f 72      ** pages for
24110 63 65 73 20 74 68 65 20 4f 53 20 74 6f 20 61 6c  ces the OS to al
24120 6c 6f 63 61 74 65 20 74 68 65 6d 20 69 6d 6d 65  locate them imme
24130 64 69 61 74 65 6c 79 2c 20 77 68 69 63 68 20 72  diately, which r
24140 65 64 75 63 65 73 0a 20 20 20 20 20 20 20 20 2a  educes.        *
24150 2a 20 74 68 65 20 63 68 61 6e 63 65 73 20 6f 66  * the chances of
24160 20 53 49 47 42 55 53 20 77 68 69 6c 65 20 61 63   SIGBUS while ac
24170 63 65 73 73 69 6e 67 20 74 68 65 20 6d 61 70 70  cessing the mapp
24180 65 64 20 72 65 67 69 6f 6e 20 6c 61 74 65 72 20  ed region later 
24190 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  on..        */. 
241a0 20 20 20 20 20 20 20 65 6c 73 65 7b 0a 20 20 20         else{.   
241b0 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f         static co
241c0 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 34  nst int pgsz = 4
241d0 30 39 36 3b 0a 20 20 20 20 20 20 20 20 20 20 69  096;.          i
241e0 6e 74 20 69 50 67 3b 0a 0a 20 20 20 20 20 20 20  nt iPg;..       
241f0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74     /* Write to t
24200 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66 20  he last byte of 
24210 65 61 63 68 20 6e 65 77 6c 79 20 61 6c 6c 6f 63  each newly alloc
24220 61 74 65 64 20 6f 72 20 65 78 74 65 6e 64 65 64  ated or extended
24230 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
24240 20 20 20 61 73 73 65 72 74 28 20 28 6e 42 79 74     assert( (nByt
24250 65 20 25 20 70 67 73 7a 29 3d 3d 30 20 29 3b 0a  e % pgsz)==0 );.
24260 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 50            for(iP
24270 67 3d 28 73 53 74 61 74 2e 73 74 5f 73 69 7a 65  g=(sStat.st_size
24280 2f 70 67 73 7a 29 3b 20 69 50 67 3c 28 6e 42 79  /pgsz); iPg<(nBy
24290 74 65 2f 70 67 73 7a 29 3b 20 69 50 67 2b 2b 29  te/pgsz); iPg++)
242a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
242b0 74 20 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  t x = 0;.       
242c0 20 20 20 20 20 69 66 28 20 73 65 65 6b 41 6e 64       if( seekAnd
242d0 57 72 69 74 65 46 64 28 70 53 68 6d 4e 6f 64 65  WriteFd(pShmNode
242e0 2d 3e 68 2c 20 69 50 67 2a 70 67 73 7a 20 2b 20  ->h, iPg*pgsz + 
242f0 70 67 73 7a 2d 31 2c 20 22 22 2c 20 31 2c 20 26  pgsz-1, "", 1, &
24300 78 29 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  x)!=1 ){.       
24310 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
24320 72 20 2a 7a 46 69 6c 65 20 3d 20 70 53 68 6d 4e  r *zFile = pShmN
24330 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a  ode->zFilename;.
24340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
24350 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28   = unixLogError(
24360 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
24370 53 49 5a 45 2c 20 22 77 72 69 74 65 22 2c 20 7a  SIZE, "write", z
24380 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20  File);.         
24390 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
243a0 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20  e_out;.         
243b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
243c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
243d0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
243e0 20 4d 61 70 20 74 68 65 20 72 65 71 75 65 73 74   Map the request
243f0 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed memory region
24400 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65   into this proce
24410 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61  sses address spa
24420 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77  ce. */.    apNew
24430 20 3d 20 28 63 68 61 72 20 2a 2a 29 73 71 6c 69   = (char **)sqli
24440 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20  te3_realloc(.   
24450 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61       pShmNode->a
24460 70 52 65 67 69 6f 6e 2c 20 6e 52 65 71 52 65 67  pRegion, nReqReg
24470 69 6f 6e 2a 73 69 7a 65 6f 66 28 63 68 61 72 20  ion*sizeof(char 
24480 2a 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  *).    );.    if
24490 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20  ( !apNew ){.    
244a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
244b0 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ERR_NOMEM;.     
244c0 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
244d0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 68  t;.    }.    pSh
244e0 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 20  mNode->apRegion 
244f0 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20 77 68 69  = apNew;.    whi
24500 6c 65 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  le( pShmNode->nR
24510 65 67 69 6f 6e 3c 6e 52 65 71 52 65 67 69 6f 6e  egion<nReqRegion
24520 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4d   ){.      int nM
24530 61 70 20 3d 20 73 7a 52 65 67 69 6f 6e 2a 6e 53  ap = szRegion*nS
24540 68 6d 50 65 72 4d 61 70 3b 0a 20 20 20 20 20 20  hmPerMap;.      
24550 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 76 6f 69  int i;.      voi
24560 64 20 2a 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69  d *pMem;.      i
24570 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d  f( pShmNode->h>=
24580 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  0 ){.        pMe
24590 6d 20 3d 20 6f 73 4d 6d 61 70 28 30 2c 20 6e 4d  m = osMmap(0, nM
245a0 61 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ap,.            
245b0 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64  pShmNode->isRead
245c0 6f 6e 6c 79 20 3f 20 50 52 4f 54 5f 52 45 41 44  only ? PROT_READ
245d0 20 3a 20 50 52 4f 54 5f 52 45 41 44 7c 50 52 4f   : PROT_READ|PRO
245e0 54 5f 57 52 49 54 45 2c 20 0a 20 20 20 20 20 20  T_WRITE, .      
245f0 20 20 20 20 20 20 4d 41 50 5f 53 48 41 52 45 44        MAP_SHARED
24600 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73  , pShmNode->h, s
24610 7a 52 65 67 69 6f 6e 2a 28 69 36 34 29 70 53 68  zRegion*(i64)pSh
24620 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 0a 20  mNode->nRegion. 
24630 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
24640 20 20 69 66 28 20 70 4d 65 6d 3d 3d 4d 41 50 5f    if( pMem==MAP_
24650 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20  FAILED ){.      
24660 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
24670 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
24680 52 52 5f 53 48 4d 4d 41 50 2c 20 22 6d 6d 61 70  RR_SHMMAP, "mmap
24690 22 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69  ", pShmNode->zFi
246a0 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  lename);.       
246b0 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
246c0 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
246d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
246e0 20 20 20 20 70 4d 65 6d 20 3d 20 73 71 6c 69 74      pMem = sqlit
246f0 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 7a 52 65  e3_malloc64(szRe
24700 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 69  gion);.        i
24710 66 28 20 70 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20  f( pMem==0 ){.  
24720 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
24730 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
24740 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
24750 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  e_out;.        }
24760 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
24770 70 4d 65 6d 2c 20 30 2c 20 73 7a 52 65 67 69 6f  pMem, 0, szRegio
24780 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  n);.      }..   
24790 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53     for(i=0; i<nS
247a0 68 6d 50 65 72 4d 61 70 3b 20 69 2b 2b 29 7b 0a  hmPerMap; i++){.
247b0 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
247c0 2d 3e 61 70 52 65 67 69 6f 6e 5b 70 53 68 6d 4e  ->apRegion[pShmN
247d0 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 69 5d 20  ode->nRegion+i] 
247e0 3d 20 26 28 28 63 68 61 72 2a 29 70 4d 65 6d 29  = &((char*)pMem)
247f0 5b 73 7a 52 65 67 69 6f 6e 2a 69 5d 3b 0a 20 20  [szRegion*i];.  
24800 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 68 6d      }.      pShm
24810 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 20 2b 3d  Node->nRegion +=
24820 20 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 20 20 20   nShmPerMap;.   
24830 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f   }.  }..shmpage_
24840 6f 75 74 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e  out:.  if( pShmN
24850 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65  ode->nRegion>iRe
24860 67 69 6f 6e 20 29 7b 0a 20 20 20 20 2a 70 70 20  gion ){.    *pp 
24870 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65  = pShmNode->apRe
24880 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 3b 0a 20  gion[iRegion];. 
24890 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20   }else{.    *pp 
248a0 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
248b0 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f  ShmNode->isReado
248c0 6e 6c 79 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  nly && rc==SQLIT
248d0 45 5f 4f 4b 20 29 20 72 63 20 3d 20 53 51 4c 49  E_OK ) rc = SQLI
248e0 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 73  TE_READONLY;.  s
248f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
24900 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
24910 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
24920 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
24930 65 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  e the lock state
24940 20 66 6f 72 20 61 20 73 68 61 72 65 64 2d 6d 65   for a shared-me
24950 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a  mory segment..**
24960 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68  .** Note that th
24970 65 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 62  e relationship b
24980 65 74 77 65 65 6e 20 53 48 41 52 45 64 20 61 6e  etween SHAREd an
24990 64 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  d EXCLUSIVE lock
249a0 73 20 69 73 20 61 20 6c 69 74 74 6c 65 0a 2a 2a  s is a little.**
249b0 20 64 69 66 66 65 72 65 6e 74 20 68 65 72 65 20   different here 
249c0 74 68 61 6e 20 69 6e 20 70 6f 73 69 78 2e 20 20  than in posix.  
249d0 49 6e 20 78 53 68 6d 4c 6f 63 6b 28 29 2c 20 6f  In xShmLock(), o
249e0 6e 65 20 63 61 6e 20 67 6f 20 66 72 6f 6d 20 75  ne can go from u
249f0 6e 6c 6f 63 6b 65 64 0a 2a 2a 20 74 6f 20 73 68  nlocked.** to sh
24a00 61 72 65 64 20 61 6e 64 20 62 61 63 6b 20 6f 72  ared and back or
24a10 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74   from unlocked t
24a20 6f 20 65 78 63 6c 75 73 69 76 65 20 61 6e 64 20  o exclusive and 
24a30 62 61 63 6b 2e 20 20 42 75 74 20 6f 6e 65 20 6d  back.  But one m
24a40 61 79 0a 2a 2a 20 6e 6f 74 20 67 6f 20 66 72 6f  ay.** not go fro
24a50 6d 20 73 68 61 72 65 64 20 74 6f 20 65 78 63 6c  m shared to excl
24a60 75 73 69 76 65 20 6f 72 20 66 72 6f 6d 20 65 78  usive or from ex
24a70 63 6c 75 73 69 76 65 20 74 6f 20 73 68 61 72 65  clusive to share
24a80 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
24a90 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 28 0a 20 20   unixShmLock(.  
24aa0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
24ab0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ,          /* Da
24ac0 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64  tabase file hold
24ad0 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d  ing the shared m
24ae0 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f  emory */.  int o
24af0 66 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  fst,            
24b00 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c        /* First l
24b10 6f 63 6b 20 74 6f 20 61 63 71 75 69 72 65 20 6f  ock to acquire o
24b20 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69  r release */.  i
24b30 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20  nt n,           
24b40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
24b50 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20  ber of locks to 
24b60 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61  acquire or relea
24b70 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  se */.  int flag
24b80 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
24b90 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
24ba0 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a   with the lock *
24bb0 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  /.){.  unixFile 
24bc0 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69  *pDbFd = (unixFi
24bd0 6c 65 2a 29 66 64 3b 20 20 20 20 20 20 2f 2a 20  le*)fd;      /* 
24be0 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69  Connection holdi
24bf0 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  ng shared memory
24c00 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70   */.  unixShm *p
24c10 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 20   = pDbFd->pShm; 
24c20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
24c30 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
24c40 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f   being locked */
24c50 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 58 3b 20  .  unixShm *pX; 
24c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c70 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
24c80 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c  looping over all
24c90 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 75   siblings */.  u
24ca0 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
24cb0 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f  Node = p->pShmNo
24cc0 64 65 3b 20 20 2f 2a 20 54 68 65 20 75 6e 64 65  de;  /* The unde
24cd0 72 6c 79 69 6e 67 20 66 69 6c 65 20 69 4e 6f 64  rlying file iNod
24ce0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  e */.  int rc = 
24cf0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
24d00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24d10 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20  Result code */. 
24d20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20 20 20 20   u16 mask;      
24d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d40 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
24d50 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61 6b 65 20  f locks to take 
24d60 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 0a 20  or release */.. 
24d70 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
24d80 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
24d90 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20  ->pShmNode );.  
24da0 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
24db0 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d  ->pInode==pDbFd-
24dc0 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73  >pInode );.  ass
24dd0 65 72 74 28 20 6f 66 73 74 3e 3d 30 20 26 26 20  ert( ofst>=0 && 
24de0 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53  ofst+n<=SQLITE_S
24df0 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  HM_NLOCK );.  as
24e00 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20  sert( n>=1 );.  
24e10 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 28  assert( flags==(
24e20 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20  SQLITE_SHM_LOCK 
24e30 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41  | SQLITE_SHM_SHA
24e40 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66  RED).       || f
24e50 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
24e60 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  M_LOCK | SQLITE_
24e70 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a 20  SHM_EXCLUSIVE). 
24e80 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
24e90 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f  (SQLITE_SHM_UNLO
24ea0 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
24eb0 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c  SHARED).       |
24ec0 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  | flags==(SQLITE
24ed0 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51  _SHM_UNLOCK | SQ
24ee0 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
24ef0 56 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  VE) );.  assert(
24f00 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20   n==1 || (flags 
24f10 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43  & SQLITE_SHM_EXC
24f20 4c 55 53 49 56 45 29 21 3d 30 20 29 3b 0a 20 20  LUSIVE)!=0 );.  
24f30 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
24f40 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d  ->h>=0 || pDbFd-
24f50 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73  >pInode->bProces
24f60 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73  sLock==1 );.  as
24f70 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
24f80 68 3c 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49  h<0 || pDbFd->pI
24f90 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
24fa0 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b  ck==0 );..  mask
24fb0 20 3d 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29   = (1<<(ofst+n))
24fc0 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20   - (1<<ofst);.  
24fd0 61 73 73 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d  assert( n>1 || m
24fe0 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29  ask==(1<<ofst) )
24ff0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
25000 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
25010 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
25020 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
25030 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20  HM_UNLOCK ){.   
25040 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30   u16 allMask = 0
25050 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63  ; /* Mask of loc
25060 6b 73 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69  ks held by sibli
25070 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  ngs */..    /* S
25080 65 65 20 69 66 20 61 6e 79 20 73 69 62 6c 69 6e  ee if any siblin
25090 67 73 20 68 6f 6c 64 20 74 68 69 73 20 73 61 6d  gs hold this sam
250a0 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f  e lock */.    fo
250b0 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70  r(pX=pShmNode->p
250c0 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58  First; pX; pX=pX
250d0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
250e0 69 66 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74  if( pX==p ) cont
250f0 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65  inue;.      asse
25100 72 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73  rt( (pX->exclMas
25110 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b  k & (p->exclMask
25120 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29 29  |p->sharedMask))
25130 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c  ==0 );.      all
25140 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72  Mask |= pX->shar
25150 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20  edMask;.    }.. 
25160 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65     /* Unlock the
25170 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f   system-level lo
25180 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 28  cks */.    if( (
25190 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d  mask & allMask)=
251a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
251b0 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f   unixShmSystemLo
251c0 63 6b 28 70 44 62 46 64 2c 20 46 5f 55 4e 4c 43  ck(pDbFd, F_UNLC
251d0 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d  K, ofst+UNIX_SHM
251e0 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d  _BASE, n);.    }
251f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
25200 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
25210 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74  }..    /* Undo t
25220 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a  he local locks *
25230 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
25240 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
25250 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20   p->exclMask &= 
25260 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e  ~mask;.      p->
25270 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d  sharedMask &= ~m
25280 61 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 65  ask;.    } .  }e
25290 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
252a0 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45  SQLITE_SHM_SHARE
252b0 44 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c  D ){.    u16 all
252c0 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20  Shared = 0;  /* 
252d0 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68  Union of locks h
252e0 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f  eld by connectio
252f0 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22 70  ns other than "p
25300 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e  " */..    /* Fin
25310 64 20 6f 75 74 20 77 68 69 63 68 20 73 68 61 72  d out which shar
25320 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72  ed locks are alr
25330 65 61 64 79 20 68 65 6c 64 20 62 79 20 73 69 62  eady held by sib
25340 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
25350 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79 20  ..    ** If any 
25360 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79 20  sibling already 
25370 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69  holds an exclusi
25380 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61  ve lock, go ahea
25390 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20  d and return.   
253a0 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 2e   ** SQLITE_BUSY.
253b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
253c0 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
253d0 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
253e0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
253f0 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
25400 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20  & mask)!=0 ){.  
25410 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
25420 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
25430 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
25440 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20 7c       allShared |
25450 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b  = pX->sharedMask
25460 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
25470 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  Get shared locks
25480 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c   at the system l
25490 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73 61  evel, if necessa
254a0 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ry */.    if( rc
254b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
254c0 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68 61       if( (allSha
254d0 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  red & mask)==0 )
254e0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75  {.        rc = u
254f0 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
25500 28 70 44 62 46 64 2c 20 46 5f 52 44 4c 43 4b 2c  (pDbFd, F_RDLCK,
25510 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42   ofst+UNIX_SHM_B
25520 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d  ASE, n);.      }
25530 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
25540 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
25550 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
25560 20 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61   /* Get the loca
25570 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a  l shared locks *
25580 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
25590 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
255a0 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c   p->sharedMask |
255b0 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20  = mask;.    }.  
255c0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61  }else{.    /* Ma
255d0 6b 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69  ke sure no sibli
255e0 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68  ng connections h
255f0 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77  old locks that w
25600 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20  ill block this. 
25610 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20     ** lock.  If 
25620 61 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53  any do, return S
25630 51 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68 74  QLITE_BUSY right
25640 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20   away..    */.  
25650 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
25660 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
25670 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
25680 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63      if( (pX->exc
25690 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  lMask & mask)!=0
256a0 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d   || (pX->sharedM
256b0 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29  ask & mask)!=0 )
256c0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
256d0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
256e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
256f0 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
25700 2f 2a 20 47 65 74 20 74 68 65 20 65 78 63 6c 75  /* Get the exclu
25710 73 69 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68  sive locks at th
25720 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20  e system level. 
25730 20 54 68 65 6e 20 69 66 20 73 75 63 63 65 73 73   Then if success
25740 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20  ful.    ** also 
25750 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63  mark the local c
25760 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69  onnection as bei
25770 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a  ng locked..    *
25780 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
25790 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
257a0 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73   rc = unixShmSys
257b0 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46  temLock(pDbFd, F
257c0 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49  _WRLCK, ofst+UNI
257d0 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a  X_SHM_BASE, n);.
257e0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
257f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
25800 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73     assert( (p->s
25810 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b  haredMask & mask
25820 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
25830 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d  p->exclMask |= m
25840 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ask;.      }.   
25850 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
25860 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
25870 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
25880 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c   OSTRACE(("SHM-L
25890 4f 43 4b 20 73 68 6d 69 64 2d 25 64 2c 20 70 69  OCK shmid-%d, pi
258a0 64 2d 25 64 20 67 6f 74 20 25 30 33 78 2c 25 30  d-%d got %03x,%0
258b0 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  3x\n",.         
258c0 20 20 70 2d 3e 69 64 2c 20 6f 73 47 65 74 70 69    p->id, osGetpi
258d0 64 28 30 29 2c 20 70 2d 3e 73 68 61 72 65 64 4d  d(0), p->sharedM
258e0 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b  ask, p->exclMask
258f0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
25900 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
25910 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62 61 72  ent a memory bar
25920 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66  rier or memory f
25930 65 6e 63 65 20 6f 6e 20 73 68 61 72 65 64 20 6d  ence on shared m
25940 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41  emory.  .**.** A
25950 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f  ll loads and sto
25960 72 65 73 20 62 65 67 75 6e 20 62 65 66 6f 72 65  res begun before
25970 20 74 68 65 20 62 61 72 72 69 65 72 20 6d 75 73   the barrier mus
25980 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72  t complete befor
25990 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72  e.** any load or
259a0 20 73 74 6f 72 65 20 62 65 67 75 6e 20 61 66 74   store begun aft
259b0 65 72 20 74 68 65 20 62 61 72 72 69 65 72 2e 0a  er the barrier..
259c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
259d0 6e 69 78 53 68 6d 42 61 72 72 69 65 72 28 0a 20  nixShmBarrier(. 
259e0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
259f0 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
25a00 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
25a10 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68  e holding the sh
25a20 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29  ared memory */.)
25a30 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
25a40 45 54 45 52 28 66 64 29 3b 0a 20 20 73 71 6c 69  ETER(fd);.  sqli
25a50 74 65 33 4d 65 6d 6f 72 79 42 61 72 72 69 65 72  te3MemoryBarrier
25a60 28 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 63  ();         /* c
25a70 6f 6d 70 69 6c 65 72 2d 64 65 66 69 6e 65 64 20  ompiler-defined 
25a80 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20 2a  memory barrier *
25a90 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  /.  unixEnterMut
25aa0 65 78 28 29 3b 20 20 20 20 20 20 20 20 20 20 20  ex();           
25ab0 20 20 20 20 2f 2a 20 41 6c 73 6f 20 6d 75 74 65      /* Also mute
25ac0 78 2c 20 66 6f 72 20 72 65 64 75 6e 64 61 6e 63  x, for redundanc
25ad0 79 20 2a 2f 0a 20 20 75 6e 69 78 4c 65 61 76 65  y */.  unixLeave
25ae0 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Mutex();.}../*.*
25af0 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63  * Close a connec
25b00 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d  tion to shared-m
25b10 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65 20 74  emory.  Delete t
25b20 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a  he underlying .*
25b30 2a 20 73 74 6f 72 61 67 65 20 69 66 20 64 65 6c  * storage if del
25b40 65 74 65 46 6c 61 67 20 69 73 20 74 72 75 65 2e  eteFlag is true.
25b50 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
25b60 69 73 20 6e 6f 20 73 68 61 72 65 64 20 6d 65 6d  is no shared mem
25b70 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
25b80 69 74 68 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ith the connecti
25b90 6f 6e 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20  on then this.** 
25ba0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68 61 72  routine is a har
25bb0 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a  mless no-op..*/.
25bc0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
25bd0 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74  hmUnmap(.  sqlit
25be0 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
25bf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
25c00 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
25c10 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
25c20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 20 20  int deleteFlag  
25c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c40 2f 2a 20 44 65 6c 65 74 65 20 73 68 61 72 65 64  /* Delete shared
25c50 2d 6d 65 6d 6f 72 79 20 69 66 20 74 72 75 65 20  -memory if true 
25c60 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53 68 6d 20  */.){.  unixShm 
25c70 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
25c80 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
25c90 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20  onnection to be 
25ca0 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 75 6e 69 78  closed */.  unix
25cb0 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
25cc0 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e;          /* T
25cd0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 68  he underlying sh
25ce0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
25cf0 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 2a   */.  unixShm **
25d00 70 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pp;             
25d10 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
25d20 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69 6e  ping over siblin
25d30 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  g connections */
25d40 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62  .  unixFile *pDb
25d50 46 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Fd;             
25d60 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
25d70 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
25d80 6c 65 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d  le */..  pDbFd =
25d90 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a   (unixFile*)fd;.
25da0 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68    p = pDbFd->pSh
25db0 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  m;.  if( p==0 ) 
25dc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
25dd0 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70  ;.  pShmNode = p
25de0 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 61  ->pShmNode;..  a
25df0 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d  ssert( pShmNode=
25e00 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e  =pDbFd->pInode->
25e10 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73  pShmNode );.  as
25e20 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
25e30 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70  pInode==pDbFd->p
25e40 49 6e 6f 64 65 20 29 3b 0a 0a 20 20 2f 2a 20 52  Inode );..  /* R
25e50 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  emove connection
25e60 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20   p from the set 
25e70 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  of connections a
25e80 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77  ssociated.  ** w
25e90 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a  ith pShmNode */.
25ea0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
25eb0 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
25ec0 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70  mutex);.  for(pp
25ed0 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  =&pShmNode->pFir
25ee0 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70  st; (*pp)!=p; pp
25ef0 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74   = &(*pp)->pNext
25f00 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70  ){}.  *pp = p->p
25f10 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65  Next;..  /* Free
25f20 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
25f30 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  p */.  sqlite3_f
25f40 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64 2d  ree(p);.  pDbFd-
25f50 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c  >pShm = 0;.  sql
25f60 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
25f70 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
25f80 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d  );..  /* If pShm
25f90 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72  Node->nRef has r
25fa0 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63  eached 0, then c
25fb0 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lose the underly
25fc0 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d  ing.  ** shared-
25fd0 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f  memory file, too
25fe0 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
25ff0 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74  utex();.  assert
26000 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  ( pShmNode->nRef
26010 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  >0 );.  pShmNode
26020 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
26030 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d  pShmNode->nRef==
26040 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64 65 6c  0 ){.    if( del
26050 65 74 65 46 6c 61 67 20 26 26 20 70 53 68 6d 4e  eteFlag && pShmN
26060 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20  ode->h>=0 ){.   
26070 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 70 53 68 6d     osUnlink(pShm
26080 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  Node->zFilename)
26090 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78  ;.    }.    unix
260a0 53 68 6d 50 75 72 67 65 28 70 44 62 46 64 29 3b  ShmPurge(pDbFd);
260b0 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65  .  }.  unixLeave
260c0 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75  Mutex();..  retu
260d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
260e0 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ..#else.# define
260f0 20 75 6e 69 78 53 68 6d 4d 61 70 20 20 20 20 20   unixShmMap     
26100 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53  0.# define unixS
26110 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64 65  hmLock    0.# de
26120 66 69 6e 65 20 75 6e 69 78 53 68 6d 42 61 72 72  fine unixShmBarr
26130 69 65 72 20 30 0a 23 20 64 65 66 69 6e 65 20 75  ier 0.# define u
26140 6e 69 78 53 68 6d 55 6e 6d 61 70 20 20 20 30 0a  nixShmUnmap   0.
26150 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65  #endif /* #ifnde
26160 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
26170 4c 20 2a 2f 0a 0a 23 69 66 20 53 51 4c 49 54 45  L */..#if SQLITE
26180 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
26190 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20  ./*.** If it is 
261a0 63 75 72 72 65 6e 74 6c 79 20 6d 65 6d 6f 72 79  currently memory
261b0 20 6d 61 70 70 65 64 2c 20 75 6e 6d 61 70 20 66   mapped, unmap f
261c0 69 6c 65 20 70 46 64 2e 0a 2a 2f 0a 73 74 61 74  ile pFd..*/.stat
261d0 69 63 20 76 6f 69 64 20 75 6e 69 78 55 6e 6d 61  ic void unixUnma
261e0 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a  pfile(unixFile *
261f0 70 46 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20  pFd){.  assert( 
26200 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d  pFd->nFetchOut==
26210 30 20 29 3b 0a 20 20 69 66 28 20 70 46 64 2d 3e  0 );.  if( pFd->
26220 70 4d 61 70 52 65 67 69 6f 6e 20 29 7b 0a 20 20  pMapRegion ){.  
26230 20 20 6f 73 4d 75 6e 6d 61 70 28 70 46 64 2d 3e    osMunmap(pFd->
26240 70 4d 61 70 52 65 67 69 6f 6e 2c 20 70 46 64 2d  pMapRegion, pFd-
26250 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 29  >mmapSizeActual)
26260 3b 0a 20 20 20 20 70 46 64 2d 3e 70 4d 61 70 52  ;.    pFd->pMapR
26270 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 20 20 70  egion = 0;.    p
26280 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 30  Fd->mmapSize = 0
26290 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53  ;.    pFd->mmapS
262a0 69 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b 0a 20  izeActual = 0;. 
262b0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65   }.}../*.** Atte
262c0 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65 20 73  mpt to set the s
262d0 69 7a 65 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72  ize of the memor
262e0 79 20 6d 61 70 70 69 6e 67 20 6d 61 69 6e 74 61  y mapping mainta
262f0 69 6e 65 64 20 62 79 20 66 69 6c 65 20 0a 2a 2a  ined by file .**
26300 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 64 20   descriptor pFd 
26310 74 6f 20 6e 4e 65 77 20 62 79 74 65 73 2e 20 41  to nNew bytes. A
26320 6e 79 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70  ny existing mapp
26330 69 6e 67 20 69 73 20 64 69 73 63 61 72 64 65 64  ing is discarded
26340 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
26350 73 73 66 75 6c 2c 20 74 68 69 73 20 66 75 6e 63  ssful, this func
26360 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20 66 6f  tion sets the fo
26370 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
26380 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 75  s:.**.**       u
26390 6e 69 78 46 69 6c 65 2e 70 4d 61 70 52 65 67 69  nixFile.pMapRegi
263a0 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 75 6e 69 78  on.**       unix
263b0 46 69 6c 65 2e 6d 6d 61 70 53 69 7a 65 0a 2a 2a  File.mmapSize.**
263c0 20 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 2e         unixFile.
263d0 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 0a 2a  mmapSizeActual.*
263e0 2a 0a 2a 2a 20 49 66 20 75 6e 73 75 63 63 65 73  *.** If unsucces
263f0 73 66 75 6c 2c 20 61 6e 20 65 72 72 6f 72 20 6d  sful, an error m
26400 65 73 73 61 67 65 20 69 73 20 6c 6f 67 67 65 64  essage is logged
26410 20 76 69 61 20 73 71 6c 69 74 65 33 5f 6c 6f 67   via sqlite3_log
26420 28 29 20 61 6e 64 0a 2a 2a 20 74 68 65 20 74 68  () and.** the th
26430 72 65 65 20 76 61 72 69 61 62 6c 65 73 20 61 62  ree variables ab
26440 6f 76 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20  ove are zeroed. 
26450 49 6e 20 74 68 69 73 20 63 61 73 65 20 53 51 4c  In this case SQL
26460 69 74 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 63 6f  ite should.** co
26470 6e 74 69 6e 75 65 20 61 63 63 65 73 73 69 6e 67  ntinue accessing
26480 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75 73   the database us
26490 69 6e 67 20 74 68 65 20 78 52 65 61 64 28 29 20  ing the xRead() 
264a0 61 6e 64 20 78 57 72 69 74 65 28 29 0a 2a 2a 20  and xWrite().** 
264b0 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74  methods..*/.stat
264c0 69 63 20 76 6f 69 64 20 75 6e 69 78 52 65 6d 61  ic void unixRema
264d0 70 66 69 6c 65 28 0a 20 20 75 6e 69 78 46 69 6c  pfile(.  unixFil
264e0 65 20 2a 70 46 64 2c 20 20 20 20 20 20 20 20 20  e *pFd,         
264f0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
26500 20 64 65 73 63 72 69 70 74 6f 72 20 6f 62 6a 65   descriptor obje
26510 63 74 20 2a 2f 0a 20 20 69 36 34 20 6e 4e 65 77  ct */.  i64 nNew
26520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26530 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69          /* Requi
26540 72 65 64 20 6d 61 70 70 69 6e 67 20 73 69 7a 65  red mapping size
26550 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
26560 68 61 72 20 2a 7a 45 72 72 20 3d 20 22 6d 6d 61  har *zErr = "mma
26570 70 22 3b 0a 20 20 69 6e 74 20 68 20 3d 20 70 46  p";.  int h = pF
26580 64 2d 3e 68 3b 20 20 20 20 20 20 20 20 20 20 20  d->h;           
26590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
265a0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 70  le descriptor op
265b0 65 6e 20 6f 6e 20 64 62 20 66 69 6c 65 20 2a 2f  en on db file */
265c0 0a 20 20 75 38 20 2a 70 4f 72 69 67 20 3d 20 28  .  u8 *pOrig = (
265d0 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65  u8 *)pFd->pMapRe
265e0 67 69 6f 6e 3b 20 20 20 2f 2a 20 50 6f 69 6e 74  gion;   /* Point
265f0 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20 66 69  er to current fi
26600 6c 65 20 6d 61 70 70 69 6e 67 20 2a 2f 0a 20 20  le mapping */.  
26610 69 36 34 20 6e 4f 72 69 67 20 3d 20 70 46 64 2d  i64 nOrig = pFd-
26620 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 3b  >mmapSizeActual;
26630 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
26640 70 4f 72 69 67 20 72 65 67 69 6f 6e 20 69 6e 20  pOrig region in 
26650 62 79 74 65 73 20 2a 2f 0a 20 20 75 38 20 2a 70  bytes */.  u8 *p
26660 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20  New = 0;        
26670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26680 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20 6f 66 20 6e  /* Location of n
26690 65 77 20 6d 61 70 70 69 6e 67 20 2a 2f 0a 20 20  ew mapping */.  
266a0 69 6e 74 20 66 6c 61 67 73 20 3d 20 50 52 4f 54  int flags = PROT
266b0 5f 52 45 41 44 3b 20 20 20 20 20 20 20 20 20 20  _READ;          
266c0 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f       /* Flags to
266d0 20 70 61 73 73 20 74 6f 20 6d 6d 61 70 28 29 20   pass to mmap() 
266e0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  */..  assert( pF
266f0 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20  d->nFetchOut==0 
26700 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65  );.  assert( nNe
26710 77 3e 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20  w>pFd->mmapSize 
26720 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65  );.  assert( nNe
26730 77 3c 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  w<=pFd->mmapSize
26740 4d 61 78 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Max );.  assert(
26750 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20 61 73 73   nNew>0 );.  ass
26760 65 72 74 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69  ert( pFd->mmapSi
26770 7a 65 41 63 74 75 61 6c 3e 3d 70 46 64 2d 3e 6d  zeActual>=pFd->m
26780 6d 61 70 53 69 7a 65 20 29 3b 0a 20 20 61 73 73  mapSize );.  ass
26790 65 72 74 28 20 4d 41 50 5f 46 41 49 4c 45 44 21  ert( MAP_FAILED!
267a0 3d 30 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  =0 );..#ifdef SQ
267b0 4c 49 54 45 5f 4d 4d 41 50 5f 52 45 41 44 57 52  LITE_MMAP_READWR
267c0 49 54 45 0a 20 20 69 66 28 20 28 70 46 64 2d 3e  ITE.  if( (pFd->
267d0 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
267e0 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 20  FILE_RDONLY)==0 
267f0 29 20 66 6c 61 67 73 20 7c 3d 20 50 52 4f 54 5f  ) flags |= PROT_
26800 57 52 49 54 45 3b 0a 23 65 6e 64 69 66 0a 0a 20  WRITE;.#endif.. 
26810 20 69 66 28 20 70 4f 72 69 67 20 29 7b 0a 23 69   if( pOrig ){.#i
26820 66 20 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20 20  f HAVE_MREMAP.  
26830 20 20 69 36 34 20 6e 52 65 75 73 65 20 3d 20 70    i64 nReuse = p
26840 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 3b 0a 23 65  Fd->mmapSize;.#e
26850 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e  lse.    const in
26860 74 20 73 7a 53 79 73 70 61 67 65 20 3d 20 6f 73  t szSyspage = os
26870 47 65 74 70 61 67 65 73 69 7a 65 28 29 3b 0a 20  Getpagesize();. 
26880 20 20 20 69 36 34 20 6e 52 65 75 73 65 20 3d 20     i64 nReuse = 
26890 28 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 26  (pFd->mmapSize &
268a0 20 7e 28 73 7a 53 79 73 70 61 67 65 2d 31 29 29   ~(szSyspage-1))
268b0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 75 38 20  ;.#endif.    u8 
268c0 2a 70 52 65 71 20 3d 20 26 70 4f 72 69 67 5b 6e  *pReq = &pOrig[n
268d0 52 65 75 73 65 5d 3b 0a 0a 20 20 20 20 2f 2a 20  Reuse];..    /* 
268e0 55 6e 6d 61 70 20 61 6e 79 20 70 61 67 65 73 20  Unmap any pages 
268f0 6f 66 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  of the existing 
26900 6d 61 70 70 69 6e 67 20 74 68 61 74 20 63 61 6e  mapping that can
26910 6e 6f 74 20 62 65 20 72 65 75 73 65 64 2e 20 2a  not be reused. *
26920 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 75 73 65  /.    if( nReuse
26930 21 3d 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  !=nOrig ){.     
26940 20 6f 73 4d 75 6e 6d 61 70 28 70 52 65 71 2c 20   osMunmap(pReq, 
26950 6e 4f 72 69 67 2d 6e 52 65 75 73 65 29 3b 0a 20  nOrig-nReuse);. 
26960 20 20 20 7d 0a 0a 23 69 66 20 48 41 56 45 5f 4d     }..#if HAVE_M
26970 52 45 4d 41 50 0a 20 20 20 20 70 4e 65 77 20 3d  REMAP.    pNew =
26980 20 6f 73 4d 72 65 6d 61 70 28 70 4f 72 69 67 2c   osMremap(pOrig,
26990 20 6e 52 65 75 73 65 2c 20 6e 4e 65 77 2c 20 4d   nReuse, nNew, M
269a0 52 45 4d 41 50 5f 4d 41 59 4d 4f 56 45 29 3b 0a  REMAP_MAYMOVE);.
269b0 20 20 20 20 7a 45 72 72 20 3d 20 22 6d 72 65 6d      zErr = "mrem
269c0 61 70 22 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70  ap";.#else.    p
269d0 4e 65 77 20 3d 20 6f 73 4d 6d 61 70 28 70 52 65  New = osMmap(pRe
269e0 71 2c 20 6e 4e 65 77 2d 6e 52 65 75 73 65 2c 20  q, nNew-nReuse, 
269f0 66 6c 61 67 73 2c 20 4d 41 50 5f 53 48 41 52 45  flags, MAP_SHARE
26a00 44 2c 20 68 2c 20 6e 52 65 75 73 65 29 3b 0a 20  D, h, nReuse);. 
26a10 20 20 20 69 66 28 20 70 4e 65 77 21 3d 4d 41 50     if( pNew!=MAP
26a20 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20  _FAILED ){.     
26a30 20 69 66 28 20 70 4e 65 77 21 3d 70 52 65 71 20   if( pNew!=pReq 
26a40 29 7b 0a 20 20 20 20 20 20 20 20 6f 73 4d 75 6e  ){.        osMun
26a50 6d 61 70 28 70 4e 65 77 2c 20 6e 4e 65 77 20 2d  map(pNew, nNew -
26a60 20 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 20 20   nReuse);.      
26a70 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20    pNew = 0;.    
26a80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26a90 20 70 4e 65 77 20 3d 20 70 4f 72 69 67 3b 0a 20   pNew = pOrig;. 
26aa0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
26ab0 64 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  dif..    /* The 
26ac0 61 74 74 65 6d 70 74 20 74 6f 20 65 78 74 65 6e  attempt to exten
26ad0 64 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d  d the existing m
26ae0 61 70 70 69 6e 67 20 66 61 69 6c 65 64 2e 20 46  apping failed. F
26af0 72 65 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69  ree it. */.    i
26b00 66 28 20 70 4e 65 77 3d 3d 4d 41 50 5f 46 41 49  f( pNew==MAP_FAI
26b10 4c 45 44 20 7c 7c 20 70 4e 65 77 3d 3d 30 20 29  LED || pNew==0 )
26b20 7b 0a 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70  {.      osMunmap
26b30 28 70 4f 72 69 67 2c 20 6e 52 65 75 73 65 29 3b  (pOrig, nReuse);
26b40 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
26b50 20 49 66 20 70 4e 65 77 20 69 73 20 73 74 69 6c   If pNew is stil
26b60 6c 20 4e 55 4c 4c 2c 20 74 72 79 20 74 6f 20 63  l NULL, try to c
26b70 72 65 61 74 65 20 61 6e 20 65 6e 74 69 72 65 6c  reate an entirel
26b80 79 20 6e 65 77 20 6d 61 70 70 69 6e 67 2e 20 2a  y new mapping. *
26b90 2f 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  /.  if( pNew==0 
26ba0 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73  ){.    pNew = os
26bb0 4d 6d 61 70 28 30 2c 20 6e 4e 65 77 2c 20 66 6c  Mmap(0, nNew, fl
26bc0 61 67 73 2c 20 4d 41 50 5f 53 48 41 52 45 44 2c  ags, MAP_SHARED,
26bd0 20 68 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 69   h, 0);.  }..  i
26be0 66 28 20 70 4e 65 77 3d 3d 4d 41 50 5f 46 41 49  f( pNew==MAP_FAI
26bf0 4c 45 44 20 29 7b 0a 20 20 20 20 70 4e 65 77 20  LED ){.    pNew 
26c00 3d 20 30 3b 0a 20 20 20 20 6e 4e 65 77 20 3d 20  = 0;.    nNew = 
26c10 30 3b 0a 20 20 20 20 75 6e 69 78 4c 6f 67 45 72  0;.    unixLogEr
26c20 72 6f 72 28 53 51 4c 49 54 45 5f 4f 4b 2c 20 7a  ror(SQLITE_OK, z
26c30 45 72 72 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29  Err, pFd->zPath)
26c40 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
26c50 20 6d 6d 61 70 28 29 20 61 62 6f 76 65 20 66 61   mmap() above fa
26c60 69 6c 65 64 2c 20 61 73 73 75 6d 65 20 74 68 61  iled, assume tha
26c70 74 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  t all subsequent
26c80 20 6d 6d 61 70 28 29 20 63 61 6c 6c 73 0a 20 20   mmap() calls.  
26c90 20 20 2a 2a 20 77 69 6c 6c 20 70 72 6f 62 61 62    ** will probab
26ca0 6c 79 20 66 61 69 6c 20 74 6f 6f 2e 20 46 61 6c  ly fail too. Fal
26cb0 6c 20 62 61 63 6b 20 74 6f 20 75 73 69 6e 67 20  l back to using 
26cc0 78 52 65 61 64 2f 78 57 72 69 74 65 20 65 78 63  xRead/xWrite exc
26cd0 6c 75 73 69 76 65 6c 79 0a 20 20 20 20 2a 2a 20  lusively.    ** 
26ce0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a  in this case.  *
26cf0 2f 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53  /.    pFd->mmapS
26d00 69 7a 65 4d 61 78 20 3d 20 30 3b 0a 20 20 7d 0a  izeMax = 0;.  }.
26d10 20 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f    pFd->pMapRegio
26d20 6e 20 3d 20 28 76 6f 69 64 20 2a 29 70 4e 65 77  n = (void *)pNew
26d30 3b 0a 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  ;.  pFd->mmapSiz
26d40 65 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  e = pFd->mmapSiz
26d50 65 41 63 74 75 61 6c 20 3d 20 6e 4e 65 77 3b 0a  eActual = nNew;.
26d60 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20  }../*.** Memory 
26d70 6d 61 70 20 6f 72 20 72 65 6d 61 70 20 74 68 65  map or remap the
26d80 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 62 79 20   file opened by 
26d90 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20  file-descriptor 
26da0 70 46 64 20 28 69 66 20 74 68 65 20 66 69 6c 65  pFd (if the file
26db0 0a 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 6d  .** is already m
26dc0 61 70 70 65 64 2c 20 74 68 65 20 65 78 69 73 74  apped, the exist
26dd0 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73 20 72  ing mapping is r
26de0 65 70 6c 61 63 65 64 20 62 79 20 74 68 65 20 6e  eplaced by the n
26df0 65 77 29 2e 20 4f 72 2c 20 69 66 20 0a 2a 2a 20  ew). Or, if .** 
26e00 74 68 65 72 65 20 61 6c 72 65 61 64 79 20 65 78  there already ex
26e10 69 73 74 73 20 61 20 6d 61 70 70 69 6e 67 20 66  ists a mapping f
26e20 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6e  or this file, an
26e30 64 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c  d there are stil
26e40 6c 20 0a 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e  l .** outstandin
26e50 67 20 78 46 65 74 63 68 28 29 20 72 65 66 65 72  g xFetch() refer
26e60 65 6e 63 65 73 20 74 6f 20 69 74 2c 20 74 68 69  ences to it, thi
26e70 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
26e80 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  no-op..**.** If 
26e90 70 61 72 61 6d 65 74 65 72 20 6e 42 79 74 65 20  parameter nByte 
26ea0 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2c  is non-negative,
26eb0 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20   then it is the 
26ec0 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f  requested size o
26ed0 66 20 0a 2a 2a 20 74 68 65 20 6d 61 70 70 69 6e  f .** the mappin
26ee0 67 20 74 6f 20 63 72 65 61 74 65 2e 20 4f 74 68  g to create. Oth
26ef0 65 72 77 69 73 65 2c 20 69 66 20 6e 42 79 74 65  erwise, if nByte
26f00 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65   is less than ze
26f10 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a  ro, then the .**
26f20 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20   requested size 
26f30 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  is the size of t
26f40 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  he file on disk.
26f50 20 54 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65   The actual size
26f60 20 6f 66 20 74 68 65 0a 2a 2a 20 63 72 65 61 74   of the.** creat
26f70 65 64 20 6d 61 70 70 69 6e 67 20 69 73 20 65 69  ed mapping is ei
26f80 74 68 65 72 20 74 68 65 20 72 65 71 75 65 73 74  ther the request
26f90 65 64 20 73 69 7a 65 20 6f 72 20 74 68 65 20 76  ed size or the v
26fa0 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65 64 20  alue configured 
26fb0 0a 2a 2a 20 75 73 69 6e 67 20 53 51 4c 49 54 45  .** using SQLITE
26fc0 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 4c 49 4d 49  _FCNTL_MMAP_LIMI
26fd0 54 2c 20 77 68 69 63 68 65 76 65 72 20 69 73 20  T, whichever is 
26fe0 73 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 53  smaller..**.** S
26ff0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
27000 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72  rned if no error
27010 20 6f 63 63 75 72 73 20 28 65 76 65 6e 20 69 66   occurs (even if
27020 20 74 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20   the mapping is 
27030 6e 6f 74 0a 2a 2a 20 72 65 63 72 65 61 74 65 64  not.** recreated
27040 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
27050 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
27060 72 65 6e 63 65 73 29 20 6f 72 20 61 6e 20 53 51  rences) or an SQ
27070 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  Lite error.** co
27080 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  de otherwise..*/
27090 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
270a0 4d 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65  Mapfile(unixFile
270b0 20 2a 70 46 64 2c 20 69 36 34 20 6e 42 79 74 65   *pFd, i64 nByte
270c0 29 7b 0a 20 20 69 36 34 20 6e 4d 61 70 20 3d 20  ){.  i64 nMap = 
270d0 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 72 63 3b  nByte;.  int rc;
270e0 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 61 70  ..  assert( nMap
270f0 3e 3d 30 20 7c 7c 20 70 46 64 2d 3e 6e 46 65 74  >=0 || pFd->nFet
27100 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 69 66  chOut==0 );.  if
27110 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74  ( pFd->nFetchOut
27120 3e 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  >0 ) return SQLI
27130 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 6e 4d  TE_OK;..  if( nM
27140 61 70 3c 30 20 29 7b 0a 20 20 20 20 73 74 72 75  ap<0 ){.    stru
27150 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b  ct stat statbuf;
27160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77            /* Low
27170 2d 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e 66 6f  -level file info
27180 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 72  rmation */.    r
27190 63 20 3d 20 6f 73 46 73 74 61 74 28 70 46 64 2d  c = osFstat(pFd-
271a0 3e 68 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20  >h, &statbuf);. 
271b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
271c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
271d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
271e0 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20  R_FSTAT;.    }. 
271f0 20 20 20 6e 4d 61 70 20 3d 20 73 74 61 74 62 75     nMap = statbu
27200 66 2e 73 74 5f 73 69 7a 65 3b 0a 20 20 7d 0a 20  f.st_size;.  }. 
27210 20 69 66 28 20 6e 4d 61 70 3e 70 46 64 2d 3e 6d   if( nMap>pFd->m
27220 6d 61 70 53 69 7a 65 4d 61 78 20 29 7b 0a 20 20  mapSizeMax ){.  
27230 20 20 6e 4d 61 70 20 3d 20 70 46 64 2d 3e 6d 6d    nMap = pFd->mm
27240 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 7d 0a 0a  apSizeMax;.  }..
27250 20 20 69 66 28 20 6e 4d 61 70 21 3d 70 46 64 2d    if( nMap!=pFd-
27260 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20  >mmapSize ){.   
27270 20 69 66 28 20 6e 4d 61 70 3e 30 20 29 7b 0a 20   if( nMap>0 ){. 
27280 20 20 20 20 20 75 6e 69 78 52 65 6d 61 70 66 69       unixRemapfi
27290 6c 65 28 70 46 64 2c 20 6e 4d 61 70 29 3b 0a 20  le(pFd, nMap);. 
272a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
272b0 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46  unixUnmapfile(pF
272c0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  d);.    }.  }.. 
272d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
272e0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
272f0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
27300 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  IZE>0 */../*.** 
27310 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 72 65 74  If possible, ret
27320 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
27330 20 61 20 6d 61 70 70 69 6e 67 20 6f 66 20 66 69   a mapping of fi
27340 6c 65 20 66 64 20 73 74 61 72 74 69 6e 67 20 61  le fd starting a
27350 74 20 6f 66 66 73 65 74 0a 2a 2a 20 69 4f 66 66  t offset.** iOff
27360 2e 20 54 68 65 20 6d 61 70 70 69 6e 67 20 6d 75  . The mapping mu
27370 73 74 20 62 65 20 76 61 6c 69 64 20 66 6f 72 20  st be valid for 
27380 61 74 20 6c 65 61 73 74 20 6e 41 6d 74 20 62 79  at least nAmt by
27390 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  tes..**.** If su
273a0 63 68 20 61 20 70 6f 69 6e 74 65 72 20 63 61 6e  ch a pointer can
273b0 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 73 74   be obtained, st
273c0 6f 72 65 20 69 74 20 69 6e 20 2a 70 70 20 61 6e  ore it in *pp an
273d0 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
273e0 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f 6e  OK..** Or, if on
273f0 65 20 63 61 6e 6e 6f 74 20 62 75 74 20 6e 6f 20  e cannot but no 
27400 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
27410 74 20 2a 70 70 20 74 6f 20 30 20 61 6e 64 20 72  t *pp to 0 and r
27420 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
27430 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20  .** Finally, if 
27440 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63  an error does oc
27450 63 75 72 2c 20 72 65 74 75 72 6e 20 61 6e 20 53  cur, return an S
27460 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
27470 2e 20 54 68 65 20 66 69 6e 61 6c 0a 2a 2a 20 76  . The final.** v
27480 61 6c 75 65 20 6f 66 20 2a 70 70 20 69 73 20 75  alue of *pp is u
27490 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73  ndefined in this
274a0 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   case..**.** If 
274b0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  this function do
274c0 65 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  es return a poin
274d0 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  ter, the caller 
274e0 6d 75 73 74 20 65 76 65 6e 74 75 61 6c 6c 79 20  must eventually 
274f0 0a 2a 2a 20 72 65 6c 65 61 73 65 20 74 68 65 20  .** release the 
27500 72 65 66 65 72 65 6e 63 65 20 62 79 20 63 61 6c  reference by cal
27510 6c 69 6e 67 20 75 6e 69 78 55 6e 66 65 74 63 68  ling unixUnfetch
27520 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
27530 74 20 75 6e 69 78 46 65 74 63 68 28 73 71 6c 69  t unixFetch(sqli
27540 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
27550 34 20 69 4f 66 66 2c 20 69 6e 74 20 6e 41 6d 74  4 iOff, int nAmt
27560 2c 20 76 6f 69 64 20 2a 2a 70 70 29 7b 0a 23 69  , void **pp){.#i
27570 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
27580 50 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78 46  P_SIZE>0.  unixF
27590 69 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e 69 78  ile *pFd = (unix
275a0 46 69 6c 65 20 2a 29 66 64 3b 20 20 20 2f 2a 20  File *)fd;   /* 
275b0 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  The underlying d
275c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
275d0 23 65 6e 64 69 66 0a 20 20 2a 70 70 20 3d 20 30  #endif.  *pp = 0
275e0 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ;..#if SQLITE_MA
275f0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
27600 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  if( pFd->mmapSiz
27610 65 4d 61 78 3e 30 20 29 7b 0a 20 20 20 20 69 66  eMax>0 ){.    if
27620 28 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f  ( pFd->pMapRegio
27630 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  n==0 ){.      in
27640 74 20 72 63 20 3d 20 75 6e 69 78 4d 61 70 66 69  t rc = unixMapfi
27650 6c 65 28 70 46 64 2c 20 2d 31 29 3b 0a 20 20 20  le(pFd, -1);.   
27660 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
27670 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
27680 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
27690 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d  pFd->mmapSize >=
276a0 20 69 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a 20 20   iOff+nAmt ){.  
276b0 20 20 20 20 2a 70 70 20 3d 20 26 28 28 75 38 20      *pp = &((u8 
276c0 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f  *)pFd->pMapRegio
276d0 6e 29 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20  n)[iOff];.      
276e0 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2b 2b  pFd->nFetchOut++
276f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
27700 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
27710 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
27720 49 66 20 74 68 65 20 74 68 69 72 64 20 61 72 67  If the third arg
27730 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c  ument is non-NUL
27740 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  L, then this fun
27750 63 74 69 6f 6e 20 72 65 6c 65 61 73 65 73 20 61  ction releases a
27760 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 6f   .** reference o
27770 62 74 61 69 6e 65 64 20 62 79 20 61 6e 20 65 61  btained by an ea
27780 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 75 6e  rlier call to un
27790 69 78 46 65 74 63 68 28 29 2e 20 54 68 65 20 73  ixFetch(). The s
277a0 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e  econd.** argumen
277b0 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  t passed to this
277c0 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62   function must b
277d0 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  e the same as th
277e0 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
277f0 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 68 61 74  ** argument that
27800 20 77 61 73 20 70 61 73 73 65 64 20 74 6f 20 74   was passed to t
27810 68 65 20 75 6e 69 78 46 65 74 63 68 28 29 20 69  he unixFetch() i
27820 6e 76 6f 63 61 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a  nvocation. .**.*
27830 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 74 68 69  * Or, if the thi
27840 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 4e  rd argument is N
27850 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66  ULL, then this f
27860 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  unction is being
27870 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 74 6f 20 69   called .** to i
27880 6e 66 6f 72 6d 20 74 68 65 20 56 46 53 20 6c 61  nform the VFS la
27890 79 65 72 20 74 68 61 74 2c 20 61 63 63 6f 72 64  yer that, accord
278a0 69 6e 67 20 74 6f 20 50 4f 53 49 58 2c 20 61 6e  ing to POSIX, an
278b0 79 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69  y existing mappi
278c0 6e 67 20 0a 2a 2a 20 6d 61 79 20 6e 6f 77 20 62  ng .** may now b
278d0 65 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68  e invalid and sh
278e0 6f 75 6c 64 20 62 65 20 75 6e 6d 61 70 70 65 64  ould be unmapped
278f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27900 75 6e 69 78 55 6e 66 65 74 63 68 28 73 71 6c 69  unixUnfetch(sqli
27910 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
27920 34 20 69 4f 66 66 2c 20 76 6f 69 64 20 2a 70 29  4 iOff, void *p)
27930 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  {.#if SQLITE_MAX
27940 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75  _MMAP_SIZE>0.  u
27950 6e 69 78 46 69 6c 65 20 2a 70 46 64 20 3d 20 28  nixFile *pFd = (
27960 75 6e 69 78 46 69 6c 65 20 2a 29 66 64 3b 20 20  unixFile *)fd;  
27970 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
27980 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
27990 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   */.  UNUSED_PAR
279a0 41 4d 45 54 45 52 28 69 4f 66 66 29 3b 0a 0a 20  AMETER(iOff);.. 
279b0 20 2f 2a 20 49 66 20 70 3d 3d 30 20 28 75 6e 6d   /* If p==0 (unm
279c0 61 70 20 74 68 65 20 65 6e 74 69 72 65 20 66 69  ap the entire fi
279d0 6c 65 29 20 74 68 65 6e 20 74 68 65 72 65 20 6d  le) then there m
279e0 75 73 74 20 62 65 20 6e 6f 20 6f 75 74 73 74 61  ust be no outsta
279f0 6e 64 69 6e 67 20 0a 20 20 2a 2a 20 78 46 65 74  nding .  ** xFet
27a00 63 68 20 72 65 66 65 72 65 6e 63 65 73 2e 20 4f  ch references. O
27a10 72 2c 20 69 66 20 70 21 3d 30 20 28 6d 65 61 6e  r, if p!=0 (mean
27a20 69 6e 67 20 69 74 20 69 73 20 61 6e 20 78 46 65  ing it is an xFe
27a30 74 63 68 20 72 65 66 65 72 65 6e 63 65 29 2c 0a  tch reference),.
27a40 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20    ** then there 
27a50 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
27a60 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   one outstanding
27a70 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
27a80 28 70 3d 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e 46  (p==0)==(pFd->nF
27a90 65 74 63 68 4f 75 74 3d 3d 30 29 20 29 3b 0a 0a  etchOut==0) );..
27aa0 20 20 2f 2a 20 49 66 20 70 21 3d 30 2c 20 69 74    /* If p!=0, it
27ab0 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68 65 20   must match the 
27ac0 69 4f 66 66 20 76 61 6c 75 65 2e 20 2a 2f 0a 20  iOff value. */. 
27ad0 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c   assert( p==0 ||
27ae0 20 70 3d 3d 26 28 28 75 38 20 2a 29 70 46 64 2d   p==&((u8 *)pFd-
27af0 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66  >pMapRegion)[iOf
27b00 66 5d 20 29 3b 0a 0a 20 20 69 66 28 20 70 20 29  f] );..  if( p )
27b10 7b 0a 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63  {.    pFd->nFetc
27b20 68 4f 75 74 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b  hOut--;.  }else{
27b30 0a 20 20 20 20 75 6e 69 78 55 6e 6d 61 70 66 69  .    unixUnmapfi
27b40 6c 65 28 70 46 64 29 3b 0a 20 20 7d 0a 0a 20 20  le(pFd);.  }..  
27b50 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65  assert( pFd->nFe
27b60 74 63 68 4f 75 74 3e 3d 30 20 29 3b 0a 23 65 6c  tchOut>=0 );.#el
27b70 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
27b80 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55  METER(fd);.  UNU
27b90 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
27ba0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
27bb0 45 54 45 52 28 69 4f 66 66 29 3b 0a 23 65 6e 64  ETER(iOff);.#end
27bc0 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
27bd0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
27be0 48 65 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d  Here ends the im
27bf0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
27c00 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  all sqlite3_file
27c10 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a   methods..**.***
27c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27c30 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f  *** End sqlite3_
27c40 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a  file Methods ***
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 0a 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 2a 2a 2a  ****************
27c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
27cc0 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f  .** This divisio
27cd0 6e 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e  n contains defin
27ce0 69 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65  itions of sqlite
27cf0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
27d00 65 63 74 73 20 74 68 61 74 0a 2a 2a 20 69 6d 70  ects that.** imp
27d10 6c 65 6d 65 6e 74 20 76 61 72 69 6f 75 73 20 66  lement various f
27d20 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  ile locking stra
27d30 74 65 67 69 65 73 2e 20 20 49 74 20 61 6c 73 6f  tegies.  It also
27d40 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69   contains defini
27d50 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66 69 6e  tions.** of "fin
27d60 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73 2e 20  der" functions. 
27d70 20 41 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69   A finder-functi
27d80 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6c 6f  on is used to lo
27d90 63 61 74 65 20 74 68 65 20 61 70 70 72 6f 70 72  cate the appropr
27da0 69 61 74 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  iate.** sqlite3_
27db0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
27dc0 74 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c  t for a particul
27dd0 61 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ar database file
27de0 2e 20 20 54 68 65 20 70 41 70 70 44 61 74 61 0a  .  The pAppData.
27df0 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ** field of the 
27e00 73 71 6c 69 74 65 33 5f 76 66 73 20 56 46 53 20  sqlite3_vfs VFS 
27e10 6f 62 6a 65 63 74 73 20 61 72 65 20 69 6e 69 74  objects are init
27e20 69 61 6c 69 7a 65 64 20 74 6f 20 62 65 20 70 6f  ialized to be po
27e30 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65  inters to.** the
27e40 20 63 6f 72 72 65 63 74 20 66 69 6e 64 65 72 2d   correct finder-
27e50 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68 61  function for tha
27e60 74 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73  t VFS..**.** Mos
27e70 74 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  t finder functio
27e80 6e 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  ns return a poin
27e90 74 65 72 20 74 6f 20 61 20 66 69 78 65 64 20 73  ter to a fixed s
27ea0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
27eb0 73 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 54 68  s.** object.  Th
27ec0 65 20 6f 6e 6c 79 20 69 6e 74 65 72 65 73 74 69  e only interesti
27ed0 6e 67 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  ng finder-functi
27ee0 6f 6e 20 69 73 20 61 75 74 6f 6c 6f 63 6b 49 6f  on is autolockIo
27ef0 46 69 6e 64 65 72 2c 20 77 68 69 63 68 0a 2a 2a  Finder, which.**
27f00 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66 69   looks at the fi
27f10 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 61 6e  lesystem type an
27f20 64 20 74 72 69 65 73 20 74 6f 20 67 75 65 73 73  d tries to guess
27f30 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e   the best lockin
27f40 67 0a 2a 2a 20 73 74 72 61 74 65 67 79 20 66 72  g.** strategy fr
27f50 6f 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46  om that..**.** F
27f60 6f 72 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  or finder-functi
27f70 6f 6e 20 46 2c 20 74 77 6f 20 6f 62 6a 65 63 74  on F, two object
27f80 73 20 61 72 65 20 63 72 65 61 74 65 64 3a 0a 2a  s are created:.*
27f90 2a 0a 2a 2a 20 20 20 20 28 31 29 20 54 68 65 20  *.**    (1) The 
27fa0 72 65 61 6c 20 66 69 6e 64 65 72 2d 66 75 6e 63  real finder-func
27fb0 74 69 6f 6e 20 6e 61 6d 65 64 20 22 46 49 6d 70  tion named "FImp
27fc0 74 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  t()"..**.**    (
27fd0 32 29 20 41 20 63 6f 6e 73 74 61 6e 74 20 70 6f  2) A constant po
27fe0 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 66 75  inter to this fu
27ff0 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 6a 75 73  nction named jus
28000 74 20 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  t "F"..**.**.** 
28010 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  A pointer to the
28020 20 46 20 70 6f 69 6e 74 65 72 20 69 73 20 75 73   F pointer is us
28030 65 64 20 61 73 20 74 68 65 20 70 41 70 70 44 61  ed as the pAppDa
28040 74 61 20 76 61 6c 75 65 20 66 6f 72 20 56 46 53  ta value for VFS
28050 0a 2a 2a 20 6f 62 6a 65 63 74 73 2e 20 20 57 65  .** objects.  We
28060 20 68 61 76 65 20 74 6f 20 64 6f 20 74 68 69 73   have to do this
28070 20 69 6e 73 74 65 61 64 20 6f 66 20 6c 65 74 74   instead of lett
28080 69 6e 67 20 70 41 70 70 44 61 74 61 20 70 6f 69  ing pAppData poi
28090 6e 74 0a 2a 2a 20 64 69 72 65 63 74 6c 79 20 61  nt.** directly a
280a0 74 20 74 68 65 20 66 69 6e 64 65 72 2d 66 75 6e  t the finder-fun
280b0 63 74 69 6f 6e 20 73 69 6e 63 65 20 43 39 30 20  ction since C90 
280c0 72 75 6c 65 73 20 70 72 65 76 65 6e 74 20 61 20  rules prevent a 
280d0 76 6f 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65  void*.** from be
280e0 20 63 61 73 74 20 69 6e 74 6f 20 61 20 66 75 6e   cast into a fun
280f0 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a  ction pointer..*
28100 2a 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73  *.**.** Each ins
28110 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6d 61  tance of this ma
28120 63 72 6f 20 67 65 6e 65 72 61 74 65 73 20 74 77  cro generates tw
28130 6f 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a  o objects:.**.**
28140 20 20 20 2a 20 20 41 20 63 6f 6e 73 74 61 6e 74     *  A constant
28150 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
28160 6f 64 73 20 6f 62 6a 65 63 74 20 63 61 6c 6c 20  ods object call 
28170 4d 45 54 48 4f 44 20 74 68 61 74 20 68 61 73 20  METHOD that has 
28180 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20  locking.**      
28190 6d 65 74 68 6f 64 73 20 43 4c 4f 53 45 2c 20 4c  methods CLOSE, L
281a0 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52  OCK, UNLOCK, CKR
281b0 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20  ESLOCK..**.**   
281c0 2a 20 20 41 6e 20 49 2f 4f 20 6d 65 74 68 6f 64  *  An I/O method
281d0 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   finder function
281e0 20 63 61 6c 6c 65 64 20 46 49 4e 44 45 52 20 74   called FINDER t
281f0 68 61 74 20 72 65 74 75 72 6e 73 20 61 20 70 6f  hat returns a po
28200 69 6e 74 65 72 0a 2a 2a 20 20 20 20 20 20 74 6f  inter.**      to
28210 20 74 68 65 20 4d 45 54 48 4f 44 20 6f 62 6a 65   the METHOD obje
28220 63 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  ct in the previo
28230 75 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64  us bullet..*/.#d
28240 65 66 69 6e 65 20 49 4f 4d 45 54 48 4f 44 53 28  efine IOMETHODS(
28250 46 49 4e 44 45 52 2c 4d 45 54 48 4f 44 2c 56 45  FINDER,METHOD,VE
28260 52 53 49 4f 4e 2c 43 4c 4f 53 45 2c 4c 4f 43 4b  RSION,CLOSE,LOCK
28270 2c 55 4e 4c 4f 43 4b 2c 43 4b 4c 4f 43 4b 2c 53  ,UNLOCK,CKLOCK,S
28280 48 4d 4d 41 50 29 20 20 20 20 20 5c 0a 73 74 61  HMMAP)     \.sta
28290 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
282a0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 4d 45 54  3_io_methods MET
282b0 48 4f 44 20 3d 20 7b 20 20 20 20 20 20 20 20 20  HOD = {         
282c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
282d0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 56            \.   V
282e0 45 52 53 49 4f 4e 2c 20 20 20 20 20 20 20 20 20  ERSION,         
282f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
28300 65 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20  ersion */       
28310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28320 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4c           \.   CL
28330 4f 53 45 2c 20 20 20 20 20 20 20 20 20 20 20 20  OSE,            
28340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
28350 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ose */          
28360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28370 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
28380 78 52 65 61 64 2c 20 20 20 20 20 20 20 20 20 20  xRead,          
28390 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61           /* xRea
283a0 64 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  d */            
283b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283c0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
283d0 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20  Write,          
283e0 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74          /* xWrit
283f0 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
28400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28410 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 54        \.   unixT
28420 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20  runcate,        
28430 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63         /* xTrunc
28440 61 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ate */          
28450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28460 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 79       \.   unixSy
28470 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nc,             
28480 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a        /* xSync *
28490 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
284a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284b0 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c      \.   unixFil
284c0 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  eSize,          
284d0 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a       /* xFileSiz
284e0 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
284f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28500 20 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20 20     \.   LOCK,   
28510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28520 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20      /* xLock */ 
28530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28550 20 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20 20    \.   UNLOCK,  
28560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28570 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f     /* xUnlock */
28580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285a0 20 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20 20 20   \.   CKLOCK,   
285b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285c0 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
285d0 76 65 64 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20  vedLock */      
285e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285f0 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e  \.   unixFileCon
28600 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  trol,           
28610 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c   /* xFileControl
28620 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
28630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
28640 0a 20 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69  .   unixSectorSi
28650 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
28660 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a  /* xSectorSize *
28670 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
28680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
28690 20 20 20 75 6e 69 78 44 65 76 69 63 65 43 68 61     unixDeviceCha
286a0 72 61 63 74 65 72 69 73 74 69 63 73 2c 20 20 2f  racteristics,  /
286b0 2a 20 78 44 65 76 69 63 65 43 61 70 61 62 69 6c  * xDeviceCapabil
286c0 69 74 69 65 73 20 2a 2f 20 20 20 20 20 20 20 20  ities */        
286d0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
286e0 20 20 53 48 4d 4d 41 50 2c 20 20 20 20 20 20 20    SHMMAP,       
286f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28700 20 78 53 68 6d 4d 61 70 20 2a 2f 20 20 20 20 20   xShmMap */     
28710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28720 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
28730 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20 20 20   unixShmLock,   
28740 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28750 78 53 68 6d 4c 6f 63 6b 20 2a 2f 20 20 20 20 20  xShmLock */     
28760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28770 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
28780 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 2c 20  unixShmBarrier, 
28790 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
287a0 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 20 20 20  ShmBarrier */   
287b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287c0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
287d0 6e 69 78 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20  nixShmUnmap,    
287e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
287f0 68 6d 55 6e 6d 61 70 20 2a 2f 20 20 20 20 20 20  hmUnmap */      
28800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28810 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
28820 69 78 46 65 74 63 68 2c 20 20 20 20 20 20 20 20  ixFetch,        
28830 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65            /* xFe
28840 74 63 68 20 2a 2f 20 20 20 20 20 20 20 20 20 20  tch */          
28850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28860 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
28870 78 55 6e 66 65 74 63 68 2c 20 20 20 20 20 20 20  xUnfetch,       
28880 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 66           /* xUnf
28890 65 74 63 68 20 2a 2f 20 20 20 20 20 20 20 20 20  etch */         
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 5c 0a 7d 3b 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 20 20 20 20 20 20 20 20                  
288e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28900 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63        \.static c
28910 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
28920 6d 65 74 68 6f 64 73 20 2a 46 49 4e 44 45 52 23  methods *FINDER#
28930 23 49 6d 70 6c 28 63 6f 6e 73 74 20 63 68 61 72  #Impl(const char
28940 20 2a 7a 2c 20 75 6e 69 78 46 69 6c 65 20 2a 70   *z, unixFile *p
28950 29 7b 20 20 20 5c 0a 20 20 55 4e 55 53 45 44 5f  ){   \.  UNUSED_
28960 50 41 52 41 4d 45 54 45 52 28 7a 29 3b 20 55 4e  PARAMETER(z); UN
28970 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
28980 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
28990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289a0 20 20 20 20 5c 0a 20 20 72 65 74 75 72 6e 20 26      \.  return &
289b0 4d 45 54 48 4f 44 3b 20 20 20 20 20 20 20 20 20  METHOD;         
289c0 20 20 20 20 20 20 20 20 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 5c 0a 7d 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 20 20 20 20 20 20 20 20 20 20 20 20                  
28a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a40 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74    \.static const
28a50 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
28a60 6f 64 73 20 2a 28 2a 63 6f 6e 73 74 20 46 49 4e  ods *(*const FIN
28a70 44 45 52 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  DER)(const char*
28a80 2c 75 6e 69 78 46 69 6c 65 20 2a 70 29 20 20 20  ,unixFile *p)   
28a90 20 5c 0a 20 20 20 20 3d 20 46 49 4e 44 45 52 23   \.    = FINDER#
28aa0 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65  #Impl;../*.** He
28ab0 72 65 20 61 72 65 20 61 6c 6c 20 6f 66 20 74 68  re are all of th
28ac0 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
28ad0 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  hods objects for
28ae0 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20   each of the.** 
28af0 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69  locking strategi
28b00 65 73 2e 20 20 46 75 6e 63 74 69 6f 6e 73 20 74  es.  Functions t
28b10 68 61 74 20 72 65 74 75 72 6e 20 70 6f 69 6e 74  hat return point
28b20 65 72 73 20 74 6f 20 74 68 65 73 65 20 6d 65 74  ers to these met
28b30 68 6f 64 73 0a 2a 2a 20 61 72 65 20 61 6c 73 6f  hods.** are also
28b40 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 49 4f 4d   created..*/.IOM
28b50 45 54 48 4f 44 53 28 0a 20 20 70 6f 73 69 78 49  ETHODS(.  posixI
28b60 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
28b70 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
28b80 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
28b90 20 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 2c   posixIoMethods,
28ba0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
28bb0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
28bc0 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
28bd0 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20    3,            
28be0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
28bf0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 6e 64  hared memory and
28c00 20 6d 6d 61 70 20 61 72 65 20 65 6e 61 62 6c 65   mmap are enable
28c10 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65  d */.  unixClose
28c20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28c30 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
28c40 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c  d */.  unixLock,
28c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c60 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
28c70 20 2a 2f 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b   */.  unixUnlock
28c80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28c90 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
28ca0 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b  d */.  unixCheck
28cb0 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20  ReservedLock,   
28cc0 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
28cd0 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
28ce0 0a 20 20 75 6e 69 78 53 68 6d 4d 61 70 20 20 20  .  unixShmMap   
28cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28d00 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a  xShmMap method *
28d10 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  /.).IOMETHODS(. 
28d20 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c   nolockIoFinder,
28d30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
28d40 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
28d50 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 49 6f  me */.  nolockIo
28d60 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
28d70 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
28d80 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
28d90 61 6d 65 20 2a 2f 0a 20 20 33 2c 20 20 20 20 20  ame */.  3,     
28da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28db0 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
28dc0 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20  ory is disabled 
28dd0 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65  */.  nolockClose
28de0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
28df0 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
28e00 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c  */.  nolockLock,
28e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28e20 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
28e30 2f 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b  /.  nolockUnlock
28e40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
28e50 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
28e60 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b  */.  nolockCheck
28e70 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 2f  ReservedLock,  /
28e80 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
28e90 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
28ea0 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
28eb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
28ec0 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a  hmMap method */.
28ed0 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 64  ).IOMETHODS(.  d
28ee0 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20  otlockIoFinder, 
28ef0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
28f00 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
28f10 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 4d   */.  dotlockIoM
28f20 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
28f30 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
28f40 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
28f50 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
28f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f70 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
28f80 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  y is disabled */
28f90 0a 20 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 2c  .  dotlockClose,
28fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28fb0 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
28fc0 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20  .  dotlockLock, 
28fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28fe0 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
28ff0 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c    dotlockUnlock,
29000 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29010 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
29020 0a 20 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52  .  dotlockCheckR
29030 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 2f 2a 20  eservedLock, /* 
29040 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
29050 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30  ck method */.  0
29060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29070 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
29080 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  Map method */.).
29090 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
290a0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
290b0 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 66 6c  .IOMETHODS(.  fl
290c0 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  ockIoFinder,    
290d0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
290e0 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
290f0 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f 4d 65 74 68  */.  flockIoMeth
29100 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ods,           /
29110 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
29120 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
29130 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
29140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29150 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
29160 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
29170 20 20 66 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20    flockClose,   
29180 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29190 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
291a0 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20    flockLock,    
291b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
291c0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
291d0 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20   flockUnlock,   
291e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
291f0 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
29200 20 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65    flockCheckRese
29210 72 76 65 64 4c 6f 63 6b 2c 20 20 20 2f 2a 20 78  rvedLock,   /* x
29220 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
29230 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20  k method */.  0 
29240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29250 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
29260 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ap method */.).#
29270 65 6e 64 69 66 0a 0a 23 69 66 20 4f 53 5f 56 58  endif..#if OS_VX
29280 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28  WORKS.IOMETHODS(
29290 0a 20 20 73 65 6d 49 6f 46 69 6e 64 65 72 2c 20  .  semIoFinder, 
292a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
292b0 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
292c0 6e 61 6d 65 20 2a 2f 0a 20 20 73 65 6d 49 6f 4d  name */.  semIoM
292d0 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
292e0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
292f0 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
29300 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
29310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29320 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
29330 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
29340 64 20 2a 2f 0a 20 20 73 65 6d 58 43 6c 6f 73 65  d */.  semXClose
29350 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29360 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
29370 64 20 2a 2f 0a 20 20 73 65 6d 58 4c 6f 63 6b 2c  d */.  semXLock,
29380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29390 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
293a0 20 2a 2f 0a 20 20 73 65 6d 58 55 6e 6c 6f 63 6b   */.  semXUnlock
293b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
293c0 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
293d0 64 20 2a 2f 0a 20 20 73 65 6d 58 43 68 65 63 6b  d */.  semXCheck
293e0 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20  ReservedLock,   
293f0 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
29400 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
29410 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20  .  0            
29420 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29430 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a  xShmMap method *
29440 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  /.).#endif..#if 
29450 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
29460 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
29470 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
29480 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 61  E.IOMETHODS(.  a
29490 66 70 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  fpIoFinder,     
294a0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
294b0 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
294c0 20 2a 2f 0a 20 20 61 66 70 49 6f 4d 65 74 68 6f   */.  afpIoMetho
294d0 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ds,             
294e0 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
294f0 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
29500 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
29510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29520 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
29530 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  y is disabled */
29540 0a 20 20 61 66 70 43 6c 6f 73 65 2c 20 20 20 20  .  afpClose,    
29550 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29560 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
29570 0a 20 20 61 66 70 4c 6f 63 6b 2c 20 20 20 20 20  .  afpLock,     
29580 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29590 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
295a0 20 20 61 66 70 55 6e 6c 6f 63 6b 2c 20 20 20 20    afpUnlock,    
295b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
295c0 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
295d0 0a 20 20 61 66 70 43 68 65 63 6b 52 65 73 65 72  .  afpCheckReser
295e0 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 2f 2a 20  vedLock,     /* 
295f0 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
29600 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30  ck method */.  0
29610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29620 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
29630 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  Map method */.).
29640 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
29650 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  e proxy locking 
29660 6d 65 74 68 6f 64 20 69 73 20 61 20 22 73 75 70  method is a "sup
29670 65 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68  er-method" in th
29680 65 20 73 65 6e 73 65 20 74 68 61 74 20 69 74 0a  e sense that it.
29690 2a 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e 64 61  ** opens seconda
296a0 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ry file descript
296b0 6f 72 73 20 66 6f 72 20 74 68 65 20 63 6f 6e 63  ors for the conc
296c0 68 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 73  h and lock files
296d0 20 61 6e 64 0a 2a 2a 20 69 74 20 75 73 65 73 20   and.** it uses 
296e0 70 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c 65 2c  proxy, dot-file,
296f0 20 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63 6b 28   AFP, and flock(
29700 29 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  ) locking method
29710 73 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20 73 65  s on those.** se
29720 63 6f 6e 64 61 72 79 20 66 69 6c 65 73 2e 20 20  condary files.  
29730 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c  For this reason,
29740 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68   the division th
29750 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a  at implements.**
29760 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69   proxy locking i
29770 73 20 6c 6f 63 61 74 65 64 20 6d 75 63 68 20 66  s located much f
29780 75 72 74 68 65 72 20 64 6f 77 6e 20 69 6e 20 74  urther down in t
29790 68 65 20 66 69 6c 65 2e 20 20 42 75 74 20 77 65  he file.  But we
297a0 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 67 6f 20 61   need.** to go a
297b0 68 65 61 64 20 61 6e 64 20 64 65 66 69 6e 65 20  head and define 
297c0 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  the sqlite3_io_m
297d0 65 74 68 6f 64 73 20 61 6e 64 20 66 69 6e 64 65  ethods and finde
297e0 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f  r function.** fo
297f0 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  r proxy locking 
29800 68 65 72 65 2e 20 20 53 6f 20 77 65 20 66 6f 72  here.  So we for
29810 77 61 72 64 20 64 65 63 6c 61 72 65 20 74 68 65  ward declare the
29820 20 49 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f   I/O methods..*/
29830 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
29840 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
29850 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
29860 5f 53 54 59 4c 45 0a 73 74 61 74 69 63 20 69 6e  _STYLE.static in
29870 74 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c  t proxyClose(sql
29880 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61  ite3_file*);.sta
29890 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63  tic int proxyLoc
298a0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  k(sqlite3_file*,
298b0 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e   int);.static in
298c0 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71  t proxyUnlock(sq
298d0 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74  lite3_file*, int
298e0 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  );.static int pr
298f0 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64  oxyCheckReserved
29900 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
29910 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54  e*, int*);.IOMET
29920 48 4f 44 53 28 0a 20 20 70 72 6f 78 79 49 6f 46  HODS(.  proxyIoF
29930 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
29940 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
29950 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70  tion name */.  p
29960 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c 20 20  roxyIoMethods,  
29970 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
29980 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
29990 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
299a0 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
299b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
299c0 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69  red memory is di
299d0 73 61 62 6c 65 64 20 2a 2f 0a 20 20 70 72 6f 78  sabled */.  prox
299e0 79 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  yClose,         
299f0 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
29a00 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78  method */.  prox
29a10 79 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  yLock,          
29a20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
29a30 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79  ethod */.  proxy
29a40 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
29a50 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
29a60 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78  method */.  prox
29a70 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  yCheckReservedLo
29a80 63 6b 2c 20 20 20 2f 2a 20 78 43 68 65 63 6b 52  ck,   /* xCheckR
29a90 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
29aa0 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20  od */.  0       
29ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ac0 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74    /* xShmMap met
29ad0 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
29ae0 0a 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e  ./* nfs lockd on
29af0 20 4f 53 58 20 31 30 2e 33 2b 20 64 6f 65 73 6e   OSX 10.3+ doesn
29b00 27 74 20 63 6c 65 61 72 20 77 72 69 74 65 20 6c  't clear write l
29b10 6f 63 6b 73 20 77 68 65 6e 20 61 20 72 65 61 64  ocks when a read
29b20 20 6c 6f 63 6b 20 69 73 20 73 65 74 20 2a 2f 0a   lock is set */.
29b30 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
29b40 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
29b50 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
29b60 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28  STYLE.IOMETHODS(
29b70 0a 20 20 6e 66 73 49 6f 46 69 6e 64 65 72 2c 20  .  nfsIoFinder, 
29b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29b90 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
29ba0 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66 73 49 6f   name */.  nfsIo
29bb0 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
29bc0 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
29bd0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
29be0 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20  ct name */.  1, 
29bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c00 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
29c10 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
29c20 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c  bled */.  unixCl
29c30 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
29c40 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
29c50 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c  ethod */.  unixL
29c60 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
29c70 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
29c80 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 66 73 55 6e  ethod */.  nfsUn
29c90 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
29ca0 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
29cb0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69   method */.  uni
29cc0 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
29cd0 63 6b 2c 20 20 20 20 20 2f 2a 20 78 43 68 65 63  ck,     /* xChec
29ce0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
29cf0 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20  thod */.  0     
29d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d10 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
29d20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64  method */.).#end
29d30 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  if..#if defined(
29d40 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
29d50 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
29d60 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a  ING_STYLE./* .**
29d70 20 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66   This "finder" f
29d80 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
29d90 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
29da0 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73  e best locking s
29db0 74 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20  trategy .** for 
29dc0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
29dd0 65 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49  e "filePath".  I
29de0 74 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74  t then returns t
29df0 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
29e00 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20  thods.** object 
29e10 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
29e20 74 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a  that strategy..*
29e30 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72  *.** This is for
29e40 20 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f   MacOSX only..*/
29e50 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
29e60 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
29e70 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64   *autolockIoFind
29e80 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20  erImpl(.  const 
29e90 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20  char *filePath, 
29ea0 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68     /* name of th
29eb0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
29ec0 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  */.  unixFile *p
29ed0 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a  New           /*
29ee0 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63   open file objec
29ef0 74 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  t for the databa
29f00 73 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20  se file */.){.  
29f10 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
29f20 75 63 74 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20  uct Mapping {.  
29f30 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
29f40 69 6c 65 73 79 73 74 65 6d 3b 20 20 20 20 20 20  ilesystem;      
29f50 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 73          /* Files
29f60 79 73 74 65 6d 20 74 79 70 65 20 6e 61 6d 65 20  ystem type name 
29f70 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c  */.    const sql
29f80 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
29f90 2a 70 4d 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20  *pMethods;   /* 
29fa0 41 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b  Appropriate lock
29fb0 69 6e 67 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ing method */.  
29fc0 7d 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20  } aMap[] = {.   
29fd0 20 7b 20 22 68 66 73 22 2c 20 20 20 20 26 70 6f   { "hfs",    &po
29fe0 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a  sixIoMethods },.
29ff0 20 20 20 20 7b 20 22 75 66 73 22 2c 20 20 20 20      { "ufs",    
2a000 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20  &posixIoMethods 
2a010 7d 2c 0a 20 20 20 20 7b 20 22 61 66 70 66 73 22  },.    { "afpfs"
2a020 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73  ,  &afpIoMethods
2a030 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 62 66 73   },.    { "smbfs
2a040 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64  ",  &afpIoMethod
2a050 73 20 7d 2c 0a 20 20 20 20 7b 20 22 77 65 62 64  s },.    { "webd
2a060 61 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65  av", &nolockIoMe
2a070 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30  thods },.    { 0
2a080 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74  , 0 }.  };.  int
2a090 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61   i;.  struct sta
2a0a0 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74  tfs fsInfo;.  st
2a0b0 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49  ruct flock lockI
2a0c0 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c  nfo;..  if( !fil
2a0d0 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20  ePath ){.    /* 
2a0e0 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c  If filePath==NUL
2a0f0 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20  L that means we 
2a100 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
2a110 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c   a transient fil
2a120 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f  e.    ** that do
2a130 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
2a140 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20  e locked. */.   
2a150 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49   return &nolockI
2a160 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20  oMethods;.  }.  
2a170 69 66 28 20 73 74 61 74 66 73 28 66 69 6c 65 50  if( statfs(fileP
2a180 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d  ath, &fsInfo) !=
2a190 20 2d 31 20 29 7b 0a 20 20 20 20 69 66 28 20 66   -1 ){.    if( f
2a1a0 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20  sInfo.f_flags & 
2a1b0 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20  MNT_RDONLY ){.  
2a1c0 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f      return &nolo
2a1d0 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20  ckIoMethods;.   
2a1e0 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
2a1f0 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73  aMap[i].zFilesys
2a200 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  tem; i++){.     
2a210 20 69 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e   if( strcmp(fsIn
2a220 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c  fo.f_fstypename,
2a230 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79   aMap[i].zFilesy
2a240 73 74 65 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20  stem)==0 ){.    
2a250 20 20 20 20 72 65 74 75 72 6e 20 61 4d 61 70 5b      return aMap[
2a260 69 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20  i].pMethods;.   
2a270 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
2a280 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 63 61 73    /* Default cas
2a290 65 2e 20 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e  e. Handles, amon
2a2a0 67 73 74 20 6f 74 68 65 72 73 2c 20 22 6e 66 73  gst others, "nfs
2a2b0 22 2e 0a 20 20 2a 2a 20 54 65 73 74 20 62 79 74  "..  ** Test byt
2a2c0 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69  e-range lock usi
2a2d0 6e 67 20 66 63 6e 74 6c 28 29 2e 20 49 66 20 74  ng fcntl(). If t
2a2e0 68 65 20 63 61 6c 6c 20 73 75 63 63 65 65 64 73  he call succeeds
2a2f0 2c 20 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74  , .  ** assume t
2a300 68 61 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73  hat the file-sys
2a310 74 65 6d 20 73 75 70 70 6f 72 74 73 20 50 4f 53  tem supports POS
2a320 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20  IX style locks. 
2a330 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f  .  */.  lockInfo
2a340 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f  .l_len = 1;.  lo
2a350 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d  ckInfo.l_start =
2a360 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   0;.  lockInfo.l
2a370 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
2a380 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c  ET;.  lockInfo.l
2a390 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b  _type = F_RDLCK;
2a3a0 0a 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70  .  if( osFcntl(p
2a3b0 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c  New->h, F_GETLK,
2a3c0 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20   &lockInfo)!=-1 
2a3d0 29 20 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63  ) {.    if( strc
2a3e0 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79  mp(fsInfo.f_fsty
2a3f0 70 65 6e 61 6d 65 2c 20 22 6e 66 73 22 29 3d 3d  pename, "nfs")==
2a400 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
2a410 6e 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 3b  n &nfsIoMethods;
2a420 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
2a430 20 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69      return &posi
2a440 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20  xIoMethods;.    
2a450 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
2a460 65 74 75 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f  eturn &dotlockIo
2a470 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73  Methods;.  }.}.s
2a480 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
2a490 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a  te3_io_methods .
2a4a0 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c    *(*const autol
2a4b0 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e  ockIoFinder)(con
2a4c0 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c  st char*,unixFil
2a4d0 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f  e*) = autolockIo
2a4e0 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e  FinderImpl;..#en
2a4f0 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f  dif /* defined(_
2a500 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
2a510 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2a520 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66  NG_STYLE */..#if
2a530 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 0a 2a   OS_VXWORKS./*.*
2a540 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72 22 20  * This "finder" 
2a550 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 56 78 57  function for VxW
2a560 6f 72 6b 73 20 63 68 65 63 6b 73 20 74 6f 20 73  orks checks to s
2a570 65 65 20 69 66 20 70 6f 73 69 78 20 61 64 76 69  ee if posix advi
2a580 73 6f 72 79 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20  sory.** locking 
2a590 77 6f 72 6b 73 2e 20 20 49 66 20 69 74 20 64 6f  works.  If it do
2a5a0 65 73 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73  es, then that is
2a5b0 20 77 68 61 74 20 69 73 20 75 73 65 64 2e 20 20   what is used.  
2a5c0 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 0a 2a  If it does not.*
2a5d0 2a 20 77 6f 72 6b 2c 20 74 68 65 6e 20 66 61 6c  * work, then fal
2a5e0 6c 62 61 63 6b 20 74 6f 20 6e 61 6d 65 64 20 73  lback to named s
2a5f0 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67  emaphore locking
2a600 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
2a610 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
2a620 68 6f 64 73 20 2a 76 78 77 6f 72 6b 73 49 6f 46  hods *vxworksIoF
2a630 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e  inderImpl(.  con
2a640 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74  st char *filePat
2a650 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66  h,    /* name of
2a660 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a670 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  le */.  unixFile
2a680 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20 20   *pNew          
2a690 20 2f 2a 20 74 68 65 20 6f 70 65 6e 20 66 69 6c   /* the open fil
2a6a0 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  e object */.){. 
2a6b0 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
2a6c0 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21  ckInfo;..  if( !
2a6d0 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20  filePath ){.    
2a6e0 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d  /* If filePath==
2a6f0 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20  NULL that means 
2a700 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
2a710 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ith a transient 
2a720 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74  file.    ** that
2a730 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
2a740 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a  o be locked. */.
2a750 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f      return &nolo
2a760 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  ckIoMethods;.  }
2a770 0a 0a 20 20 2f 2a 20 54 65 73 74 20 69 66 20 66  ..  /* Test if f
2a780 63 6e 74 6c 28 29 20 69 73 20 73 75 70 70 6f 72  cntl() is suppor
2a790 74 65 64 20 61 6e 64 20 75 73 65 20 50 4f 53 49  ted and use POSI
2a7a0 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20  X style locks.. 
2a7b0 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 66 61   ** Otherwise fa
2a7c0 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6e  ll back to the n
2a7d0 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6d  amed semaphore m
2a7e0 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f  ethod..  */.  lo
2a7f0 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31  ckInfo.l_len = 1
2a800 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73  ;.  lockInfo.l_s
2a810 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b  tart = 0;.  lock
2a820 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  Info.l_whence = 
2a830 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b  SEEK_SET;.  lock
2a840 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  Info.l_type = F_
2a850 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46  RDLCK;.  if( osF
2a860 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f  cntl(pNew->h, F_
2a870 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f  GETLK, &lockInfo
2a880 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 72 65  )!=-1 ) {.    re
2a890 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74  turn &posixIoMet
2a8a0 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  hods;.  }else{. 
2a8b0 20 20 20 72 65 74 75 72 6e 20 26 73 65 6d 49 6f     return &semIo
2a8c0 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73  Methods;.  }.}.s
2a8d0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
2a8e0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a  te3_io_methods .
2a8f0 20 20 2a 28 2a 63 6f 6e 73 74 20 76 78 77 6f 72    *(*const vxwor
2a900 6b 73 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73  ksIoFinder)(cons
2a910 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65  t char*,unixFile
2a920 2a 29 20 3d 20 76 78 77 6f 72 6b 73 49 6f 46 69  *) = vxworksIoFi
2a930 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69  nderImpl;..#endi
2a940 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20  f /* OS_VXWORKS 
2a950 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73  */../*.** An abs
2a960 74 72 61 63 74 20 74 79 70 65 20 66 6f 72 20 61  tract type for a
2a970 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 49   pointer to an I
2a980 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20  O method finder 
2a990 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70  function:.*/.typ
2a9a0 65 64 65 66 20 63 6f 6e 73 74 20 73 71 6c 69 74  edef const sqlit
2a9b0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28  e3_io_methods *(
2a9c0 2a 66 69 6e 64 65 72 5f 74 79 70 65 29 28 63 6f  *finder_type)(co
2a9d0 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69  nst char*,unixFi
2a9e0 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  le*);.../*******
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 2a 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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aa30 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
2aa40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aa50 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d  ** sqlite3_vfs m
2aa60 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
2aa70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aa80 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64  ***.**.** This d
2aa90 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ivision contains
2aaa0 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
2aab0 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f  ion of methods o
2aac0 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  n the.** sqlite3
2aad0 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  _vfs object..*/.
2aae0 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
2aaf0 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
2ab00 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73  f the unixFile s
2ab10 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64  tructure pointed
2ab20 20 74 6f 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73   to by pId..*/.s
2ab30 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e  tatic int fillIn
2ab40 55 6e 69 78 46 69 6c 65 28 0a 20 20 73 71 6c 69  UnixFile(.  sqli
2ab50 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
2ab60 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
2ab70 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a  o vfs object */.
2ab80 20 20 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20    int h,        
2ab90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
2aba0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
2abb0 72 20 6f 66 20 66 69 6c 65 20 62 65 69 6e 67 20  r of file being 
2abc0 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69  opened */.  sqli
2abd0 74 65 33 5f 66 69 6c 65 20 2a 70 49 64 2c 20 20  te3_file *pId,  
2abe0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20      /* Write to 
2abf0 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72  the unixFile str
2ac00 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20  ucture here */. 
2ac10 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
2ac20 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65  lename,  /* Name
2ac30 20 6f 66 20 74 68 65 20 66 69 6c 65 20 62 65 69   of the file bei
2ac40 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69  ng opened */.  i
2ac50 6e 74 20 63 74 72 6c 46 6c 61 67 73 20 20 20 20  nt ctrlFlags    
2ac60 20 20 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f         /* Zero o
2ac70 72 20 6d 6f 72 65 20 55 4e 49 58 46 49 4c 45 5f  r more UNIXFILE_
2ac80 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20  * values */.){. 
2ac90 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
2aca0 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4c 6f 63 6b  o_methods *pLock
2acb0 69 6e 67 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78  ingStyle;.  unix
2acc0 46 69 6c 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e  File *pNew = (un
2acd0 69 78 46 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20  ixFile *)pId;.  
2ace0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2acf0 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
2ad00 4e 65 77 2d 3e 70 49 6e 6f 64 65 3d 3d 4e 55 4c  New->pInode==NUL
2ad10 4c 20 29 3b 0a 0a 20 20 2f 2a 20 55 73 75 61 6c  L );..  /* Usual
2ad20 6c 79 20 74 68 65 20 70 61 74 68 20 7a 46 69 6c  ly the path zFil
2ad30 65 6e 61 6d 65 20 73 68 6f 75 6c 64 20 6e 6f 74  ename should not
2ad40 20 62 65 20 61 20 72 65 6c 61 74 69 76 65 20 70   be a relative p
2ad50 61 74 68 6e 61 6d 65 2e 20 54 68 65 0a 20 20 2a  athname. The.  *
2ad60 2a 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 77  * exception is w
2ad70 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20  hen opening the 
2ad80 70 72 6f 78 79 20 22 63 6f 6e 63 68 22 20 66 69  proxy "conch" fi
2ad90 6c 65 20 69 6e 20 62 75 69 6c 64 73 20 74 68 61  le in builds tha
2ada0 74 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 65 20 74  t.  ** include t
2adb0 68 65 20 73 70 65 63 69 61 6c 20 41 70 70 6c 65  he special Apple
2adc0 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 73 2e   locking styles.
2add0 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  .  */.#if define
2ade0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
2adf0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2ae00 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 61 73  CKING_STYLE.  as
2ae10 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d  sert( zFilename=
2ae20 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b  =0 || zFilename[
2ae30 30 5d 3d 3d 27 2f 27 20 0a 20 20 20 20 7c 7c 20  0]=='/' .    || 
2ae40 70 56 66 73 2d 3e 70 41 70 70 44 61 74 61 3d 3d  pVfs->pAppData==
2ae50 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b  (void*)&autolock
2ae60 49 6f 46 69 6e 64 65 72 20 29 3b 0a 23 65 6c 73  IoFinder );.#els
2ae70 65 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c  e.  assert( zFil
2ae80 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c  ename==0 || zFil
2ae90 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b  ename[0]=='/' );
2aea0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4e 6f  .#endif..  /* No
2aeb0 20 6c 6f 63 6b 69 6e 67 20 6f 63 63 75 72 73 20   locking occurs 
2aec0 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  in temporary fil
2aed0 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  es */.  assert( 
2aee0 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20 7c 7c 20  zFilename!=0 || 
2aef0 28 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  (ctrlFlags & UNI
2af00 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 29 21 3d 30  XFILE_NOLOCK)!=0
2af10 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28   );..  OSTRACE((
2af20 22 4f 50 45 4e 20 20 20 20 25 2d 33 64 20 25 73  "OPEN    %-3d %s
2af30 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d  \n", h, zFilenam
2af40 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 68 20 3d  e));.  pNew->h =
2af50 20 68 3b 0a 20 20 70 4e 65 77 2d 3e 70 56 66 73   h;.  pNew->pVfs
2af60 20 3d 20 70 56 66 73 3b 0a 20 20 70 4e 65 77 2d   = pVfs;.  pNew-
2af70 3e 7a 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61  >zPath = zFilena
2af80 6d 65 3b 0a 20 20 70 4e 65 77 2d 3e 63 74 72 6c  me;.  pNew->ctrl
2af90 46 6c 61 67 73 20 3d 20 28 75 38 29 63 74 72 6c  Flags = (u8)ctrl
2afa0 46 6c 61 67 73 3b 0a 23 69 66 20 53 51 4c 49 54  Flags;.#if SQLIT
2afb0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
2afc0 30 0a 20 20 70 4e 65 77 2d 3e 6d 6d 61 70 53 69  0.  pNew->mmapSi
2afd0 7a 65 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 47  zeMax = sqlite3G
2afe0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d  lobalConfig.szMm
2aff0 61 70 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  ap;.#endif.  if(
2b000 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f   sqlite3_uri_boo
2b010 6c 65 61 6e 28 28 28 63 74 72 6c 46 6c 61 67 73  lean(((ctrlFlags
2b020 20 26 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 29   & UNIXFILE_URI)
2b030 20 3f 20 7a 46 69 6c 65 6e 61 6d 65 20 3a 20 30   ? zFilename : 0
2b040 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
2b050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 70                "p
2b060 73 6f 77 22 2c 20 53 51 4c 49 54 45 5f 50 4f 57  sow", SQLITE_POW
2b070 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
2b080 29 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63  ) ){.    pNew->c
2b090 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
2b0a0 46 49 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20  FILE_PSOW;.  }. 
2b0b0 20 69 66 28 20 73 74 72 63 6d 70 28 70 56 66 73   if( strcmp(pVfs
2b0c0 2d 3e 7a 4e 61 6d 65 2c 22 75 6e 69 78 2d 65 78  ->zName,"unix-ex
2b0d0 63 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  cl")==0 ){.    p
2b0e0 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  New->ctrlFlags |
2b0f0 3d 20 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 3b  = UNIXFILE_EXCL;
2b100 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57  .  }..#if OS_VXW
2b110 4f 52 4b 53 0a 20 20 70 4e 65 77 2d 3e 70 49 64  ORKS.  pNew->pId
2b120 20 3d 20 76 78 77 6f 72 6b 73 46 69 6e 64 46 69   = vxworksFindFi
2b130 6c 65 49 64 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  leId(zFilename);
2b140 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 64  .  if( pNew->pId
2b150 3d 3d 30 20 29 7b 0a 20 20 20 20 63 74 72 6c 46  ==0 ){.    ctrlF
2b160 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
2b170 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20  _NOLOCK;.    rc 
2b180 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
2b190 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
2b1a0 28 20 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ( ctrlFlags & UN
2b1b0 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 29 7b  IXFILE_NOLOCK ){
2b1c0 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79  .    pLockingSty
2b1d0 6c 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65  le = &nolockIoMe
2b1e0 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a  thods;.  }else{.
2b1f0 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c      pLockingStyl
2b200 65 20 3d 20 28 2a 2a 28 66 69 6e 64 65 72 5f 74  e = (**(finder_t
2b210 79 70 65 2a 29 70 56 66 73 2d 3e 70 41 70 70 44  ype*)pVfs->pAppD
2b220 61 74 61 29 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  ata)(zFilename, 
2b230 70 4e 65 77 29 3b 0a 23 69 66 20 53 51 4c 49 54  pNew);.#if SQLIT
2b240 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2b250 5f 53 54 59 4c 45 0a 20 20 20 20 2f 2a 20 43 61  _STYLE.    /* Ca
2b260 63 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 69 6e  che zFilename in
2b270 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e   the locking con
2b280 74 65 78 74 20 28 41 46 50 20 61 6e 64 20 64 6f  text (AFP and do
2b290 74 6c 6f 63 6b 20 6f 76 65 72 72 69 64 65 29 20  tlock override) 
2b2a0 66 6f 72 0a 20 20 20 20 2a 2a 20 70 72 6f 78 79  for.    ** proxy
2b2b0 4c 6f 63 6b 20 61 63 74 69 76 61 74 69 6f 6e 20  Lock activation 
2b2c0 69 73 20 70 6f 73 73 69 62 6c 65 20 28 72 65 6d  is possible (rem
2b2d0 6f 74 65 20 70 72 6f 78 79 20 69 73 20 62 61 73  ote proxy is bas
2b2e0 65 64 20 6f 6e 20 64 62 20 6e 61 6d 65 29 0a 20  ed on db name). 
2b2f0 20 20 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20     ** zFilename 
2b300 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e  remains valid un
2b310 74 69 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73  til file is clos
2b320 65 64 2c 20 74 6f 20 73 75 70 70 6f 72 74 20 2a  ed, to support *
2b330 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b  /.    pNew->lock
2b340 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 28 76 6f  ingContext = (vo
2b350 69 64 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a 23  id*)zFilename;.#
2b360 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28  endif.  }..  if(
2b370 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
2b380 3d 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64  = &posixIoMethod
2b390 73 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  s.#if defined(__
2b3a0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
2b3b0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2b3c0 47 5f 53 54 59 4c 45 0a 20 20 20 20 7c 7c 20 70  G_STYLE.    || p
2b3d0 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
2b3e0 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 0a 23 65  &nfsIoMethods.#e
2b3f0 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20 20 75 6e  ndif.  ){.    un
2b400 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
2b410 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f      rc = findIno
2b420 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e  deInfo(pNew, &pN
2b430 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20  ew->pInode);.   
2b440 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2b450 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  OK ){.      /* I
2b460 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2b470 72 65 64 20 69 6e 20 66 69 6e 64 49 6e 6f 64 65  red in findInode
2b480 49 6e 66 6f 28 29 2c 20 63 6c 6f 73 65 20 74 68  Info(), close th
2b490 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
2b4a0 72 0a 20 20 20 20 20 20 2a 2a 20 69 6d 6d 65 64  r.      ** immed
2b4b0 69 61 74 65 6c 79 2c 20 62 65 66 6f 72 65 20 72  iately, before r
2b4c0 65 6c 65 61 73 69 6e 67 20 74 68 65 20 6d 75 74  eleasing the mut
2b4d0 65 78 2e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66  ex. findInodeInf
2b4e0 6f 28 29 20 6d 61 79 20 66 61 69 6c 0a 20 20 20  o() may fail.   
2b4f0 20 20 20 2a 2a 20 69 6e 20 74 77 6f 20 73 63 65     ** in two sce
2b500 6e 61 72 69 6f 73 3a 0a 20 20 20 20 20 20 2a 2a  narios:.      **
2b510 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 61 29 20  .      **   (a) 
2b520 41 20 63 61 6c 6c 20 74 6f 20 66 73 74 61 74 28  A call to fstat(
2b530 29 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20 20  ) failed..      
2b540 2a 2a 20 20 20 28 62 29 20 41 20 6d 61 6c 6c 6f  **   (b) A mallo
2b550 63 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20 20  c failed..      
2b560 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53 63 65 6e  **.      ** Scen
2b570 61 72 69 6f 20 28 62 29 20 6d 61 79 20 6f 6e 6c  ario (b) may onl
2b580 79 20 6f 63 63 75 72 20 69 66 20 74 68 65 20 70  y occur if the p
2b590 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e  rocess is holdin
2b5a0 67 20 6e 6f 20 6f 74 68 65 72 0a 20 20 20 20 20  g no other.     
2b5b0 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70   ** file descrip
2b5c0 74 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65  tors open on the
2b5d0 20 73 61 6d 65 20 66 69 6c 65 2e 20 49 66 20 74   same file. If t
2b5e0 68 65 72 65 20 77 65 72 65 20 6f 74 68 65 72 20  here were other 
2b5f0 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65  file.      ** de
2b600 73 63 72 69 70 74 6f 72 73 20 6f 6e 20 74 68 69  scriptors on thi
2b610 73 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20  s file, then no 
2b620 6d 61 6c 6c 6f 63 20 77 6f 75 6c 64 20 62 65 20  malloc would be 
2b630 72 65 71 75 69 72 65 64 20 62 79 0a 20 20 20 20  required by.    
2b640 20 20 2a 2a 20 66 69 6e 64 49 6e 6f 64 65 49 6e    ** findInodeIn
2b650 66 6f 28 29 2e 20 49 66 20 74 68 69 73 20 69 73  fo(). If this is
2b660 20 74 68 65 20 63 61 73 65 2c 20 69 74 20 69 73   the case, it is
2b670 20 71 75 69 74 65 20 73 61 66 65 20 74 6f 20 63   quite safe to c
2b680 6c 6f 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61  lose.      ** ha
2b690 6e 64 6c 65 20 68 20 2d 20 61 73 20 69 74 20 69  ndle h - as it i
2b6a0 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61  s guaranteed tha
2b6b0 74 20 6e 6f 20 70 6f 73 69 78 20 6c 6f 63 6b 73  t no posix locks
2b6c0 20 77 69 6c 6c 20 62 65 20 72 65 6c 65 61 73 65   will be release
2b6d0 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 64 6f  d.      ** by do
2b6e0 69 6e 67 20 73 6f 2e 0a 20 20 20 20 20 20 2a 2a  ing so..      **
2b6f0 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 73 63 65  .      ** If sce
2b700 6e 61 72 69 6f 20 28 61 29 20 63 61 75 73 65 64  nario (a) caused
2b710 20 74 68 65 20 65 72 72 6f 72 20 74 68 65 6e 20   the error then 
2b720 74 68 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 73  things are not s
2b730 6f 20 73 61 66 65 2e 20 54 68 65 0a 20 20 20 20  o safe. The.    
2b740 20 20 2a 2a 20 69 6d 70 6c 69 63 69 74 20 61 73    ** implicit as
2b750 73 75 6d 70 74 69 6f 6e 20 68 65 72 65 20 69 73  sumption here is
2b760 20 74 68 61 74 20 69 66 20 66 73 74 61 74 28 29   that if fstat()
2b770 20 66 61 69 6c 73 2c 20 74 68 69 6e 67 73 20 61   fails, things a
2b780 72 65 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 73  re in.      ** s
2b790 75 63 68 20 62 61 64 20 73 68 61 70 65 20 74 68  uch bad shape th
2b7a0 61 74 20 64 72 6f 70 70 69 6e 67 20 61 20 6c 6f  at dropping a lo
2b7b0 63 6b 20 6f 72 20 74 77 6f 20 64 6f 65 73 6e 27  ck or two doesn'
2b7c0 74 20 6d 61 74 74 65 72 20 6d 75 63 68 2e 0a 20  t matter much.. 
2b7d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 6f       */.      ro
2b7e0 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c  bust_close(pNew,
2b7f0 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20   h, __LINE__);. 
2b800 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20       h = -1;.   
2b810 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65   }.    unixLeave
2b820 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a 23 69  Mutex();.  }..#i
2b830 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2b840 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
2b850 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
2b860 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66 28 20 70  __).  else if( p
2b870 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
2b880 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b  &afpIoMethods ){
2b890 0a 20 20 20 20 2f 2a 20 41 46 50 20 6c 6f 63 6b  .    /* AFP lock
2b8a0 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c  ing uses the fil
2b8b0 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65  e path so it nee
2b8c0 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65  ds to be include
2b8d0 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  d in.    ** the 
2b8e0 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
2b8f0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 66  t..    */.    af
2b900 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
2b910 2a 70 43 74 78 3b 0a 20 20 20 20 70 4e 65 77 2d  *pCtx;.    pNew-
2b920 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  >lockingContext 
2b930 3d 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33  = pCtx = sqlite3
2b940 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f  _malloc64( sizeo
2b950 66 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 20 20  f(*pCtx) );.    
2b960 69 66 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20  if( pCtx==0 ){. 
2b970 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2b980 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
2b990 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20  e{.      /* NB: 
2b9a0 7a 46 69 6c 65 6e 61 6d 65 20 65 78 69 73 74 73  zFilename exists
2b9b0 20 61 6e 64 20 72 65 6d 61 69 6e 73 20 76 61 6c   and remains val
2b9c0 69 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69 6c  id until the fil
2b9d0 65 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20  e is closed.    
2b9e0 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74    ** according t
2b9f0 6f 20 72 65 71 75 69 72 65 6d 65 6e 74 20 46 31  o requirement F1
2ba00 31 31 34 31 2e 20 20 53 6f 20 77 65 20 64 6f 20  1141.  So we do 
2ba10 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65  not need to make
2ba20 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79   a.      ** copy
2ba30 20 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65   of the filename
2ba40 2e 20 2a 2f 0a 20 20 20 20 20 20 70 43 74 78 2d  . */.      pCtx-
2ba50 3e 64 62 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e  >dbPath = zFilen
2ba60 61 6d 65 3b 0a 20 20 20 20 20 20 70 43 74 78 2d  ame;.      pCtx-
2ba70 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20  >reserved = 0;. 
2ba80 20 20 20 20 20 73 72 61 6e 64 6f 6d 64 65 76 28       srandomdev(
2ba90 29 3b 0a 20 20 20 20 20 20 75 6e 69 78 45 6e 74  );.      unixEnt
2baa0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20  erMutex();.     
2bab0 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49   rc = findInodeI
2bac0 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d  nfo(pNew, &pNew-
2bad0 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 20 20  >pInode);.      
2bae0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2baf0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
2bb00 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e  ite3_free(pNew->
2bb10 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b  lockingContext);
2bb20 0a 20 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f  .        robust_
2bb30 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f  close(pNew, h, _
2bb40 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
2bb50 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20    h = -1;.      
2bb60 7d 0a 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76  }.      unixLeav
2bb70 65 4d 75 74 65 78 28 29 3b 20 20 20 20 20 20 20  eMutex();       
2bb80 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64   .    }.  }.#end
2bb90 69 66 0a 0a 20 20 65 6c 73 65 20 69 66 28 20 70  if..  else if( p
2bba0 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
2bbb0 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64  &dotlockIoMethod
2bbc0 73 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 74 66  s ){.    /* Dotf
2bbd0 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73  ile locking uses
2bbe0 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73   the file path s
2bbf0 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  o it needs to be
2bc00 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20   included in.   
2bc10 20 2a 2a 20 74 68 65 20 64 6f 74 6c 6f 63 6b 4c   ** the dotlockL
2bc20 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 0a 20  ockingContext . 
2bc30 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a     */.    char *
2bc40 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 20 20 69  zLockFile;.    i
2bc50 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  nt nFilename;.  
2bc60 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e    assert( zFilen
2bc70 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20 6e 46  ame!=0 );.    nF
2bc80 69 6c 65 6e 61 6d 65 20 3d 20 28 69 6e 74 29 73  ilename = (int)s
2bc90 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29  trlen(zFilename)
2bca0 20 2b 20 36 3b 0a 20 20 20 20 7a 4c 6f 63 6b 46   + 6;.    zLockF
2bcb0 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71  ile = (char *)sq
2bcc0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e  lite3_malloc64(n
2bcd0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69  Filename);.    i
2bce0 66 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30 20  f( zLockFile==0 
2bcf0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
2bd00 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2bd10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
2bd20 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 46  ite3_snprintf(nF
2bd30 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63 6b 46 69  ilename, zLockFi
2bd40 6c 65 2c 20 22 25 73 22 20 44 4f 54 4c 4f 43 4b  le, "%s" DOTLOCK
2bd50 5f 53 55 46 46 49 58 2c 20 7a 46 69 6c 65 6e 61  _SUFFIX, zFilena
2bd60 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  me);.    }.    p
2bd70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  New->lockingCont
2bd80 65 78 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c 65 3b  ext = zLockFile;
2bd90 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57  .  }..#if OS_VXW
2bda0 4f 52 4b 53 0a 20 20 65 6c 73 65 20 69 66 28 20  ORKS.  else if( 
2bdb0 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
2bdc0 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73 20 29   &semIoMethods )
2bdd0 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20 73  {.    /* Named s
2bde0 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67  emaphore locking
2bdf0 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70   uses the file p
2be00 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20  ath so it needs 
2be10 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 69 6e 63  to be.    ** inc
2be20 6c 75 64 65 64 20 69 6e 20 74 68 65 20 73 65 6d  luded in the sem
2be30 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 20  LockingContext. 
2be40 20 20 20 2a 2f 0a 20 20 20 20 75 6e 69 78 45 6e     */.    unixEn
2be50 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
2be60 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e  rc = findInodeIn
2be70 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e  fo(pNew, &pNew->
2be80 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28  pInode);.    if(
2be90 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29   (rc==SQLITE_OK)
2bea0 20 26 26 20 28 70 4e 65 77 2d 3e 70 49 6e 6f 64   && (pNew->pInod
2beb0 65 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20 29  e->pSem==NULL) )
2bec0 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53  {.      char *zS
2bed0 65 6d 4e 61 6d 65 20 3d 20 70 4e 65 77 2d 3e 70  emName = pNew->p
2bee0 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 3b  Inode->aSemName;
2bef0 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  .      int n;.  
2bf00 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2bf10 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d  intf(MAX_PATHNAM
2bf20 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20 22 2f 25  E, zSemName, "/%
2bf30 73 2e 73 65 6d 22 2c 0a 20 20 20 20 20 20 20 20  s.sem",.        
2bf40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2bf50 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e  New->pId->zCanon
2bf60 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20  icalName);.     
2bf70 20 66 6f 72 28 20 6e 3d 31 3b 20 7a 53 65 6d 4e   for( n=1; zSemN
2bf80 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a 20 20  ame[n]; n++ ).  
2bf90 20 20 20 20 20 20 69 66 28 20 7a 53 65 6d 4e 61        if( zSemNa
2bfa0 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a 53 65  me[n]=='/' ) zSe
2bfb0 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27 3b 0a  mName[n] = '_';.
2bfc0 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f        pNew->pIno
2bfd0 64 65 2d 3e 70 53 65 6d 20 3d 20 73 65 6d 5f 6f  de->pSem = sem_o
2bfe0 70 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20 4f 5f  pen(zSemName, O_
2bff0 43 52 45 41 54 2c 20 30 36 36 36 2c 20 31 29 3b  CREAT, 0666, 1);
2c000 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d  .      if( pNew-
2c010 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 3d  >pInode->pSem ==
2c020 20 53 45 4d 5f 46 41 49 4c 45 44 20 29 7b 0a 20   SEM_FAILED ){. 
2c030 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2c040 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
2c050 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e    pNew->pInode->
2c060 61 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27 5c  aSemName[0] = '\
2c070 30 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0';.      }.    
2c080 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  }.    unixLeaveM
2c090 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64  utex();.  }.#end
2c0a0 69 66 0a 20 20 0a 20 20 73 74 6f 72 65 4c 61 73  if.  .  storeLas
2c0b0 74 45 72 72 6e 6f 28 70 4e 65 77 2c 20 30 29 3b  tErrno(pNew, 0);
2c0c0 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
2c0d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2c0e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 68  _OK ){.    if( h
2c0f0 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f  >=0 ) robust_clo
2c100 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49  se(pNew, h, __LI
2c110 4e 45 5f 5f 29 3b 0a 20 20 20 20 68 20 3d 20 2d  NE__);.    h = -
2c120 31 3b 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28  1;.    osUnlink(
2c130 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
2c140 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20  pNew->ctrlFlags 
2c150 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45  |= UNIXFILE_DELE
2c160 54 45 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  TE;.  }.#endif. 
2c170 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2c180 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 68 3e  OK ){.    if( h>
2c190 3d 30 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73  =0 ) robust_clos
2c1a0 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e  e(pNew, h, __LIN
2c1b0 45 5f 5f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E__);.  }else{. 
2c1c0 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64     pNew->pMethod
2c1d0 20 3d 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65   = pLockingStyle
2c1e0 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65  ;.    OpenCounte
2c1f0 72 28 2b 31 29 3b 0a 20 20 20 20 76 65 72 69 66  r(+1);.    verif
2c200 79 44 62 46 69 6c 65 28 70 4e 65 77 29 3b 0a 20  yDbFile(pNew);. 
2c210 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2c220 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2c230 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 69  the name of a di
2c240 72 65 63 74 6f 72 79 20 69 6e 20 77 68 69 63 68  rectory in which
2c250 20 74 6f 20 70 75 74 20 74 65 6d 70 6f 72 61 72   to put temporar
2c260 79 20 66 69 6c 65 73 2e 0a 2a 2a 20 49 66 20 6e  y files..** If n
2c270 6f 20 73 75 69 74 61 62 6c 65 20 74 65 6d 70 6f  o suitable tempo
2c280 72 61 72 79 20 66 69 6c 65 20 64 69 72 65 63 74  rary file direct
2c290 6f 72 79 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ory can be found
2c2a0 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  , return NULL..*
2c2b0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
2c2c0 68 61 72 20 2a 75 6e 69 78 54 65 6d 70 46 69 6c  har *unixTempFil
2c2d0 65 44 69 72 28 76 6f 69 64 29 7b 0a 20 20 73 74  eDir(void){.  st
2c2e0 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
2c2f0 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20  *azDirs[] = {.  
2c300 20 20 20 30 2c 0a 20 20 20 20 20 30 2c 0a 20 20     0,.     0,.  
2c310 20 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20     "/var/tmp",. 
2c320 20 20 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a      "/usr/tmp",.
2c330 20 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20       "/tmp",.   
2c340 20 20 22 2e 22 0a 20 20 7d 3b 0a 20 20 75 6e 73    ".".  };.  uns
2c350 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 73  igned int i;.  s
2c360 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
2c370 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
2c380 69 72 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 6d  ir = sqlite3_tem
2c390 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 0a 20 20  p_directory;..  
2c3a0 69 66 28 20 21 61 7a 44 69 72 73 5b 30 5d 20 29  if( !azDirs[0] )
2c3b0 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 67 65 74   azDirs[0] = get
2c3c0 65 6e 76 28 22 53 51 4c 49 54 45 5f 54 4d 50 44  env("SQLITE_TMPD
2c3d0 49 52 22 29 3b 0a 20 20 69 66 28 20 21 61 7a 44  IR");.  if( !azD
2c3e0 69 72 73 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b  irs[1] ) azDirs[
2c3f0 31 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50  1] = getenv("TMP
2c400 44 49 52 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30  DIR");.  for(i=0
2c410 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72  ; i<sizeof(azDir
2c420 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73  s)/sizeof(azDirs
2c430 5b 30 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69 72  [0]); zDir=azDir
2c440 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20 69 66 28  s[i++]){.    if(
2c450 20 7a 44 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69   zDir==0 ) conti
2c460 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73 53  nue;.    if( osS
2c470 74 61 74 28 7a 44 69 72 2c 20 26 62 75 66 29 20  tat(zDir, &buf) 
2c480 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2c490 69 66 28 20 21 53 5f 49 53 44 49 52 28 62 75 66  if( !S_ISDIR(buf
2c4a0 2e 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f 6e 74  .st_mode) ) cont
2c4b0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73  inue;.    if( os
2c4c0 41 63 63 65 73 73 28 7a 44 69 72 2c 20 30 37 29  Access(zDir, 07)
2c4d0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2c4e0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
2c4f0 74 75 72 6e 20 7a 44 69 72 3b 0a 7d 0a 0a 2f 2a  turn zDir;.}../*
2c500 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d  .** Create a tem
2c510 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  porary file name
2c520 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20   in zBuf.  zBuf 
2c530 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
2c540 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c  d.** by the call
2c550 69 6e 67 20 70 72 6f 63 65 73 73 20 61 6e 64 20  ing process and 
2c560 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75  must be big enou
2c570 67 68 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65  gh to hold at le
2c580 61 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50  ast.** pVfs->mxP
2c590 61 74 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a  athname bytes..*
2c5a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
2c5b0 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74  xGetTempname(int
2c5c0 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
2c5d0 66 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  f){.  const char
2c5e0 20 2a 7a 44 69 72 3b 0a 20 20 69 6e 74 20 69 4c   *zDir;.  int iL
2c5f0 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  imit = 0;..  /* 
2c600 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75  It's odd to simu
2c610 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72  late an io-error
2c620 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c   here, but reall
2c630 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20  y this is just. 
2c640 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f   ** using the io
2c650 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75  -error infrastru
2c660 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68  cture to test th
2c670 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65  at SQLite handle
2c680 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  s this.  ** func
2c690 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20  tion failing. . 
2c6a0 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   */.  SimulateIO
2c6b0 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
2c6c0 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20  LITE_IOERR );.. 
2c6d0 20 7a 44 69 72 20 3d 20 75 6e 69 78 54 65 6d 70   zDir = unixTemp
2c6e0 46 69 6c 65 44 69 72 28 29 3b 0a 20 20 64 6f 7b  FileDir();.  do{
2c6f0 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20 20 20  .    u64 r;.    
2c700 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
2c710 73 73 28 73 69 7a 65 6f 66 28 72 29 2c 20 26 72  ss(sizeof(r), &r
2c720 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
2c730 42 75 66 3e 32 20 29 3b 0a 20 20 20 20 7a 42 75  Buf>2 );.    zBu
2c740 66 5b 6e 42 75 66 2d 32 5d 20 3d 20 30 3b 0a 20  f[nBuf-2] = 0;. 
2c750 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2c760 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20  ntf(nBuf, zBuf, 
2c770 22 25 73 2f 22 53 51 4c 49 54 45 5f 54 45 4d 50  "%s/"SQLITE_TEMP
2c780 5f 46 49 4c 45 5f 50 52 45 46 49 58 22 25 6c 6c  _FILE_PREFIX"%ll
2c790 78 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20  x%c",.          
2c7a0 20 20 20 20 20 20 20 20 20 20 20 7a 44 69 72 2c             zDir,
2c7b0 20 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   r, 0);.    if( 
2c7c0 7a 42 75 66 5b 6e 42 75 66 2d 32 5d 21 3d 30 20  zBuf[nBuf-2]!=0 
2c7d0 7c 7c 20 28 69 4c 69 6d 69 74 2b 2b 29 3e 31 30  || (iLimit++)>10
2c7e0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2c7f0 5f 45 52 52 4f 52 3b 0a 20 20 7d 77 68 69 6c 65  _ERROR;.  }while
2c800 28 20 6f 73 41 63 63 65 73 73 28 7a 42 75 66 2c  ( osAccess(zBuf,
2c810 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  0)==0 );.  retur
2c820 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2c830 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
2c840 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
2c850 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
2c860 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 52 6f 75 74  LE__)./*.** Rout
2c870 69 6e 65 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d  ine to transform
2c880 20 61 20 75 6e 69 78 46 69 6c 65 20 69 6e 74 6f   a unixFile into
2c890 20 61 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67   a proxy-locking
2c8a0 20 75 6e 69 78 46 69 6c 65 2e 0a 2a 2a 20 49 6d   unixFile..** Im
2c8b0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 20  plementation in 
2c8c0 74 68 65 20 70 72 6f 78 79 2d 6c 6f 63 6b 20 64  the proxy-lock d
2c8d0 69 76 69 73 69 6f 6e 2c 20 62 75 74 20 75 73 65  ivision, but use
2c8e0 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 0a  d by unixOpen().
2c8f0 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f 50 52 45  ** if SQLITE_PRE
2c900 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  FER_PROXY_LOCKIN
2c910 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f  G is defined..*/
2c920 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
2c930 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69  yTransformUnixFi
2c940 6c 65 28 75 6e 69 78 46 69 6c 65 2a 2c 20 63 6f  le(unixFile*, co
2c950 6e 73 74 20 63 68 61 72 2a 29 3b 0a 23 65 6e 64  nst char*);.#end
2c960 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68  if../*.** Search
2c970 20 66 6f 72 20 61 6e 20 75 6e 75 73 65 64 20 66   for an unused f
2c980 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
2c990 68 61 74 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  hat was opened o
2c9a0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  n the database .
2c9b0 2a 2a 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a  ** file (not a j
2c9c0 6f 75 72 6e 61 6c 20 6f 72 20 6d 61 73 74 65 72  ournal or master
2c9d0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 69  -journal file) i
2c9e0 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 74  dentified by pat
2c9f0 68 6e 61 6d 65 0a 2a 2a 20 7a 50 61 74 68 20 77  hname.** zPath w
2ca00 69 74 68 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ith SQLITE_OPEN_
2ca10 58 58 58 20 66 6c 61 67 73 20 6d 61 74 63 68 69  XXX flags matchi
2ca20 6e 67 20 74 68 6f 73 65 20 70 61 73 73 65 64 20  ng those passed 
2ca30 61 73 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a  as the second.**
2ca40 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
2ca50 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
2ca60 2a 20 53 75 63 68 20 61 20 66 69 6c 65 20 64 65  * Such a file de
2ca70 73 63 72 69 70 74 6f 72 20 6d 61 79 20 65 78 69  scriptor may exi
2ca80 73 74 20 69 66 20 61 20 64 61 74 61 62 61 73 65  st if a database
2ca90 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20   connection was 
2caa0 63 6c 6f 73 65 64 0a 2a 2a 20 62 75 74 20 74 68  closed.** but th
2cab0 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c  e associated fil
2cac0 65 20 64 65 73 63 72 69 70 74 6f 72 20 63 6f 75  e descriptor cou
2cad0 6c 64 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64  ld not be closed
2cae0 20 62 65 63 61 75 73 65 20 73 6f 6d 65 0a 2a 2a   because some.**
2caf0 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63   other file desc
2cb00 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 74  riptor open on t
2cb10 68 65 20 73 61 6d 65 20 66 69 6c 65 20 69 73 20  he same file is 
2cb20 68 6f 6c 64 69 6e 67 20 61 20 66 69 6c 65 2d 6c  holding a file-l
2cb30 6f 63 6b 2e 0a 2a 2a 20 52 65 66 65 72 20 74 6f  ock..** Refer to
2cb40 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65   comments in the
2cb50 20 75 6e 69 78 43 6c 6f 73 65 28 29 20 66 75 6e   unixClose() fun
2cb60 63 74 69 6f 6e 20 61 6e 64 20 74 68 65 20 6c 65  ction and the le
2cb70 6e 67 74 68 79 20 63 6f 6d 6d 65 6e 74 0a 2a 2a  ngthy comment.**
2cb80 20 64 65 73 63 72 69 62 69 6e 67 20 22 50 6f 73   describing "Pos
2cb90 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b  ix Advisory Lock
2cba0 69 6e 67 22 20 61 74 20 74 68 65 20 73 74 61 72  ing" at the star
2cbb0 74 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20 66  t of this file f
2cbc0 6f 72 20 0a 2a 2a 20 66 75 72 74 68 65 72 20 64  or .** further d
2cbd0 65 74 61 69 6c 73 2e 20 41 6c 73 6f 2c 20 74 69  etails. Also, ti
2cbe0 63 6b 65 74 20 23 34 30 31 38 2e 0a 2a 2a 0a 2a  cket #4018..**.*
2cbf0 2a 20 49 66 20 61 20 73 75 69 74 61 62 6c 65 20  * If a suitable 
2cc00 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2cc10 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 69  is found, then i
2cc20 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  t is returned. I
2cc30 66 20 6e 6f 0a 2a 2a 20 73 75 63 68 20 66 69 6c  f no.** such fil
2cc40 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
2cc50 6c 6f 63 61 74 65 64 2c 20 2d 31 20 69 73 20 72  located, -1 is r
2cc60 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
2cc70 69 63 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  ic UnixUnusedFd 
2cc80 2a 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28  *findReusableFd(
2cc90 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
2cca0 68 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  h, int flags){. 
2ccb0 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
2ccc0 55 6e 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20 2f  Unused = 0;..  /
2ccd0 2a 20 44 6f 20 6e 6f 74 20 73 65 61 72 63 68 20  * Do not search 
2cce0 66 6f 72 20 61 6e 20 75 6e 75 73 65 64 20 66 69  for an unused fi
2ccf0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  le descriptor on
2cd00 20 76 78 77 6f 72 6b 73 2e 20 4e 6f 74 20 62 65   vxworks. Not be
2cd10 63 61 75 73 65 0a 20 20 2a 2a 20 76 78 77 6f 72  cause.  ** vxwor
2cd20 6b 73 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65 6e  ks would not ben
2cd30 65 66 69 74 20 66 72 6f 6d 20 74 68 65 20 63 68  efit from the ch
2cd40 61 6e 67 65 20 28 69 74 20 6d 69 67 68 74 2c 20  ange (it might, 
2cd50 77 65 27 72 65 20 6e 6f 74 20 73 75 72 65 29 2c  we're not sure),
2cd60 0a 20 20 2a 2a 20 62 75 74 20 62 65 63 61 75 73  .  ** but becaus
2cd70 65 20 6e 6f 20 77 61 79 20 74 6f 20 74 65 73 74  e no way to test
2cd80 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
2cd90 20 61 76 61 69 6c 61 62 6c 65 2e 20 49 74 20 69   available. It i
2cda0 73 20 62 65 74 74 65 72 20 0a 20 20 2a 2a 20 6e  s better .  ** n
2cdb0 6f 74 20 74 6f 20 72 69 73 6b 20 62 72 65 61 6b  ot to risk break
2cdc0 69 6e 67 20 76 78 77 6f 72 6b 73 20 73 75 70 70  ing vxworks supp
2cdd0 6f 72 74 20 66 6f 72 20 74 68 65 20 73 61 6b 65  ort for the sake
2cde0 20 6f 66 20 73 75 63 68 20 61 6e 20 6f 62 73 63   of such an obsc
2cdf0 75 72 65 20 0a 20 20 2a 2a 20 66 65 61 74 75 72  ure .  ** featur
2ce00 65 2e 20 20 2a 2f 0a 23 69 66 20 21 4f 53 5f 56  e.  */.#if !OS_V
2ce10 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20  XWORKS.  struct 
2ce20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20  stat sStat;     
2ce30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ce40 20 52 65 73 75 6c 74 73 20 6f 66 20 73 74 61 74   Results of stat
2ce50 28 29 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a  () call */..  /*
2ce60 20 41 20 73 74 61 74 28 29 20 63 61 6c 6c 20 6d   A stat() call m
2ce70 61 79 20 66 61 69 6c 20 66 6f 72 20 76 61 72 69  ay fail for vari
2ce80 6f 75 73 20 72 65 61 73 6f 6e 73 2e 20 49 66 20  ous reasons. If 
2ce90 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20 69 74  this happens, it
2cea0 20 69 73 0a 20 20 2a 2a 20 61 6c 6d 6f 73 74 20   is.  ** almost 
2ceb0 63 65 72 74 61 69 6e 20 74 68 61 74 20 61 6e 20  certain that an 
2cec0 6f 70 65 6e 28 29 20 63 61 6c 6c 20 6f 6e 20 74  open() call on t
2ced0 68 65 20 73 61 6d 65 20 70 61 74 68 20 77 69 6c  he same path wil
2cee0 6c 20 61 6c 73 6f 20 66 61 69 6c 2e 0a 20 20 2a  l also fail..  *
2cef0 2a 20 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f  * For this reaso
2cf00 6e 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  n, if an error o
2cf10 63 63 75 72 73 20 69 6e 20 74 68 65 20 73 74 61  ccurs in the sta
2cf20 74 28 29 20 63 61 6c 6c 20 68 65 72 65 2c 20 69  t() call here, i
2cf30 74 20 69 73 0a 20 20 2a 2a 20 69 67 6e 6f 72 65  t is.  ** ignore
2cf40 64 20 61 6e 64 20 2d 31 20 69 73 20 72 65 74 75  d and -1 is retu
2cf50 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72  rned. The caller
2cf60 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 6f 70 65   will try to ope
2cf70 6e 20 61 20 6e 65 77 20 66 69 6c 65 0a 20 20 2a  n a new file.  *
2cf80 2a 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20  * descriptor on 
2cf90 74 68 65 20 73 61 6d 65 20 70 61 74 68 2c 20 66  the same path, f
2cfa0 61 69 6c 2c 20 61 6e 64 20 72 65 74 75 72 6e 20  ail, and return 
2cfb0 61 6e 20 65 72 72 6f 72 20 74 6f 20 53 51 4c 69  an error to SQLi
2cfc0 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 76  te..  **.  ** Ev
2cfd0 65 6e 20 69 66 20 61 20 73 75 62 73 65 71 75 65  en if a subseque
2cfe0 6e 74 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20 64  nt open() call d
2cff0 6f 65 73 20 73 75 63 63 65 65 64 2c 20 74 68 65  oes succeed, the
2d000 20 63 6f 6e 73 65 71 75 65 6e 63 65 73 20 6f 66   consequences of
2d010 0a 20 20 2a 2a 20 6e 6f 74 20 73 65 61 72 63 68  .  ** not search
2d020 69 6e 67 20 66 6f 72 20 61 20 72 65 75 73 61 62  ing for a reusab
2d030 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  le file descript
2d040 6f 72 20 61 72 65 20 6e 6f 74 20 64 69 72 65 2e  or are not dire.
2d050 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 6f 73    */.  if( 0==os
2d060 53 74 61 74 28 7a 50 61 74 68 2c 20 26 73 53 74  Stat(zPath, &sSt
2d070 61 74 29 20 29 7b 0a 20 20 20 20 75 6e 69 78 49  at) ){.    unixI
2d080 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
2d090 3b 0a 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72  ;..    unixEnter
2d0a0 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 70 49 6e  Mutex();.    pIn
2d0b0 6f 64 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b  ode = inodeList;
2d0c0 0a 20 20 20 20 77 68 69 6c 65 28 20 70 49 6e 6f  .    while( pIno
2d0d0 64 65 20 26 26 20 28 70 49 6e 6f 64 65 2d 3e 66  de && (pInode->f
2d0e0 69 6c 65 49 64 2e 64 65 76 21 3d 73 53 74 61 74  ileId.dev!=sStat
2d0f0 2e 73 74 5f 64 65 76 0a 20 20 20 20 20 20 20 20  .st_dev.        
2d100 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
2d110 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69  pInode->fileId.i
2d120 6e 6f 21 3d 73 53 74 61 74 2e 73 74 5f 69 6e 6f  no!=sStat.st_ino
2d130 29 20 29 7b 0a 20 20 20 20 20 20 20 70 49 6e 6f  ) ){.       pIno
2d140 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65  de = pInode->pNe
2d150 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  xt;.    }.    if
2d160 28 20 70 49 6e 6f 64 65 20 29 7b 0a 20 20 20 20  ( pInode ){.    
2d170 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
2d180 2a 70 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  *pp;.      for(p
2d190 70 3d 26 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73  p=&pInode->pUnus
2d1a0 65 64 3b 20 2a 70 70 20 26 26 20 28 2a 70 70 29  ed; *pp && (*pp)
2d1b0 2d 3e 66 6c 61 67 73 21 3d 66 6c 61 67 73 3b 20  ->flags!=flags; 
2d1c0 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78  pp=&((*pp)->pNex
2d1d0 74 29 29 3b 0a 20 20 20 20 20 20 70 55 6e 75 73  t));.      pUnus
2d1e0 65 64 20 3d 20 2a 70 70 3b 0a 20 20 20 20 20 20  ed = *pp;.      
2d1f0 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20  if( pUnused ){. 
2d200 20 20 20 20 20 20 20 2a 70 70 20 3d 20 70 55 6e         *pp = pUn
2d210 75 73 65 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  used->pNext;.   
2d220 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75     }.    }.    u
2d230 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
2d240 0a 20 20 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f  .  }.#endif    /
2d250 2a 20 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53  * if !OS_VXWORKS
2d260 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 55 6e   */.  return pUn
2d270 75 73 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  used;.}../*.** T
2d280 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2d290 63 61 6c 6c 65 64 20 62 79 20 75 6e 69 78 4f 70  called by unixOp
2d2a0 65 6e 28 29 20 74 6f 20 64 65 74 65 72 6d 69 6e  en() to determin
2d2b0 65 20 74 68 65 20 75 6e 69 78 20 70 65 72 6d 69  e the unix permi
2d2c0 73 73 69 6f 6e 73 0a 2a 2a 20 74 6f 20 63 72 65  ssions.** to cre
2d2d0 61 74 65 20 6e 65 77 20 66 69 6c 65 73 20 77 69  ate new files wi
2d2e0 74 68 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20  th. If no error 
2d2f0 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c  occurs, then SQL
2d300 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
2d310 65 64 0a 2a 2a 20 61 6e 64 20 61 20 76 61 6c 75  ed.** and a valu
2d320 65 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 70  e suitable for p
2d330 61 73 73 69 6e 67 20 61 73 20 74 68 65 20 74 68  assing as the th
2d340 69 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ird argument to 
2d350 6f 70 65 6e 28 32 29 20 69 73 0a 2a 2a 20 77 72  open(2) is.** wr
2d360 69 74 74 65 6e 20 74 6f 20 2a 70 4d 6f 64 65 2e  itten to *pMode.
2d370 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
2d380 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74  occurs, an SQLit
2d390 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
2d3a0 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64  .** returned and
2d3b0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70   the value of *p
2d3c0 4d 6f 64 65 20 69 73 20 6e 6f 74 20 6d 6f 64 69  Mode is not modi
2d3d0 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6d  fied..**.** In m
2d3e0 6f 73 74 20 63 61 73 65 73 2c 20 74 68 69 73 20  ost cases, this 
2d3f0 72 6f 75 74 69 6e 65 20 73 65 74 73 20 2a 70 4d  routine sets *pM
2d400 6f 64 65 20 74 6f 20 30 2c 20 77 68 69 63 68 20  ode to 0, which 
2d410 77 69 6c 6c 20 62 65 63 6f 6d 65 0a 2a 2a 20 61  will become.** a
2d420 6e 20 69 6e 64 69 63 61 74 69 6f 6e 20 74 6f 20  n indication to 
2d430 72 6f 62 75 73 74 5f 6f 70 65 6e 28 29 20 74 6f  robust_open() to
2d440 20 63 72 65 61 74 65 20 74 68 65 20 66 69 6c 65   create the file
2d450 20 75 73 69 6e 67 0a 2a 2a 20 53 51 4c 49 54 45   using.** SQLITE
2d460 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
2d470 52 4d 49 53 53 49 4f 4e 53 20 61 64 6a 75 73 74  RMISSIONS adjust
2d480 65 64 20 62 79 20 74 68 65 20 75 6d 61 73 6b 2e  ed by the umask.
2d490 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20 66  .** But if the f
2d4a0 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  ile being opened
2d4b0 20 69 73 20 61 20 57 41 4c 20 6f 72 20 72 65 67   is a WAL or reg
2d4c0 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ular journal fil
2d4d0 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73  e, then .** this
2d4e0 20 66 75 6e 63 74 69 6f 6e 20 71 75 65 72 69 65   function querie
2d4f0 73 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  s the file-syste
2d500 6d 20 66 6f 72 20 74 68 65 20 70 65 72 6d 69 73  m for the permis
2d510 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20 0a 2a 2a  sions on the .**
2d520 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 64   corresponding d
2d530 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
2d540 20 73 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20   sets *pMode to 
2d550 74 68 69 73 20 76 61 6c 75 65 2e 20 57 68 65 6e  this value. When
2d560 65 76 65 72 20 0a 2a 2a 20 70 6f 73 73 69 62 6c  ever .** possibl
2d570 65 2c 20 57 41 4c 20 61 6e 64 20 6a 6f 75 72 6e  e, WAL and journ
2d580 61 6c 20 66 69 6c 65 73 20 61 72 65 20 63 72 65  al files are cre
2d590 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 73  ated using the s
2d5a0 61 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  ame permissions 
2d5b0 0a 2a 2a 20 61 73 20 74 68 65 20 61 73 73 6f 63  .** as the assoc
2d5c0 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 66  iated database f
2d5d0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ile..**.** If th
2d5e0 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
2d5f0 38 5f 33 5f 4e 41 4d 45 53 20 6f 70 74 69 6f 6e  8_3_NAMES option
2d600 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65   is enabled, the
2d610 6e 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61  n the.** origina
2d620 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 75 6e  l filename is un
2d630 61 76 61 69 6c 61 62 6c 65 2e 20 20 42 75 74 20  available.  But 
2d640 38 5f 33 5f 4e 41 4d 45 53 20 69 73 20 6f 6e 6c  8_3_NAMES is onl
2d650 79 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 46 41  y used for.** FA
2d660 54 20 66 69 6c 65 73 79 73 74 65 6d 73 20 61 6e  T filesystems an
2d670 64 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 64 6f  d permissions do
2d680 20 6e 6f 74 20 6d 61 74 74 65 72 20 74 68 65 72   not matter ther
2d690 65 2c 20 73 6f 20 6a 75 73 74 20 75 73 65 0a 2a  e, so just use.*
2d6a0 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 65  * the default pe
2d6b0 72 6d 69 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74  rmissions..*/.st
2d6c0 61 74 69 63 20 69 6e 74 20 66 69 6e 64 43 72 65  atic int findCre
2d6d0 61 74 65 46 69 6c 65 4d 6f 64 65 28 0a 20 20 63  ateFileMode(.  c
2d6e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
2d6f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2d700 2a 20 50 61 74 68 20 6f 66 20 66 69 6c 65 20 28  * Path of file (
2d710 70 6f 73 73 69 62 6c 79 29 20 62 65 69 6e 67 20  possibly) being 
2d720 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74  created */.  int
2d730 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
2d740 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d750 46 6c 61 67 73 20 70 61 73 73 65 64 20 61 73 20  Flags passed as 
2d760 34 74 68 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  4th argument to 
2d770 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 6d 6f 64  xOpen() */.  mod
2d780 65 5f 74 20 2a 70 4d 6f 64 65 2c 20 20 20 20 20  e_t *pMode,     
2d790 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d7a0 4f 55 54 3a 20 50 65 72 6d 69 73 73 69 6f 6e 73  OUT: Permissions
2d7b0 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 20 77 69   to open file wi
2d7c0 74 68 20 2a 2f 0a 20 20 75 69 64 5f 74 20 2a 70  th */.  uid_t *p
2d7d0 55 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  Uid,            
2d7e0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
2d7f0 75 69 64 20 74 6f 20 73 65 74 20 6f 6e 20 74 68  uid to set on th
2d800 65 20 66 69 6c 65 20 2a 2f 0a 20 20 67 69 64 5f  e file */.  gid_
2d810 74 20 2a 70 47 69 64 20 20 20 20 20 20 20 20 20  t *pGid         
2d820 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2d830 55 54 3a 20 67 69 64 20 74 6f 20 73 65 74 20 6f  UT: gid to set o
2d840 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 29 7b  n the file */.){
2d850 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2d860 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
2d870 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
2d880 65 20 2a 2f 0a 20 20 2a 70 4d 6f 64 65 20 3d 20  e */.  *pMode = 
2d890 30 3b 0a 20 20 2a 70 55 69 64 20 3d 20 30 3b 0a  0;.  *pUid = 0;.
2d8a0 20 20 2a 70 47 69 64 20 3d 20 30 3b 0a 20 20 69    *pGid = 0;.  i
2d8b0 66 28 20 66 6c 61 67 73 20 26 20 28 53 51 4c 49  f( flags & (SQLI
2d8c0 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49  TE_OPEN_WAL|SQLI
2d8d0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
2d8e0 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20 63 68 61  RNAL) ){.    cha
2d8f0 72 20 7a 44 62 5b 4d 41 58 5f 50 41 54 48 4e 41  r zDb[MAX_PATHNA
2d900 4d 45 2b 31 5d 3b 20 20 20 20 20 2f 2a 20 44 61  ME+1];     /* Da
2d910 74 61 62 61 73 65 20 66 69 6c 65 20 70 61 74 68  tabase file path
2d920 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 44 62 3b   */.    int nDb;
2d930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d940 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2d950 6f 66 20 76 61 6c 69 64 20 62 79 74 65 73 20 69  of valid bytes i
2d960 6e 20 7a 44 62 20 2a 2f 0a 20 20 20 20 73 74 72  n zDb */.    str
2d970 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20  uct stat sStat; 
2d980 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75             /* Ou
2d990 74 70 75 74 20 6f 66 20 73 74 61 74 28 29 20 6f  tput of stat() o
2d9a0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
2d9b0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 7a 50 61 74 68  */..    /* zPath
2d9c0 20 69 73 20 61 20 70 61 74 68 20 74 6f 20 61 20   is a path to a 
2d9d0 57 41 4c 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66  WAL or journal f
2d9e0 69 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ile. The followi
2d9f0 6e 67 20 62 6c 6f 63 6b 20 64 65 72 69 76 65 73  ng block derives
2da00 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 74 68  .    ** the path
2da10 20 74 6f 20 74 68 65 20 61 73 73 6f 63 69 61 74   to the associat
2da20 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
2da30 20 66 72 6f 6d 20 7a 50 61 74 68 2e 20 54 68 69   from zPath. Thi
2da40 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65 73 0a  s block handles.
2da50 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f      ** the follo
2da60 77 69 6e 67 20 6e 61 6d 69 6e 67 20 63 6f 6e 76  wing naming conv
2da70 65 6e 74 69 6f 6e 73 3a 0a 20 20 20 20 2a 2a 0a  entions:.    **.
2da80 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20      **   "<path 
2da90 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 22 0a  to db>-journal".
2daa0 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20      **   "<path 
2dab0 74 6f 20 64 62 3e 2d 77 61 6c 22 0a 20 20 20 20  to db>-wal".    
2dac0 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64  **   "<path to d
2dad0 62 3e 2d 6a 6f 75 72 6e 61 6c 4e 4e 22 0a 20 20  b>-journalNN".  
2dae0 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f    **   "<path to
2daf0 20 64 62 3e 2d 77 61 6c 4e 4e 22 0a 20 20 20 20   db>-walNN".    
2db00 2a 2a 0a 20 20 20 20 2a 2a 20 77 68 65 72 65 20  **.    ** where 
2db10 4e 4e 20 69 73 20 61 20 64 65 63 69 6d 61 6c 20  NN is a decimal 
2db20 6e 75 6d 62 65 72 2e 20 54 68 65 20 4e 4e 20 6e  number. The NN n
2db30 61 6d 69 6e 67 20 73 63 68 65 6d 65 73 20 61 72  aming schemes ar
2db40 65 20 0a 20 20 20 20 2a 2a 20 75 73 65 64 20 62  e .    ** used b
2db50 79 20 74 68 65 20 74 65 73 74 5f 6d 75 6c 74 69  y the test_multi
2db60 70 6c 65 78 2e 63 20 6d 6f 64 75 6c 65 2e 0a 20  plex.c module.. 
2db70 20 20 20 2a 2f 0a 20 20 20 20 6e 44 62 20 3d 20     */.    nDb = 
2db80 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2db90 7a 50 61 74 68 29 20 2d 20 31 3b 20 0a 23 69 66  zPath) - 1; .#if
2dba0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
2dbb0 45 5f 38 5f 33 5f 4e 41 4d 45 53 0a 20 20 20 20  E_8_3_NAMES.    
2dbc0 77 68 69 6c 65 28 20 6e 44 62 3e 30 20 26 26 20  while( nDb>0 && 
2dbd0 73 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a  sqlite3Isalnum(z
2dbe0 50 61 74 68 5b 6e 44 62 5d 29 20 29 20 6e 44 62  Path[nDb]) ) nDb
2dbf0 2d 2d 3b 0a 20 20 20 20 69 66 28 20 6e 44 62 3d  --;.    if( nDb=
2dc00 3d 30 20 7c 7c 20 7a 50 61 74 68 5b 6e 44 62 5d  =0 || zPath[nDb]
2dc10 21 3d 27 2d 27 20 29 20 72 65 74 75 72 6e 20 53  !='-' ) return S
2dc20 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a  QLITE_OK;.#else.
2dc30 20 20 20 20 77 68 69 6c 65 28 20 7a 50 61 74 68      while( zPath
2dc40 5b 6e 44 62 5d 21 3d 27 2d 27 20 29 7b 0a 20 20  [nDb]!='-' ){.  
2dc50 20 20 20 20 61 73 73 65 72 74 28 20 6e 44 62 3e      assert( nDb>
2dc60 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
2dc70 74 28 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27  t( zPath[nDb]!='
2dc80 5c 6e 27 20 29 3b 0a 20 20 20 20 20 20 6e 44 62  \n' );.      nDb
2dc90 2d 2d 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  --;.    }.#endif
2dca0 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 2c  .    memcpy(zDb,
2dcb0 20 7a 50 61 74 68 2c 20 6e 44 62 29 3b 0a 20 20   zPath, nDb);.  
2dcc0 20 20 7a 44 62 5b 6e 44 62 5d 20 3d 20 27 5c 30    zDb[nDb] = '\0
2dcd0 27 3b 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 6f  ';..    if( 0==o
2dce0 73 53 74 61 74 28 7a 44 62 2c 20 26 73 53 74 61  sStat(zDb, &sSta
2dcf0 74 29 20 29 7b 0a 20 20 20 20 20 20 2a 70 4d 6f  t) ){.      *pMo
2dd00 64 65 20 3d 20 73 53 74 61 74 2e 73 74 5f 6d 6f  de = sStat.st_mo
2dd10 64 65 20 26 20 30 37 37 37 3b 0a 20 20 20 20 20  de & 0777;.     
2dd20 20 2a 70 55 69 64 20 3d 20 73 53 74 61 74 2e 73   *pUid = sStat.s
2dd30 74 5f 75 69 64 3b 0a 20 20 20 20 20 20 2a 70 47  t_uid;.      *pG
2dd40 69 64 20 3d 20 73 53 74 61 74 2e 73 74 5f 67 69  id = sStat.st_gi
2dd50 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  d;.    }else{.  
2dd60 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2dd70 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20  IOERR_FSTAT;.   
2dd80 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66   }.  }else if( f
2dd90 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
2dda0 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
2ddb0 20 29 7b 0a 20 20 20 20 2a 70 4d 6f 64 65 20 3d   ){.    *pMode =
2ddc0 20 30 36 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74   0600;.  }.  ret
2ddd0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2dde0 20 4f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 7a   Open the file z
2ddf0 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72 65  Path..** .** Pre
2de00 76 69 6f 75 73 6c 79 2c 20 74 68 65 20 53 51 4c  viously, the SQL
2de10 69 74 65 20 4f 53 20 6c 61 79 65 72 20 75 73 65  ite OS layer use
2de20 64 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e  d three function
2de30 73 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68  s in place of th
2de40 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a  is.** one:.**.**
2de50 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70       sqlite3OsOp
2de60 65 6e 52 65 61 64 57 72 69 74 65 28 29 3b 0a 2a  enReadWrite();.*
2de70 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f  *     sqlite3OsO
2de80 70 65 6e 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 2a  penReadOnly();.*
2de90 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f  *     sqlite3OsO
2dea0 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 3b 0a  penExclusive();.
2deb0 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c  **.** These call
2dec0 73 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20  s correspond to 
2ded0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  the following co
2dee0 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 66 6c  mbinations of fl
2def0 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52  ags:.**.**     R
2df00 65 61 64 57 72 69 74 65 28 29 20 2d 3e 20 20 20  eadWrite() ->   
2df10 20 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43    (READWRITE | C
2df20 52 45 41 54 45 29 0a 2a 2a 20 20 20 20 20 52 65  REATE).**     Re
2df30 61 64 4f 6e 6c 79 28 29 20 20 2d 3e 20 20 20 20  adOnly()  ->    
2df40 20 28 52 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a 20   (READONLY) .** 
2df50 20 20 20 20 4f 70 65 6e 45 78 63 6c 75 73 69 76      OpenExclusiv
2df60 65 28 29 20 2d 3e 20 28 52 45 41 44 57 52 49 54  e() -> (READWRIT
2df70 45 20 7c 20 43 52 45 41 54 45 20 7c 20 45 58 43  E | CREATE | EXC
2df80 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54 68  LUSIVE).**.** Th
2df90 65 20 6f 6c 64 20 4f 70 65 6e 45 78 63 6c 75 73  e old OpenExclus
2dfa0 69 76 65 28 29 20 61 63 63 65 70 74 65 64 20 61  ive() accepted a
2dfb0 20 62 6f 6f 6c 65 61 6e 20 61 72 67 75 6d 65 6e   boolean argumen
2dfc0 74 20 2d 20 22 64 65 6c 46 6c 61 67 22 2e 20 49  t - "delFlag". I
2dfd0 66 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 20 66  f.** true, the f
2dfe0 69 6c 65 20 77 61 73 20 63 6f 6e 66 69 67 75 72  ile was configur
2dff0 65 64 20 74 6f 20 62 65 20 61 75 74 6f 6d 61 74  ed to be automat
2e000 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77  ically deleted w
2e010 68 65 6e 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20  hen the.** file 
2e020 68 61 6e 64 6c 65 20 63 6c 6f 73 65 64 2e 20 54  handle closed. T
2e030 6f 20 61 63 68 69 65 76 65 20 74 68 65 20 73 61  o achieve the sa
2e040 6d 65 20 65 66 66 65 63 74 20 75 73 69 6e 67 20  me effect using 
2e050 74 68 69 73 20 6e 65 77 20 0a 2a 2a 20 69 6e 74  this new .** int
2e060 65 72 66 61 63 65 2c 20 61 64 64 20 74 68 65 20  erface, add the 
2e070 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 66 6c  DELETEONCLOSE fl
2e080 61 67 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63  ag to those spec
2e090 69 66 69 65 64 20 61 62 6f 76 65 20 66 6f 72 20  ified above for 
2e0a0 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c 75 73 69 76  .** OpenExclusiv
2e0b0 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
2e0c0 6e 74 20 75 6e 69 78 4f 70 65 6e 28 0a 20 20 73  nt unixOpen(.  s
2e0d0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2e0e0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
2e0f0 68 65 20 56 46 53 20 66 6f 72 20 77 68 69 63 68  he VFS for which
2e100 20 74 68 69 73 20 69 73 20 74 68 65 20 78 4f 70   this is the xOp
2e110 65 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63  en method */.  c
2e120 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
2e130 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
2e140 61 74 68 6e 61 6d 65 20 6f 66 20 66 69 6c 65 20  athname of file 
2e150 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a  to be opened */.
2e160 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
2e170 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 2f  pFile,         /
2e180 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72  * The file descr
2e190 69 70 74 6f 72 20 74 6f 20 62 65 20 66 69 6c 6c  iptor to be fill
2e1a0 65 64 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 66  ed in */.  int f
2e1b0 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
2e1c0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74          /* Input
2e1d0 20 66 6c 61 67 73 20 74 6f 20 63 6f 6e 74 72 6f   flags to contro
2e1e0 6c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 2a 2f  l the opening */
2e1f0 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67  .  int *pOutFlag
2e200 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
2e210 2f 2a 20 4f 75 74 70 75 74 20 66 6c 61 67 73 20  /* Output flags 
2e220 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69  returned to SQLi
2e230 74 65 20 63 6f 72 65 20 2a 2f 0a 29 7b 0a 20 20  te core */.){.  
2e240 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d 20 28 75  unixFile *p = (u
2e250 6e 69 78 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b  nixFile *)pFile;
2e260 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 20  .  int fd = -1; 
2e270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e280 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
2e290 70 74 6f 72 20 72 65 74 75 72 6e 65 64 20 62 79  ptor returned by
2e2a0 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74   open() */.  int
2e2b0 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 30 3b 20   openFlags = 0; 
2e2c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2e2d0 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20  lags to pass to 
2e2e0 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  open() */.  int 
2e2f0 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78  eType = flags&0x
2e300 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79  FFFFFF00;  /* Ty
2e310 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70  pe of file to op
2e320 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f  en */.  int noLo
2e330 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ck;             
2e340 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
2e350 6f 20 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 70  o omit locking p
2e360 72 69 6d 69 74 69 76 65 73 20 2a 2f 0a 20 20 69  rimitives */.  i
2e370 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2e380 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  K;            /*
2e390 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e   Function Return
2e3a0 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63   Code */.  int c
2e3b0 74 72 6c 46 6c 61 67 73 20 3d 20 30 3b 20 20 20  trlFlags = 0;   
2e3c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 4e 49            /* UNI
2e3d0 58 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f  XFILE_* flags */
2e3e0 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c 75 73  ..  int isExclus
2e3f0 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ive  = (flags & 
2e400 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
2e410 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20 69 73  USIVE);.  int is
2e420 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66 6c  Delete     = (fl
2e430 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
2e440 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29  N_DELETEONCLOSE)
2e450 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74 65  ;.  int isCreate
2e460 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20       = (flags & 
2e470 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
2e480 54 45 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61  TE);.  int isRea
2e490 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67 73  donly   = (flags
2e4a0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   & SQLITE_OPEN_R
2e4b0 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20  EADONLY);.  int 
2e4c0 69 73 52 65 61 64 57 72 69 74 65 20 20 3d 20 28  isReadWrite  = (
2e4d0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
2e4e0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a  PEN_READWRITE);.
2e4f0 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
2e500 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2e510 20 20 69 6e 74 20 69 73 41 75 74 6f 50 72 6f 78    int isAutoProx
2e520 79 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  y  = (flags & SQ
2e530 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52  LITE_OPEN_AUTOPR
2e540 4f 58 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  OXY);.#endif.#if
2e550 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
2e560 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e  __) || SQLITE_EN
2e570 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2e580 4c 45 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  LE.  struct stat
2e590 66 73 20 66 73 49 6e 66 6f 3b 0a 23 65 6e 64 69  fs fsInfo;.#endi
2e5a0 66 0a 0a 20 20 2f 2a 20 49 66 20 63 72 65 61 74  f..  /* If creat
2e5b0 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6f 72 20  ing a master or 
2e5c0 6d 61 69 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61  main-file journa
2e5d0 6c 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  l, this function
2e5e0 20 77 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20   will open.  ** 
2e5f0 61 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f  a file-descripto
2e600 72 20 6f 6e 20 74 68 65 20 64 69 72 65 63 74 6f  r on the directo
2e610 72 79 20 74 6f 6f 2e 20 54 68 65 20 66 69 72 73  ry too. The firs
2e620 74 20 74 69 6d 65 20 75 6e 69 78 53 79 6e 63 28  t time unixSync(
2e630 29 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ).  ** is called
2e640 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 66   the directory f
2e650 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77  ile descriptor w
2e660 69 6c 6c 20 62 65 20 66 73 79 6e 63 28 29 65 64  ill be fsync()ed
2e670 20 61 6e 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20   and close()d.. 
2e680 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69   */.  int syncDi
2e690 72 20 3d 20 28 69 73 43 72 65 61 74 65 20 26 26  r = (isCreate &&
2e6a0 20 28 0a 20 20 20 20 20 20 20 20 65 54 79 70 65   (.        eType
2e6b0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
2e6c0 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  STER_JOURNAL .  
2e6d0 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
2e6e0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
2e6f0 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65  URNAL .     || e
2e700 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
2e710 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a 0a 20 20 2f  N_WAL.  ));..  /
2e720 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50  * If argument zP
2e730 61 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f  ath is a NULL po
2e740 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63  inter, this func
2e750 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64  tion is required
2e760 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20   to open.  ** a 
2e770 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
2e780 55 73 65 20 74 68 69 73 20 62 75 66 66 65 72 20  Use this buffer 
2e790 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c  to store the fil
2e7a0 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a  e name in..  */.
2e7b0 20 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b    char zTmpname[
2e7c0 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b  MAX_PATHNAME+2];
2e7d0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2e7e0 4e 61 6d 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20  Name = zPath;.. 
2e7f0 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f   /* Check the fo
2e800 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e  llowing statemen
2e810 74 73 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20  ts are true: .  
2e820 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78  **.  **   (a) Ex
2e830 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65  actly one of the
2e840 20 52 45 41 44 57 52 49 54 45 20 61 6e 64 20 52   READWRITE and R
2e850 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75  EADONLY flags mu
2e860 73 74 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a  st be set, and .
2e870 20 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52    **   (b) if CR
2e880 45 41 54 45 20 69 73 20 73 65 74 2c 20 74 68 65  EATE is set, the
2e890 6e 20 52 45 41 44 57 52 49 54 45 20 6d 75 73 74  n READWRITE must
2e8a0 20 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e   also be set, an
2e8b0 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20  d.  **   (c) if 
2e8c0 45 58 43 4c 55 53 49 56 45 20 69 73 20 73 65 74  EXCLUSIVE is set
2e8d0 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75  , then CREATE mu
2e8e0 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a  st also be set..
2e8f0 20 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45    **   (d) if DE
2e900 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73  LETEONCLOSE is s
2e910 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20  et, then CREATE 
2e920 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74  must also be set
2e930 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
2e940 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c  (isReadonly==0 |
2e950 7c 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30  | isReadWrite==0
2e960 29 20 26 26 20 28 69 73 52 65 61 64 57 72 69 74  ) && (isReadWrit
2e970 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29  e || isReadonly)
2e980 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43 72  );.  assert(isCr
2e990 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61  eate==0 || isRea
2e9a0 64 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72  dWrite);.  asser
2e9b0 74 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30  t(isExclusive==0
2e9c0 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20   || isCreate);. 
2e9d0 20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65   assert(isDelete
2e9e0 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29  ==0 || isCreate)
2e9f0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e  ;..  /* The main
2ea00 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   DB, main journa
2ea10 6c 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20  l, WAL file and 
2ea20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61  master journal a
2ea30 72 65 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61  re never .  ** a
2ea40 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
2ea50 65 74 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68  eted. Nor are th
2ea60 65 79 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72  ey ever temporar
2ea70 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61  y files.  */.  a
2ea80 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
2ea90 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
2eaa0 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
2eab0 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61  N_MAIN_DB );.  a
2eac0 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
2ead0 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
2eae0 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
2eaf0 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29  N_MAIN_JOURNAL )
2eb00 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  ;.  assert( (!is
2eb10 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
2eb20 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
2eb30 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
2eb40 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72  URNAL );.  asser
2eb50 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
2eb60 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
2eb70 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  !=SQLITE_OPEN_WA
2eb80 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72  L );..  /* Asser
2eb90 74 20 74 68 61 74 20 74 68 65 20 75 70 70 65 72  t that the upper
2eba0 20 6c 61 79 65 72 20 68 61 73 20 73 65 74 20 6f   layer has set o
2ebb0 6e 65 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d  ne of the "file-
2ebc0 74 79 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a  type" flags. */.
2ebd0 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
2ebe0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
2ebf0 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79  N_DB      || eTy
2ec00 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
2ec10 54 45 4d 50 5f 44 42 20 0a 20 20 20 20 20 20 20  TEMP_DB .       
2ec20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
2ec30 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
2ec40 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c  AL || eType==SQL
2ec50 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
2ec60 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c  URNAL .       ||
2ec70 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2ec80 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20  PEN_SUBJOURNAL  
2ec90 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
2eca0 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
2ecb0 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c  URNAL .       ||
2ecc0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2ecd0 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42  PEN_TRANSIENT_DB
2ece0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
2ecf0 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a  E_OPEN_WAL.  );.
2ed00 0a 20 20 2f 2a 20 44 65 74 65 63 74 20 61 20 70  .  /* Detect a p
2ed10 69 64 20 63 68 61 6e 67 65 20 61 6e 64 20 72 65  id change and re
2ed20 73 65 74 20 74 68 65 20 50 52 4e 47 2e 20 20 54  set the PRNG.  T
2ed30 68 65 72 65 20 69 73 20 61 20 72 61 63 65 20 63  here is a race c
2ed40 6f 6e 64 69 74 69 6f 6e 0a 20 20 2a 2a 20 68 65  ondition.  ** he
2ed50 72 65 20 73 75 63 68 20 74 68 61 74 20 74 77 6f  re such that two
2ed60 20 6f 72 20 6d 6f 72 65 20 74 68 72 65 61 64 73   or more threads
2ed70 20 61 6c 6c 20 74 72 79 69 6e 67 20 74 6f 20 6f   all trying to o
2ed80 70 65 6e 20 64 61 74 61 62 61 73 65 73 20 61 74  pen databases at
2ed90 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 69  .  ** the same i
2eda0 6e 73 74 61 6e 74 20 6d 69 67 68 74 20 61 6c 6c  nstant might all
2edb0 20 72 65 73 65 74 20 74 68 65 20 50 52 4e 47 2e   reset the PRNG.
2edc0 20 20 42 75 74 20 6d 75 6c 74 69 70 6c 65 20 72    But multiple r
2edd0 65 73 65 74 73 0a 20 20 2a 2a 20 61 72 65 20 68  esets.  ** are h
2ede0 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  armless..  */.  
2edf0 69 66 28 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69  if( randomnessPi
2ee00 64 21 3d 6f 73 47 65 74 70 69 64 28 30 29 20 29  d!=osGetpid(0) )
2ee10 7b 0a 20 20 20 20 72 61 6e 64 6f 6d 6e 65 73 73  {.    randomness
2ee20 50 69 64 20 3d 20 6f 73 47 65 74 70 69 64 28 30  Pid = osGetpid(0
2ee30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  );.    sqlite3_r
2ee40 61 6e 64 6f 6d 6e 65 73 73 28 30 2c 30 29 3b 0a  andomness(0,0);.
2ee50 20 20 7d 0a 0a 20 20 6d 65 6d 73 65 74 28 70 2c    }..  memset(p,
2ee60 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46   0, sizeof(unixF
2ee70 69 6c 65 29 29 3b 0a 0a 20 20 69 66 28 20 65 54  ile));..  if( eT
2ee80 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
2ee90 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20  _MAIN_DB ){.    
2eea0 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55  UnixUnusedFd *pU
2eeb0 6e 75 73 65 64 3b 0a 20 20 20 20 70 55 6e 75 73  nused;.    pUnus
2eec0 65 64 20 3d 20 66 69 6e 64 52 65 75 73 61 62 6c  ed = findReusabl
2eed0 65 46 64 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73  eFd(zName, flags
2eee0 29 3b 0a 20 20 20 20 69 66 28 20 70 55 6e 75 73  );.    if( pUnus
2eef0 65 64 20 29 7b 0a 20 20 20 20 20 20 66 64 20 3d  ed ){.      fd =
2ef00 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20   pUnused->fd;.  
2ef10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
2ef20 55 6e 75 73 65 64 20 3d 20 73 71 6c 69 74 65 33  Unused = sqlite3
2ef30 5f 6d 61 6c 6c 6f 63 36 34 28 73 69 7a 65 6f 66  _malloc64(sizeof
2ef40 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20  (*pUnused));.   
2ef50 20 20 20 69 66 28 20 21 70 55 6e 75 73 65 64 20     if( !pUnused 
2ef60 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
2ef70 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
2ef80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2ef90 20 20 70 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70    p->pUnused = p
2efa0 55 6e 75 73 65 64 3b 0a 0a 20 20 20 20 2f 2a 20  Unused;..    /* 
2efb0 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d  Database filenam
2efc0 65 73 20 61 72 65 20 64 6f 75 62 6c 65 2d 7a 65  es are double-ze
2efd0 72 6f 20 74 65 72 6d 69 6e 61 74 65 64 20 69 66  ro terminated if
2efe0 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 20 20   they are not.  
2eff0 20 20 2a 2a 20 55 52 49 73 20 77 69 74 68 20 70    ** URIs with p
2f000 61 72 61 6d 65 74 65 72 73 2e 20 20 48 65 6e 63  arameters.  Henc
2f010 65 2c 20 74 68 65 79 20 63 61 6e 20 61 6c 77 61  e, they can alwa
2f020 79 73 20 62 65 20 70 61 73 73 65 64 20 69 6e 74  ys be passed int
2f030 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
2f040 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 29  _uri_parameter()
2f050 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
2f060 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
2f070 5f 4f 50 45 4e 5f 55 52 49 29 20 7c 7c 20 7a 4e  _OPEN_URI) || zN
2f080 61 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  ame[strlen(zName
2f090 29 2b 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20 7d 65  )+1]==0 );..  }e
2f0a0 6c 73 65 20 69 66 28 20 21 7a 4e 61 6d 65 20 29  lse if( !zName )
2f0b0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d  {.    /* If zNam
2f0c0 65 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 75  e is NULL, the u
2f0d0 70 70 65 72 20 6c 61 79 65 72 20 69 73 20 72 65  pper layer is re
2f0e0 71 75 65 73 74 69 6e 67 20 61 20 74 65 6d 70 20  questing a temp 
2f0f0 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  file. */.    ass
2f100 65 72 74 28 69 73 44 65 6c 65 74 65 20 26 26 20  ert(isDelete && 
2f110 21 73 79 6e 63 44 69 72 29 3b 0a 20 20 20 20 72  !syncDir);.    r
2f120 63 20 3d 20 75 6e 69 78 47 65 74 54 65 6d 70 6e  c = unixGetTempn
2f130 61 6d 65 28 70 56 66 73 2d 3e 6d 78 50 61 74 68  ame(pVfs->mxPath
2f140 6e 61 6d 65 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b  name, zTmpname);
2f150 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2f160 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2f170 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2f180 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 54 6d  .    zName = zTm
2f190 70 6e 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20 47  pname;..    /* G
2f1a0 65 6e 65 72 61 74 65 64 20 74 65 6d 70 6f 72 61  enerated tempora
2f1b0 72 79 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65  ry filenames are
2f1c0 20 61 6c 77 61 79 73 20 64 6f 75 62 6c 65 2d 7a   always double-z
2f1d0 65 72 6f 20 74 65 72 6d 69 6e 61 74 65 64 0a 20  ero terminated. 
2f1e0 20 20 20 2a 2a 20 66 6f 72 20 75 73 65 20 62 79     ** for use by
2f1f0 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72   sqlite3_uri_par
2f200 61 6d 65 74 65 72 28 29 2e 20 2a 2f 0a 20 20 20  ameter(). */.   
2f210 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 5b 73   assert( zName[s
2f220 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d  trlen(zName)+1]=
2f230 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  =0 );.  }..  /* 
2f240 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 76 61  Determine the va
2f250 6c 75 65 20 6f 66 20 74 68 65 20 66 6c 61 67 73  lue of the flags
2f260 20 70 61 72 61 6d 65 74 65 72 20 70 61 73 73 65   parameter passe
2f270 64 20 74 6f 20 50 4f 53 49 58 20 66 75 6e 63 74  d to POSIX funct
2f280 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65 6e 28 29 2e  ion.  ** open().
2f290 20 54 68 65 73 65 20 6d 75 73 74 20 62 65 20 63   These must be c
2f2a0 61 6c 63 75 6c 61 74 65 64 20 65 76 65 6e 20 69  alculated even i
2f2b0 66 20 6f 70 65 6e 28 29 20 69 73 20 6e 6f 74 20  f open() is not 
2f2c0 63 61 6c 6c 65 64 2c 20 61 73 0a 20 20 2a 2a 20  called, as.  ** 
2f2d0 74 68 65 79 20 6d 61 79 20 62 65 20 73 74 6f 72  they may be stor
2f2e0 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
2f2f0 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 61 6e  e file handle an
2f300 64 20 75 73 65 64 20 62 79 20 74 68 65 20 0a 20  d used by the . 
2f310 20 2a 2a 20 27 63 6f 6e 63 68 20 66 69 6c 65 27   ** 'conch file'
2f320 20 6c 6f 63 6b 69 6e 67 20 66 75 6e 63 74 69 6f   locking functio
2f330 6e 73 20 6c 61 74 65 72 20 6f 6e 2e 20 20 2a 2f  ns later on.  */
2f340 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c  .  if( isReadonl
2f350 79 20 29 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c  y )  openFlags |
2f360 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69 66  = O_RDONLY;.  if
2f370 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29 20  ( isReadWrite ) 
2f380 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52  openFlags |= O_R
2f390 44 57 52 3b 0a 20 20 69 66 28 20 69 73 43 72 65  DWR;.  if( isCre
2f3a0 61 74 65 20 29 20 20 20 20 6f 70 65 6e 46 6c 61  ate )    openFla
2f3b0 67 73 20 7c 3d 20 4f 5f 43 52 45 41 54 3b 0a 20  gs |= O_CREAT;. 
2f3c0 20 69 66 28 20 69 73 45 78 63 6c 75 73 69 76 65   if( isExclusive
2f3d0 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20   ) openFlags |= 
2f3e0 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c  (O_EXCL|O_NOFOLL
2f3f0 4f 57 29 3b 0a 20 20 6f 70 65 6e 46 6c 61 67 73  OW);.  openFlags
2f400 20 7c 3d 20 28 4f 5f 4c 41 52 47 45 46 49 4c 45   |= (O_LARGEFILE
2f410 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 0a 20 20 69  |O_BINARY);..  i
2f420 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 6d  f( fd<0 ){.    m
2f430 6f 64 65 5f 74 20 6f 70 65 6e 4d 6f 64 65 3b 20  ode_t openMode; 
2f440 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f450 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 63  Permissions to c
2f460 72 65 61 74 65 20 66 69 6c 65 20 77 69 74 68 20  reate file with 
2f470 2a 2f 0a 20 20 20 20 75 69 64 5f 74 20 75 69 64  */.    uid_t uid
2f480 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f490 20 20 20 20 20 2f 2a 20 55 73 65 72 69 64 20 66       /* Userid f
2f4a0 6f 72 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  or the file */. 
2f4b0 20 20 20 67 69 64 5f 74 20 67 69 64 3b 20 20 20     gid_t gid;   
2f4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f4d0 20 2f 2a 20 47 72 6f 75 70 69 64 20 66 6f 72 20   /* Groupid for 
2f4e0 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  the file */.    
2f4f0 72 63 20 3d 20 66 69 6e 64 43 72 65 61 74 65 46  rc = findCreateF
2f500 69 6c 65 4d 6f 64 65 28 7a 4e 61 6d 65 2c 20 66  ileMode(zName, f
2f510 6c 61 67 73 2c 20 26 6f 70 65 6e 4d 6f 64 65 2c  lags, &openMode,
2f520 20 26 75 69 64 2c 20 26 67 69 64 29 3b 0a 20 20   &uid, &gid);.  
2f530 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2f540 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  _OK ){.      ass
2f550 65 72 74 28 20 21 70 2d 3e 70 55 6e 75 73 65 64  ert( !p->pUnused
2f560 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
2f570 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
2f580 4f 50 45 4e 5f 57 41 4c 20 7c 7c 20 65 54 79 70  OPEN_WAL || eTyp
2f590 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
2f5a0 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20  AIN_JOURNAL );. 
2f5b0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2f5c0 20 20 20 20 7d 0a 20 20 20 20 66 64 20 3d 20 72      }.    fd = r
2f5d0 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65  obust_open(zName
2f5e0 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65  , openFlags, ope
2f5f0 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 4f 53 54 52  nMode);.    OSTR
2f600 41 43 45 28 28 22 4f 50 45 4e 58 20 20 20 25 2d  ACE(("OPENX   %-
2f610 33 64 20 25 73 20 30 25 6f 5c 6e 22 2c 20 66 64  3d %s 0%o\n", fd
2f620 2c 20 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61  , zName, openFla
2f630 67 73 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74  gs));.    assert
2f640 28 20 21 69 73 45 78 63 6c 75 73 69 76 65 20 7c  ( !isExclusive |
2f650 7c 20 28 6f 70 65 6e 46 6c 61 67 73 20 26 20 4f  | (openFlags & O
2f660 5f 43 52 45 41 54 29 21 3d 30 20 29 3b 0a 20 20  _CREAT)!=0 );.  
2f670 20 20 69 66 28 20 66 64 3c 30 20 26 26 20 65 72    if( fd<0 && er
2f680 72 6e 6f 21 3d 45 49 53 44 49 52 20 26 26 20 69  rno!=EISDIR && i
2f690 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20  sReadWrite ){.  
2f6a0 20 20 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f      /* Failed to
2f6b0 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 66   open the file f
2f6c0 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  or read/write ac
2f6d0 63 65 73 73 2e 20 54 72 79 20 72 65 61 64 2d 6f  cess. Try read-o
2f6e0 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 66 6c  nly. */.      fl
2f6f0 61 67 73 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f  ags &= ~(SQLITE_
2f700 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
2f710 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
2f720 45 29 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c  E);.      openFl
2f730 61 67 73 20 26 3d 20 7e 28 4f 5f 52 44 57 52 7c  ags &= ~(O_RDWR|
2f740 4f 5f 43 52 45 41 54 29 3b 0a 20 20 20 20 20 20  O_CREAT);.      
2f750 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
2f760 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  OPEN_READONLY;. 
2f770 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c       openFlags |
2f780 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20  = O_RDONLY;.    
2f790 20 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31    isReadonly = 1
2f7a0 3b 0a 20 20 20 20 20 20 66 64 20 3d 20 72 6f 62  ;.      fd = rob
2f7b0 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20  ust_open(zName, 
2f7c0 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d  openFlags, openM
2f7d0 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ode);.    }.    
2f7e0 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
2f7f0 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
2f800 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
2f810 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22  PEN_BKPT, "open"
2f820 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
2f830 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68  goto open_finish
2f840 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ed;.    }..    /
2f850 2a 20 49 66 20 74 68 69 73 20 70 72 6f 63 65 73  * If this proces
2f860 73 20 69 73 20 72 75 6e 6e 69 6e 67 20 61 73 20  s is running as 
2f870 72 6f 6f 74 20 61 6e 64 20 69 66 20 63 72 65 61  root and if crea
2f880 74 69 6e 67 20 61 20 6e 65 77 20 72 6f 6c 6c 62  ting a new rollb
2f890 61 63 6b 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  ack.    ** journ
2f8a0 61 6c 20 6f 72 20 57 41 4c 20 66 69 6c 65 2c 20  al or WAL file, 
2f8b0 73 65 74 20 74 68 65 20 6f 77 6e 65 72 73 68 69  set the ownershi
2f8c0 70 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  p of the journal
2f8d0 20 6f 72 20 57 41 4c 20 74 6f 20 62 65 0a 20 20   or WAL to be.  
2f8e0 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 61 73    ** the same as
2f8f0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
2f900 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  tabase..    */. 
2f910 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 28     if( flags & (
2f920 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c  SQLITE_OPEN_WAL|
2f930 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2f940 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20  _JOURNAL) ){.   
2f950 20 20 20 72 6f 62 75 73 74 46 63 68 6f 77 6e 28     robustFchown(
2f960 66 64 2c 20 75 69 64 2c 20 67 69 64 29 3b 0a 20  fd, uid, gid);. 
2f970 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
2f980 74 28 20 66 64 3e 3d 30 20 29 3b 0a 20 20 69 66  t( fd>=0 );.  if
2f990 28 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20  ( pOutFlags ){. 
2f9a0 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20     *pOutFlags = 
2f9b0 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66  flags;.  }..  if
2f9c0 28 20 70 2d 3e 70 55 6e 75 73 65 64 20 29 7b 0a  ( p->pUnused ){.
2f9d0 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 2d 3e      p->pUnused->
2f9e0 66 64 20 3d 20 66 64 3b 0a 20 20 20 20 70 2d 3e  fd = fd;.    p->
2f9f0 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d  pUnused->flags =
2fa00 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69   flags;.  }..  i
2fa10 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a 23  f( isDelete ){.#
2fa20 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
2fa30 20 20 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b    zPath = zName;
2fa40 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53  .#elif defined(S
2fa50 51 4c 49 54 45 5f 55 4e 4c 49 4e 4b 5f 41 46 54  QLITE_UNLINK_AFT
2fa60 45 52 5f 43 4c 4f 53 45 29 0a 20 20 20 20 7a 50  ER_CLOSE).    zP
2fa70 61 74 68 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ath = sqlite3_mp
2fa80 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 4e 61 6d  rintf("%s", zNam
2fa90 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74  e);.    if( zPat
2faa0 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 6f  h==0 ){.      ro
2fab0 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64  bust_close(p, fd
2fac0 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
2fad0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2fae0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23 65  _NOMEM;.    }.#e
2faf0 6c 73 65 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b  lse.    osUnlink
2fb00 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a  (zName);.#endif.
2fb10 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 45    }.#if SQLITE_E
2fb20 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2fb30 59 4c 45 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  YLE.  else{.    
2fb40 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f  p->openFlags = o
2fb50 70 65 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a 23 65  penFlags;.  }.#e
2fb60 6e 64 69 66 0a 0a 20 20 6e 6f 4c 6f 63 6b 20 3d  ndif..  noLock =
2fb70 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
2fb80 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 0a 20 20  PEN_MAIN_DB;..  
2fb90 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
2fba0 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54  PPLE__) || SQLIT
2fbb0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2fbc0 5f 53 54 59 4c 45 0a 20 20 69 66 28 20 66 73 74  _STYLE.  if( fst
2fbd0 61 74 66 73 28 66 64 2c 20 26 66 73 49 6e 66 6f  atfs(fd, &fsInfo
2fbe0 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 73  ) == -1 ){.    s
2fbf0 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 2c  toreLastErrno(p,
2fc00 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 6f 62   errno);.    rob
2fc10 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c  ust_close(p, fd,
2fc20 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
2fc30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
2fc40 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 7d 0a  ERR_ACCESS;.  }.
2fc50 20 20 69 66 20 28 30 20 3d 3d 20 73 74 72 6e 63    if (0 == strnc
2fc60 6d 70 28 22 6d 73 64 6f 73 22 2c 20 66 73 49 6e  mp("msdos", fsIn
2fc70 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c  fo.f_fstypename,
2fc80 20 35 29 29 20 7b 0a 20 20 20 20 28 28 75 6e 69   5)) {.    ((uni
2fc90 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 66  xFile*)pFile)->f
2fca0 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  sFlags |= SQLITE
2fcb0 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f  _FSFLAGS_IS_MSDO
2fcc0 53 3b 0a 20 20 7d 0a 20 20 69 66 20 28 30 20 3d  S;.  }.  if (0 =
2fcd0 3d 20 73 74 72 6e 63 6d 70 28 22 65 78 66 61 74  = strncmp("exfat
2fce0 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79  ", fsInfo.f_fsty
2fcf0 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b 0a 20 20  pename, 5)) {.  
2fd00 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46    ((unixFile*)pF
2fd10 69 6c 65 29 2d 3e 66 73 46 6c 61 67 73 20 7c 3d  ile)->fsFlags |=
2fd20 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f   SQLITE_FSFLAGS_
2fd30 49 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a 23 65  IS_MSDOS;.  }.#e
2fd40 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20 75  ndif..  /* Set u
2fd50 70 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 74  p appropriate ct
2fd60 72 6c 46 6c 61 67 73 20 2a 2f 0a 20 20 69 66 28  rlFlags */.  if(
2fd70 20 69 73 44 65 6c 65 74 65 20 29 20 20 20 20 20   isDelete )     
2fd80 20 20 20 20 20 20 20 20 20 20 20 63 74 72 6c 46             ctrlF
2fd90 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
2fda0 5f 44 45 4c 45 54 45 3b 0a 20 20 69 66 28 20 69  _DELETE;.  if( i
2fdb0 73 52 65 61 64 6f 6e 6c 79 20 29 20 20 20 20 20  sReadonly )     
2fdc0 20 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61           ctrlFla
2fdd0 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 52  gs |= UNIXFILE_R
2fde0 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 6e 6f 4c  DONLY;.  if( noL
2fdf0 6f 63 6b 20 29 20 20 20 20 20 20 20 20 20 20 20  ock )           
2fe00 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73         ctrlFlags
2fe10 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c   |= UNIXFILE_NOL
2fe20 4f 43 4b 3b 0a 20 20 69 66 28 20 73 79 6e 63 44  OCK;.  if( syncD
2fe30 69 72 20 29 20 20 20 20 20 20 20 20 20 20 20 20  ir )            
2fe40 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c       ctrlFlags |
2fe50 3d 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59  = UNIXFILE_DIRSY
2fe60 4e 43 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20  NC;.  if( flags 
2fe70 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  & SQLITE_OPEN_UR
2fe80 49 20 29 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d  I ) ctrlFlags |=
2fe90 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 3b 0a 0a   UNIXFILE_URI;..
2fea0 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
2feb0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2fec0 23 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45  #if SQLITE_PREFE
2fed0 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a  R_PROXY_LOCKING.
2fee0 20 20 69 73 41 75 74 6f 50 72 6f 78 79 20 3d 20    isAutoProxy = 
2fef0 31 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  1;.#endif.  if( 
2ff00 69 73 41 75 74 6f 50 72 6f 78 79 20 26 26 20 28  isAutoProxy && (
2ff10 7a 50 61 74 68 21 3d 4e 55 4c 4c 29 20 26 26 20  zPath!=NULL) && 
2ff20 28 21 6e 6f 4c 6f 63 6b 29 20 26 26 20 70 56 66  (!noLock) && pVf
2ff30 73 2d 3e 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20  s->xOpen ){.    
2ff40 63 68 61 72 20 2a 65 6e 76 66 6f 72 63 65 20 3d  char *envforce =
2ff50 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f   getenv("SQLITE_
2ff60 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b  FORCE_PROXY_LOCK
2ff70 49 4e 47 22 29 3b 0a 20 20 20 20 69 6e 74 20 75  ING");.    int u
2ff80 73 65 50 72 6f 78 79 20 3d 20 30 3b 0a 0a 20 20  seProxy = 0;..  
2ff90 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52 43    /* SQLITE_FORC
2ffa0 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 3d  E_PROXY_LOCKING=
2ffb0 3d 31 20 6d 65 61 6e 73 20 66 6f 72 63 65 20 61  =1 means force a
2ffc0 6c 77 61 79 73 20 75 73 65 20 70 72 6f 78 79 2c  lways use proxy,
2ffd0 20 30 20 6d 65 61 6e 73 20 0a 20 20 20 20 2a 2a   0 means .    **
2ffe0 20 6e 65 76 65 72 20 75 73 65 20 70 72 6f 78 79   never use proxy
2fff0 2c 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 75 73 65  , NULL means use
30000 20 70 72 6f 78 79 20 66 6f 72 20 6e 6f 6e 2d 6c   proxy for non-l
30010 6f 63 61 6c 20 66 69 6c 65 73 20 6f 6e 6c 79 2e  ocal files only.
30020 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 6e 76    */.    if( env
30030 66 6f 72 63 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20  force!=NULL ){. 
30040 20 20 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20       useProxy = 
30050 61 74 6f 69 28 65 6e 76 66 6f 72 63 65 29 3e 30  atoi(envforce)>0
30060 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
30070 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20 21 28     useProxy = !(
30080 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d  fsInfo.f_flags&M
30090 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20 20 20 20 7d  NT_LOCAL);.    }
300a0 0a 20 20 20 20 69 66 28 20 75 73 65 50 72 6f 78  .    if( useProx
300b0 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
300c0 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70  fillInUnixFile(p
300d0 56 66 73 2c 20 66 64 2c 20 70 46 69 6c 65 2c 20  Vfs, fd, pFile, 
300e0 7a 50 61 74 68 2c 20 63 74 72 6c 46 6c 61 67 73  zPath, ctrlFlags
300f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
30100 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30110 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79        rc = proxy
30120 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c  TransformUnixFil
30130 65 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69  e((unixFile*)pFi
30140 6c 65 2c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 20  le, ":auto:");. 
30150 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
30160 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30170 20 20 20 20 20 20 2f 2a 20 55 73 65 20 75 6e 69        /* Use uni
30180 78 43 6c 6f 73 65 20 74 6f 20 63 6c 65 61 6e 20  xClose to clean 
30190 75 70 20 74 68 65 20 72 65 73 6f 75 72 63 65 73  up the resources
301a0 20 61 64 64 65 64 20 69 6e 20 66 69 6c 6c 49 6e   added in fillIn
301b0 55 6e 69 78 46 69 6c 65 20 0a 20 20 20 20 20 20  UnixFile .      
301c0 20 20 20 20 2a 2a 20 61 6e 64 20 63 6c 65 61 72      ** and clear
301d0 20 61 6c 6c 20 74 68 65 20 73 74 72 75 63 74 75   all the structu
301e0 72 65 27 73 20 72 65 66 65 72 65 6e 63 65 73 2e  re's references.
301f0 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20    Specifically, 
30200 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 46  .          ** pF
30210 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 77 69  ile->pMethods wi
30220 6c 6c 20 62 65 20 4e 55 4c 4c 20 73 6f 20 73 71  ll be NULL so sq
30230 6c 69 74 65 33 4f 73 43 6c 6f 73 65 20 77 69 6c  lite3OsClose wil
30240 6c 20 62 65 20 61 20 6e 6f 2d 6f 70 20 0a 20 20  l be a no-op .  
30250 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
30260 20 20 20 20 20 75 6e 69 78 43 6c 6f 73 65 28 70       unixClose(p
30270 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20  File);.         
30280 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
30290 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
302a0 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69      goto open_fi
302b0 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20  nished;.    }.  
302c0 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 63  }.#endif.  .  rc
302d0 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c   = fillInUnixFil
302e0 65 28 70 56 66 73 2c 20 66 64 2c 20 70 46 69 6c  e(pVfs, fd, pFil
302f0 65 2c 20 7a 50 61 74 68 2c 20 63 74 72 6c 46 6c  e, zPath, ctrlFl
30300 61 67 73 29 3b 0a 0a 6f 70 65 6e 5f 66 69 6e 69  ags);..open_fini
30310 73 68 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d  shed:.  if( rc!=
30320 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30330 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
30340 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20 7d 0a 20  >pUnused);.  }. 
30350 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
30360 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
30370 20 66 69 6c 65 20 61 74 20 7a 50 61 74 68 2e 20   file at zPath. 
30380 49 66 20 74 68 65 20 64 69 72 53 79 6e 63 20 61  If the dirSync a
30390 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c  rgument is true,
303a0 20 66 73 79 6e 63 28 29 0a 2a 2a 20 74 68 65 20   fsync().** the 
303b0 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72 20  directory after 
303c0 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c  deleting the fil
303d0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
303e0 20 75 6e 69 78 44 65 6c 65 74 65 28 0a 20 20 73   unixDelete(.  s
303f0 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
30400 73 65 64 2c 20 20 20 20 20 2f 2a 20 56 46 53 20  sed,     /* VFS 
30410 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20  containing this 
30420 61 73 20 74 68 65 20 78 44 65 6c 65 74 65 20 6d  as the xDelete m
30430 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ethod */.  const
30440 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
30450 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
30460 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74  file to be delet
30470 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 53  ed */.  int dirS
30480 79 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20  ync             
30490 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 66 73    /* If true, fs
304a0 79 6e 63 28 29 20 64 69 72 65 63 74 6f 72 79 20  ync() directory 
304b0 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20 66  after deleting f
304c0 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ile */.){.  int 
304d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
304e0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
304f0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53  ER(NotUsed);.  S
30500 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
30510 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
30520 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 69 66  RR_DELETE);.  if
30530 28 20 6f 73 55 6e 6c 69 6e 6b 28 7a 50 61 74 68  ( osUnlink(zPath
30540 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 69  )==(-1) ){.    i
30550 66 28 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54  f( errno==ENOENT
30560 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
30570 20 20 20 20 20 20 20 20 7c 7c 20 6f 73 41 63 63          || osAcc
30580 65 73 73 28 7a 50 61 74 68 2c 30 29 21 3d 30 0a  ess(zPath,0)!=0.
30590 23 65 6e 64 69 66 0a 20 20 20 20 29 7b 0a 20 20  #endif.    ){.  
305a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
305b0 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45  IOERR_DELETE_NOE
305c0 4e 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  NT;.    }else{. 
305d0 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
305e0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
305f0 45 52 52 5f 44 45 4c 45 54 45 2c 20 22 75 6e 6c  ERR_DELETE, "unl
30600 69 6e 6b 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20  ink", zPath);.  
30610 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
30620 63 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  c;.  }.#ifndef S
30630 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49  QLITE_DISABLE_DI
30640 52 53 59 4e 43 0a 20 20 69 66 28 20 28 64 69 72  RSYNC.  if( (dir
30650 53 79 6e 63 20 26 20 31 29 21 3d 30 20 29 7b 0a  Sync & 1)!=0 ){.
30660 20 20 20 20 69 6e 74 20 66 64 3b 0a 20 20 20 20      int fd;.    
30670 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63  rc = osOpenDirec
30680 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 66 64 29  tory(zPath, &fd)
30690 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
306a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 20 4f  LITE_OK ){.#if O
306b0 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 20 20  S_VXWORKS.      
306c0 69 66 28 20 66 73 79 6e 63 28 66 64 29 3d 3d 2d  if( fsync(fd)==-
306d0 31 20 29 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  1 ).#else.      
306e0 69 66 28 20 66 73 79 6e 63 28 66 64 29 20 29 0a  if( fsync(fd) ).
306f0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20  #endif.      {. 
30700 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
30710 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
30720 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 2c  IOERR_DIR_FSYNC,
30730 20 22 66 73 79 6e 63 22 2c 20 7a 50 61 74 68 29   "fsync", zPath)
30740 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
30750 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20  robust_close(0, 
30760 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
30770 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30780 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
30790 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 3b 0a 20  TE_CANTOPEN );. 
307a0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
307b0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  _OK;.    }.  }.#
307c0 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72  endif.  return r
307d0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74  c;.}../*.** Test
307e0 20 74 68 65 20 65 78 69 73 74 65 6e 63 65 20 6f   the existence o
307f0 66 20 6f 72 20 61 63 63 65 73 73 20 70 65 72 6d  f or access perm
30800 69 73 73 69 6f 6e 73 20 6f 66 20 66 69 6c 65 20  issions of file 
30810 7a 50 61 74 68 2e 20 54 68 65 0a 2a 2a 20 74 65  zPath. The.** te
30820 73 74 20 70 65 72 66 6f 72 6d 65 64 20 64 65 70  st performed dep
30830 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75  ends on the valu
30840 65 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a  e of flags:.**.*
30850 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43  *     SQLITE_ACC
30860 45 53 53 5f 45 58 49 53 54 53 3a 20 52 65 74 75  ESS_EXISTS: Retu
30870 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65  rn 1 if the file
30880 20 65 78 69 73 74 73 0a 2a 2a 20 20 20 20 20 53   exists.**     S
30890 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
308a0 44 57 52 49 54 45 3a 20 52 65 74 75 72 6e 20 31  DWRITE: Return 1
308b0 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
308c0 72 65 61 64 20 61 6e 64 20 77 72 69 74 61 62 6c  read and writabl
308d0 65 2e 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  e..**     SQLITE
308e0 5f 41 43 43 45 53 53 5f 52 45 41 44 4f 4e 4c 59  _ACCESS_READONLY
308f0 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  : Return 1 if th
30900 65 20 66 69 6c 65 20 69 73 20 72 65 61 64 61 62  e file is readab
30910 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  le..**.** Otherw
30920 69 73 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f  ise return 0..*/
30930 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
30940 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65  Access(.  sqlite
30950 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
30960 20 20 2f 2a 20 54 68 65 20 56 46 53 20 63 6f 6e    /* The VFS con
30970 74 61 69 6e 69 6e 67 20 74 68 69 73 20 78 41 63  taining this xAc
30980 63 65 73 73 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  cess method */. 
30990 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
309a0 74 68 2c 20 20 20 20 20 20 2f 2a 20 50 61 74 68  th,      /* Path
309b0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20   of the file to 
309c0 65 78 61 6d 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  examine */.  int
309d0 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
309e0 20 20 20 20 20 2f 2a 20 57 68 61 74 20 64 6f 20       /* What do 
309f0 77 65 20 77 61 6e 74 20 74 6f 20 6c 65 61 72 6e  we want to learn
30a00 20 61 62 6f 75 74 20 74 68 65 20 7a 50 61 74 68   about the zPath
30a10 20 66 69 6c 65 3f 20 2a 2f 0a 20 20 69 6e 74 20   file? */.  int 
30a20 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20 20 20  *pResOut        
30a30 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73      /* Write res
30a40 75 6c 74 20 62 6f 6f 6c 65 61 6e 20 68 65 72 65  ult boolean here
30a50 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f   */.){.  UNUSED_
30a60 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
30a70 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d);.  SimulateIO
30a80 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
30a90 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
30aa0 53 3b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  S; );.  assert( 
30ab0 70 52 65 73 4f 75 74 21 3d 30 20 29 3b 0a 0a 20  pResOut!=0 );.. 
30ac0 20 2f 2a 20 54 68 65 20 73 70 65 63 20 73 61 79   /* The spec say
30ad0 73 20 74 68 65 72 65 20 61 72 65 20 74 68 72 65  s there are thre
30ae0 65 20 70 6f 73 73 69 62 6c 65 20 76 61 6c 75 65  e possible value
30af0 73 20 66 6f 72 20 66 6c 61 67 73 2e 20 20 42 75  s for flags.  Bu
30b00 74 20 6f 6e 6c 79 0a 20 20 2a 2a 20 74 77 6f 20  t only.  ** two 
30b10 6f 66 20 74 68 65 6d 20 61 72 65 20 61 63 74 75  of them are actu
30b20 61 6c 6c 79 20 75 73 65 64 20 2a 2f 0a 20 20 61  ally used */.  a
30b30 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 53 51  ssert( flags==SQ
30b40 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
30b50 54 53 20 7c 7c 20 66 6c 61 67 73 3d 3d 53 51 4c  TS || flags==SQL
30b60 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57  ITE_ACCESS_READW
30b70 52 49 54 45 20 29 3b 0a 0a 20 20 69 66 28 20 66  RITE );..  if( f
30b80 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43  lags==SQLITE_ACC
30b90 45 53 53 5f 45 58 49 53 54 53 20 29 7b 0a 20 20  ESS_EXISTS ){.  
30ba0 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
30bb0 66 3b 0a 20 20 20 20 2a 70 52 65 73 4f 75 74 20  f;.    *pResOut 
30bc0 3d 20 28 30 3d 3d 6f 73 53 74 61 74 28 7a 50 61  = (0==osStat(zPa
30bd0 74 68 2c 20 26 62 75 66 29 20 26 26 20 62 75 66  th, &buf) && buf
30be0 2e 73 74 5f 73 69 7a 65 3e 30 29 3b 0a 20 20 7d  .st_size>0);.  }
30bf0 65 6c 73 65 7b 0a 20 20 20 20 2a 70 52 65 73 4f  else{.    *pResO
30c00 75 74 20 3d 20 6f 73 41 63 63 65 73 73 28 7a 50  ut = osAccess(zP
30c10 61 74 68 2c 20 57 5f 4f 4b 7c 52 5f 4f 4b 29 3d  ath, W_OK|R_OK)=
30c20 3d 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  =0;.  }.  return
30c30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
30c40 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c  /*.** Turn a rel
30c50 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69  ative pathname i
30c60 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e  nto a full pathn
30c70 61 6d 65 2e 20 54 68 65 20 72 65 6c 61 74 69 76  ame. The relativ
30c80 65 20 70 61 74 68 0a 2a 2a 20 69 73 20 73 74 6f  e path.** is sto
30c90 72 65 64 20 61 73 20 61 20 6e 75 6c 2d 74 65 72  red as a nul-ter
30ca0 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 69  minated string i
30cb0 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  n the buffer poi
30cc0 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a 20 7a 50  nted to by.** zP
30cd0 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74  ath. .**.** zOut
30ce0 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66   points to a buf
30cf0 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20  fer of at least 
30d00 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61  sqlite3_vfs.mxPa
30d10 74 68 6e 61 6d 65 20 62 79 74 65 73 20 0a 2a 2a  thname bytes .**
30d20 20 28 69 6e 20 74 68 69 73 20 63 61 73 65 2c 20   (in this case, 
30d30 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 62 79 74  MAX_PATHNAME byt
30d40 65 73 29 2e 20 54 68 65 20 66 75 6c 6c 2d 70 61  es). The full-pa
30d50 74 68 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  th is written to
30d60 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72 20  .** this buffer 
30d70 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
30d80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
30d90 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  unixFullPathname
30da0 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
30db0 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20  *pVfs,          
30dc0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
30dd0 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  vfs object */.  
30de0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
30df0 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  h,            /*
30e00 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 69   Possibly relati
30e10 76 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f  ve input path */
30e20 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20 20 20 20  .  int nOut,    
30e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e40 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70   /* Size of outp
30e50 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 79 74  ut buffer in byt
30e60 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f  es */.  char *zO
30e70 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ut              
30e80 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
30e90 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 69  buffer */.){.  i
30ea0 6e 74 20 6e 42 79 74 65 3b 0a 0a 20 20 2f 2a 20  nt nByte;..  /* 
30eb0 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75  It's odd to simu
30ec0 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72  late an io-error
30ed0 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c   here, but reall
30ee0 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20  y this is just. 
30ef0 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f   ** using the io
30f00 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75  -error infrastru
30f10 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68  cture to test th
30f20 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65  at SQLite handle
30f30 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  s this.  ** func
30f40 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68  tion failing. Th
30f50 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c  is function coul
30f60 64 20 66 61 69 6c 20 69 66 2c 20 66 6f 72 20 65  d fail if, for e
30f70 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a  xample, the.  **
30f80 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67   current working
30f90 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
30fa0 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20  een unlinked..  
30fb0 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  */.  SimulateIOE
30fc0 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
30fd0 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20  ITE_ERROR );..  
30fe0 61 73 73 65 72 74 28 20 70 56 66 73 2d 3e 6d 78  assert( pVfs->mx
30ff0 50 61 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50 41  Pathname==MAX_PA
31000 54 48 4e 41 4d 45 20 29 3b 0a 20 20 55 4e 55 53  THNAME );.  UNUS
31010 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
31020 73 29 3b 0a 0a 20 20 2f 2a 20 41 74 74 65 6d 70  s);..  /* Attemp
31030 74 20 74 6f 20 72 65 73 6f 6c 76 65 20 74 68 65  t to resolve the
31040 20 70 61 74 68 20 61 73 20 69 66 20 69 74 20 77   path as if it w
31050 65 72 65 20 61 20 73 79 6d 62 6f 6c 69 63 20 6c  ere a symbolic l
31060 69 6e 6b 2e 20 49 66 20 69 74 20 69 73 0a 20 20  ink. If it is.  
31070 2a 2a 20 61 20 73 79 6d 62 6f 6c 69 63 20 6c 69  ** a symbolic li
31080 6e 6b 2c 20 74 68 65 20 72 65 73 6f 6c 76 65 64  nk, the resolved
31090 20 70 61 74 68 20 69 73 20 73 74 6f 72 65 64 20   path is stored 
310a0 69 6e 20 62 75 66 66 65 72 20 7a 4f 75 74 5b 5d  in buffer zOut[]
310b0 2e 20 4f 72 2c 20 69 66 0a 20 20 2a 2a 20 74 68  . Or, if.  ** th
310c0 65 20 69 64 65 6e 74 69 66 69 65 64 20 66 69 6c  e identified fil
310d0 65 20 69 73 20 6e 6f 74 20 61 20 73 79 6d 62 6f  e is not a symbo
310e0 6c 69 63 20 6c 69 6e 6b 20 6f 72 20 64 6f 65 73  lic link or does
310f0 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e   not exist, then
31100 0a 20 20 2a 2a 20 7a 50 61 74 68 20 69 73 20 63  .  ** zPath is c
31110 6f 70 69 65 64 20 64 69 72 65 63 74 6c 79 20 69  opied directly i
31120 6e 74 6f 20 7a 4f 75 74 2e 20 45 69 74 68 65 72  nto zOut. Either
31130 20 77 61 79 2c 20 6e 42 79 74 65 20 69 73 20 6c   way, nByte is l
31140 65 66 74 20 73 65 74 20 74 6f 0a 20 20 2a 2a 20  eft set to.  ** 
31150 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
31160 73 74 72 69 6e 67 20 63 6f 70 69 65 64 20 69 6e  string copied in
31170 74 6f 20 7a 4f 75 74 5b 5d 20 69 6e 20 62 79 74  to zOut[] in byt
31180 65 73 2e 20 20 2a 2f 0a 20 20 6e 42 79 74 65 20  es.  */.  nByte 
31190 3d 20 6f 73 52 65 61 64 6c 69 6e 6b 28 7a 50 61  = osReadlink(zPa
311a0 74 68 2c 20 7a 4f 75 74 2c 20 6e 4f 75 74 2d 31  th, zOut, nOut-1
311b0 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3c 30  );.  if( nByte<0
311c0 20 29 7b 0a 20 20 20 20 69 66 28 20 65 72 72 6e   ){.    if( errn
311d0 6f 21 3d 45 49 4e 56 41 4c 20 26 26 20 65 72 72  o!=EINVAL && err
311e0 6e 6f 21 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20 20  no!=ENOENT ){.  
311f0 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c      return unixL
31200 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
31210 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 72  ANTOPEN_BKPT, "r
31220 65 61 64 6c 69 6e 6b 22 2c 20 7a 50 61 74 68 29  eadlink", zPath)
31230 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
31240 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75  te3_snprintf(nOu
31250 74 2c 20 7a 4f 75 74 2c 20 22 25 73 22 2c 20 7a  t, zOut, "%s", z
31260 50 61 74 68 29 3b 0a 20 20 20 20 6e 42 79 74 65  Path);.    nByte
31270 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
31280 33 30 28 7a 4f 75 74 29 3b 0a 20 20 7d 65 6c 73  30(zOut);.  }els
31290 65 7b 0a 20 20 20 20 7a 4f 75 74 5b 6e 42 79 74  e{.    zOut[nByt
312a0 65 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 0a  e] = '\0';.  }..
312b0 20 20 2f 2a 20 49 66 20 62 75 66 66 65 72 20 7a    /* If buffer z
312c0 4f 75 74 5b 5d 20 6e 6f 77 20 63 6f 6e 74 61 69  Out[] now contai
312d0 6e 73 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 70  ns an absolute p
312e0 61 74 68 20 74 68 65 72 65 20 69 73 20 6e 6f 74  ath there is not
312f0 68 69 6e 67 20 6d 6f 72 65 0a 20 20 2a 2a 20 74  hing more.  ** t
31300 6f 20 64 6f 2e 20 49 66 20 69 74 20 63 6f 6e 74  o do. If it cont
31310 61 69 6e 73 20 61 20 72 65 6c 61 74 69 76 65 20  ains a relative 
31320 70 61 74 68 2c 20 64 6f 20 74 68 65 20 66 6f 6c  path, do the fol
31330 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a  lowing:.  **.  *
31340 2a 20 20 20 2a 20 6d 6f 76 65 20 74 68 65 20 72  *   * move the r
31350 65 6c 61 74 69 76 65 20 70 61 74 68 20 73 74 72  elative path str
31360 69 6e 67 20 73 6f 20 74 68 61 74 20 69 74 20 69  ing so that it i
31370 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
31380 74 68 0a 20 20 2a 2a 20 20 20 20 20 7a 4f 75 74  th.  **     zOut
31390 5b 5d 20 62 75 66 66 65 72 2e 0a 20 20 2a 2a 20  [] buffer..  ** 
313a0 20 20 2a 20 43 61 6c 6c 20 67 65 74 63 77 64 28    * Call getcwd(
313b0 29 20 74 6f 20 72 65 61 64 20 74 68 65 20 70 61  ) to read the pa
313c0 74 68 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  th of the curren
313d0 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74  t working direct
313e0 6f 72 79 20 0a 20 20 2a 2a 20 20 20 20 20 69 6e  ory .  **     in
313f0 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
31400 74 68 65 20 7a 4f 75 74 5b 5d 20 62 75 66 66 65  the zOut[] buffe
31410 72 2e 0a 20 20 2a 2a 20 20 20 2a 20 41 70 70 65  r..  **   * Appe
31420 6e 64 20 61 20 27 2f 27 20 63 68 61 72 61 63 74  nd a '/' charact
31430 65 72 20 74 6f 20 74 68 65 20 63 77 64 20 73 74  er to the cwd st
31440 72 69 6e 67 20 61 6e 64 20 6d 6f 76 65 20 74 68  ring and move th
31450 65 20 0a 20 20 2a 2a 20 20 20 20 20 72 65 6c 61  e .  **     rela
31460 74 69 76 65 20 70 61 74 68 20 62 61 63 6b 20 77  tive path back w
31470 69 74 68 69 6e 20 74 68 65 20 62 75 66 66 65 72  ithin the buffer
31480 20 73 6f 20 74 68 61 74 20 69 74 20 69 6d 6d 65   so that it imme
31490 64 69 61 74 65 6c 79 20 0a 20 20 2a 2a 20 20 20  diately .  **   
314a0 20 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 27 2f    follows the '/
314b0 27 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  '..  **.  ** Thi
314c0 73 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65  s code is writte
314d0 6e 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65  n so that if the
314e0 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
314f0 74 68 65 20 43 57 44 20 61 6e 64 20 72 65 6c 61  the CWD and rela
31500 74 69 76 65 0a 20 20 2a 2a 20 70 61 74 68 20 61  tive.  ** path a
31510 72 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  re larger than t
31520 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 73 69 7a  he allocated siz
31530 65 20 6f 66 20 7a 4f 75 74 5b 5d 20 74 68 65 20  e of zOut[] the 
31540 43 57 44 20 69 73 20 73 69 6c 65 6e 74 6c 79 0a  CWD is silently.
31550 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74    ** truncated t
31560 6f 20 6d 61 6b 65 20 69 74 20 66 69 74 2e 20 54  o make it fit. T
31570 68 69 73 20 69 73 20 4f 6b 2c 20 61 73 20 53 51  his is Ok, as SQ
31580 4c 69 74 65 20 72 65 66 75 73 65 73 20 74 6f 20  Lite refuses to 
31590 6f 70 65 6e 20 61 6e 79 0a 20 20 2a 2a 20 66 69  open any.  ** fi
315a0 6c 65 20 66 6f 72 20 77 68 69 63 68 20 74 68 69  le for which thi
315b0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
315c0 6e 73 20 61 20 66 75 6c 6c 20 70 61 74 68 20 6c  ns a full path l
315d0 61 72 67 65 72 20 74 68 61 6e 20 28 6e 4f 75 74  arger than (nOut
315e0 2d 38 29 0a 20 20 2a 2a 20 62 79 74 65 73 20 69  -8).  ** bytes i
315f0 6e 20 73 69 7a 65 2e 20 20 2a 2f 0a 20 20 74 65  n size.  */.  te
31600 73 74 63 61 73 65 28 20 6e 42 79 74 65 3d 3d 6e  stcase( nByte==n
31610 4f 75 74 2d 35 20 29 3b 0a 20 20 74 65 73 74 63  Out-5 );.  testc
31620 61 73 65 28 20 6e 42 79 74 65 3d 3d 6e 4f 75 74  ase( nByte==nOut
31630 2d 34 20 29 3b 0a 20 20 69 66 28 20 7a 4f 75 74  -4 );.  if( zOut
31640 5b 30 5d 21 3d 27 2f 27 20 26 26 20 6e 42 79 74  [0]!='/' && nByt
31650 65 3c 6e 4f 75 74 2d 34 20 29 7b 0a 20 20 20 20  e<nOut-4 ){.    
31660 69 6e 74 20 6e 43 77 64 3b 0a 20 20 20 20 69 6e  int nCwd;.    in
31670 74 20 6e 52 65 6d 20 3d 20 6e 4f 75 74 2d 6e 42  t nRem = nOut-nB
31680 79 74 65 2d 31 3b 0a 20 20 20 20 6d 65 6d 6d 6f  yte-1;.    memmo
31690 76 65 28 26 7a 4f 75 74 5b 6e 52 65 6d 5d 2c 20  ve(&zOut[nRem], 
316a0 7a 4f 75 74 2c 20 6e 42 79 74 65 2b 31 29 3b 0a  zOut, nByte+1);.
316b0 20 20 20 20 7a 4f 75 74 5b 6e 52 65 6d 2d 31 5d      zOut[nRem-1]
316c0 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 69 66 28   = '\0';.    if(
316d0 20 6f 73 47 65 74 63 77 64 28 7a 4f 75 74 2c 20   osGetcwd(zOut, 
316e0 6e 52 65 6d 2d 31 29 3d 3d 30 20 29 7b 0a 20 20  nRem-1)==0 ){.  
316f0 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c      return unixL
31700 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
31710 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 67  ANTOPEN_BKPT, "g
31720 65 74 63 77 64 22 2c 20 7a 50 61 74 68 29 3b 0a  etcwd", zPath);.
31730 20 20 20 20 7d 0a 20 20 20 20 6e 43 77 64 20 3d      }.    nCwd =
31740 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
31750 28 7a 4f 75 74 29 3b 0a 20 20 20 20 61 73 73 65  (zOut);.    asse
31760 72 74 28 20 6e 43 77 64 3c 3d 6e 52 65 6d 2d 31  rt( nCwd<=nRem-1
31770 20 29 3b 0a 20 20 20 20 7a 4f 75 74 5b 6e 43 77   );.    zOut[nCw
31780 64 5d 20 3d 20 27 2f 27 3b 0a 20 20 20 20 6d 65  d] = '/';.    me
31790 6d 6d 6f 76 65 28 26 7a 4f 75 74 5b 6e 43 77 64  mmove(&zOut[nCwd
317a0 2b 31 5d 2c 20 26 7a 4f 75 74 5b 6e 52 65 6d 5d  +1], &zOut[nRem]
317b0 2c 20 6e 42 79 74 65 2b 31 29 3b 0a 20 20 7d 0a  , nByte+1);.  }.
317c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
317d0 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  _OK;.}...#ifndef
317e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
317f0 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a  D_EXTENSION./*.*
31800 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72  * Interfaces for
31810 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65   opening a share
31820 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69  d library, findi
31830 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a  ng entry points.
31840 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73 68  ** within the sh
31850 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e  ared library, an
31860 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68  d closing the sh
31870 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f  ared library..*/
31880 0a 23 69 6e 63 6c 75 64 65 20 3c 64 6c 66 63 6e  .#include <dlfcn
31890 2e 68 3e 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .h>.static void 
318a0 2a 75 6e 69 78 44 6c 4f 70 65 6e 28 73 71 6c 69  *unixDlOpen(sqli
318b0 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
318c0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
318d0 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 55 4e 55 53  ilename){.  UNUS
318e0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
318f0 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
31900 64 6c 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65  dlopen(zFilename
31910 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c  , RTLD_NOW | RTL
31920 44 5f 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a  D_GLOBAL);.}../*
31930 0a 2a 2a 20 53 51 4c 69 74 65 20 63 61 6c 6c 73  .** SQLite calls
31940 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
31950 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
31960 20 61 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 44   a call to unixD
31970 6c 53 79 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e 69  lSym() or.** uni
31980 78 44 6c 4f 70 65 6e 28 29 20 66 61 69 6c 73 20  xDlOpen() fails 
31990 28 72 65 74 75 72 6e 73 20 61 20 6e 75 6c 6c 20  (returns a null 
319a0 70 6f 69 6e 74 65 72 29 2e 20 49 66 20 61 20 6d  pointer). If a m
319b0 6f 72 65 20 64 65 74 61 69 6c 65 64 20 65 72 72  ore detailed err
319c0 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65 20 69 73  or.** message is
319d0 20 61 76 61 69 6c 61 62 6c 65 2c 20 69 74 20 69   available, it i
319e0 73 20 77 72 69 74 74 65 6e 20 74 6f 20 7a 42 75  s written to zBu
319f0 66 4f 75 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f  fOut. If no erro
31a00 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 73 20  r message.** is 
31a10 61 76 61 69 6c 61 62 6c 65 2c 20 7a 42 75 66 4f  available, zBufO
31a20 75 74 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64  ut is left unmod
31a30 69 66 69 65 64 20 61 6e 64 20 53 51 4c 69 74 65  ified and SQLite
31a40 20 75 73 65 73 20 61 20 64 65 66 61 75 6c 74 0a   uses a default.
31a50 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ** error message
31a60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
31a70 20 75 6e 69 78 44 6c 45 72 72 6f 72 28 73 71 6c   unixDlError(sql
31a80 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
31a90 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  d, int nBuf, cha
31aa0 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 63  r *zBufOut){.  c
31ab0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 3b  onst char *zErr;
31ac0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
31ad0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
31ae0 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
31af0 3b 0a 20 20 7a 45 72 72 20 3d 20 64 6c 65 72 72  ;.  zErr = dlerr
31b00 6f 72 28 29 3b 0a 20 20 69 66 28 20 7a 45 72 72  or();.  if( zErr
31b10 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
31b20 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a  snprintf(nBuf, z
31b30 42 75 66 4f 75 74 2c 20 22 25 73 22 2c 20 7a 45  BufOut, "%s", zE
31b40 72 72 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c  rr);.  }.  unixL
31b50 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 73  eaveMutex();.}.s
31b60 74 61 74 69 63 20 76 6f 69 64 20 28 2a 75 6e 69  tatic void (*uni
31b70 78 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76  xDlSym(sqlite3_v
31b80 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69  fs *NotUsed, voi
31b90 64 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  d *p, const char
31ba0 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20  *zSym))(void){. 
31bb0 20 2f 2a 20 0a 20 20 2a 2a 20 47 43 43 20 77 69   /* .  ** GCC wi
31bc0 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72  th -pedantic-err
31bd0 6f 72 73 20 73 61 79 73 20 74 68 61 74 20 43 39  ors says that C9
31be0 30 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77  0 does not allow
31bf0 20 61 20 76 6f 69 64 2a 20 74 6f 20 62 65 0a 20   a void* to be. 
31c00 20 2a 2a 20 63 61 73 74 20 69 6e 74 6f 20 61 20   ** cast into a 
31c10 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
31c20 63 74 69 6f 6e 2e 20 20 41 6e 64 20 79 65 74 20  ction.  And yet 
31c30 74 68 65 20 6c 69 62 72 61 72 79 20 64 6c 73 79  the library dlsy
31c40 6d 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a  m() routine.  **
31c50 20 72 65 74 75 72 6e 73 20 61 20 76 6f 69 64 2a   returns a void*
31c60 20 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79   which is really
31c70 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
31c80 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 20 68 6f  function.  So ho
31c90 77 20 64 6f 20 77 65 0a 20 20 2a 2a 20 75 73 65  w do we.  ** use
31ca0 20 64 6c 73 79 6d 28 29 20 77 69 74 68 20 2d 70   dlsym() with -p
31cb0 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 3f 0a  edantic-errors?.
31cc0 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 72 69 61 62    **.  ** Variab
31cd0 6c 65 20 78 20 62 65 6c 6f 77 20 69 73 20 64 65  le x below is de
31ce0 66 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f  fined to be a po
31cf0 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
31d00 69 6f 6e 20 74 61 6b 69 6e 67 0a 20 20 2a 2a 20  ion taking.  ** 
31d10 70 61 72 61 6d 65 74 65 72 73 20 76 6f 69 64 2a  parameters void*
31d20 20 61 6e 64 20 63 6f 6e 73 74 20 63 68 61 72 2a   and const char*
31d30 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61   and returning a
31d40 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75   pointer to a fu
31d50 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 57 65 20  nction..  ** We 
31d60 69 6e 69 74 69 61 6c 69 7a 65 20 78 20 62 79 20  initialize x by 
31d70 61 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20 70  assigning it a p
31d80 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64 6c  ointer to the dl
31d90 73 79 6d 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  sym() function..
31da0 20 20 2a 2a 20 28 54 68 61 74 20 61 73 73 69 67    ** (That assig
31db0 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 73 20 61  nment requires a
31dc0 20 63 61 73 74 2e 29 20 20 54 68 65 6e 20 77 65   cast.)  Then we
31dd0 20 63 61 6c 6c 20 74 68 65 20 66 75 6e 63 74 69   call the functi
31de0 6f 6e 20 74 68 61 74 0a 20 20 2a 2a 20 78 20 70  on that.  ** x p
31df0 6f 69 6e 74 73 20 74 6f 2e 20 20 0a 20 20 2a 2a  oints to.  .  **
31e00 0a 20 20 2a 2a 20 54 68 69 73 20 77 6f 72 6b 2d  .  ** This work-
31e10 61 72 6f 75 6e 64 20 69 73 20 75 6e 6c 69 6b 65  around is unlike
31e20 6c 79 20 74 6f 20 77 6f 72 6b 20 63 6f 72 72 65  ly to work corre
31e30 63 74 6c 79 20 6f 6e 20 61 6e 79 20 73 79 73 74  ctly on any syst
31e40 65 6d 20 77 68 65 72 65 0a 20 20 2a 2a 20 79 6f  em where.  ** yo
31e50 75 20 72 65 61 6c 6c 79 20 63 61 6e 6e 6f 74 20  u really cannot 
31e60 63 61 73 74 20 61 20 66 75 6e 63 74 69 6f 6e 20  cast a function 
31e70 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20 76 6f 69  pointer into voi
31e80 64 2a 2e 20 20 42 75 74 20 74 68 65 6e 2c 20 6f  d*.  But then, o
31e90 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72  n the.  ** other
31ea0 20 68 61 6e 64 2c 20 64 6c 73 79 6d 28 29 20 77   hand, dlsym() w
31eb0 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  ill not work on 
31ec0 73 75 63 68 20 61 20 73 79 73 74 65 6d 20 65 69  such a system ei
31ed0 74 68 65 72 2c 20 73 6f 20 77 65 20 68 61 76 65  ther, so we have
31ee0 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 61 6c 6c 79  .  ** not really
31ef0 20 6c 6f 73 74 20 61 6e 79 74 68 69 6e 67 2e 0a   lost anything..
31f00 20 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 28 2a    */.  void (*(*
31f10 78 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63  x)(void*,const c
31f20 68 61 72 2a 29 29 28 76 6f 69 64 29 3b 0a 20 20  har*))(void);.  
31f30 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
31f40 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 78 20 3d  (NotUsed);.  x =
31f50 20 28 76 6f 69 64 28 2a 28 2a 29 28 76 6f 69 64   (void(*(*)(void
31f60 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 28  *,const char*))(
31f70 76 6f 69 64 29 29 64 6c 73 79 6d 3b 0a 20 20 72  void))dlsym;.  r
31f80 65 74 75 72 6e 20 28 2a 78 29 28 70 2c 20 7a 53  eturn (*x)(p, zS
31f90 79 6d 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ym);.}.static vo
31fa0 69 64 20 75 6e 69 78 44 6c 43 6c 6f 73 65 28 73  id unixDlClose(s
31fb0 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
31fc0 73 65 64 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64  sed, void *pHand
31fd0 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  le){.  UNUSED_PA
31fe0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
31ff0 3b 0a 20 20 64 6c 63 6c 6f 73 65 28 70 48 61 6e  ;.  dlclose(pHan
32000 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a  dle);.}.#else /*
32010 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   if SQLITE_OMIT_
32020 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69  LOAD_EXTENSION i
32030 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20  s defined: */.  
32040 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 4f 70  #define unixDlOp
32050 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20  en  0.  #define 
32060 75 6e 69 78 44 6c 45 72 72 6f 72 20 30 0a 20 20  unixDlError 0.  
32070 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 53 79  #define unixDlSy
32080 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20  m   0.  #define 
32090 75 6e 69 78 44 6c 43 6c 6f 73 65 20 30 0a 23 65  unixDlClose 0.#e
320a0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ndif../*.** Writ
320b0 65 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20  e nBuf bytes of 
320c0 72 61 6e 64 6f 6d 20 64 61 74 61 20 74 6f 20 74  random data to t
320d0 68 65 20 73 75 70 70 6c 69 65 64 20 62 75 66 66  he supplied buff
320e0 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74  er zBuf..*/.stat
320f0 69 63 20 69 6e 74 20 75 6e 69 78 52 61 6e 64 6f  ic int unixRando
32100 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66  mness(sqlite3_vf
32110 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  s *NotUsed, int 
32120 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
32130 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
32140 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
32150 20 20 61 73 73 65 72 74 28 28 73 69 7a 65 5f 74    assert((size_t
32160 29 6e 42 75 66 3e 3d 28 73 69 7a 65 6f 66 28 74  )nBuf>=(sizeof(t
32170 69 6d 65 5f 74 29 2b 73 69 7a 65 6f 66 28 69 6e  ime_t)+sizeof(in
32180 74 29 29 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 68  t)));..  /* We h
32190 61 76 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ave to initializ
321a0 65 20 7a 42 75 66 20 74 6f 20 70 72 65 76 65 6e  e zBuf to preven
321b0 74 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20  t valgrind from 
321c0 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65  reporting.  ** e
321d0 72 72 6f 72 73 2e 20 20 54 68 65 20 72 65 70 6f  rrors.  The repo
321e0 72 74 73 20 69 73 73 75 65 64 20 62 79 20 76 61  rts issued by va
321f0 6c 67 72 69 6e 64 20 61 72 65 20 69 6e 63 6f 72  lgrind are incor
32200 72 65 63 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a  rect - we would.
32210 20 20 2a 2a 20 70 72 65 66 65 72 20 74 68 61 74    ** prefer that
32220 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20   the randomness 
32230 62 65 20 69 6e 63 72 65 61 73 65 64 20 62 79 20  be increased by 
32240 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66 20 74 68  making use of th
32250 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c  e.  ** uninitial
32260 69 7a 65 64 20 73 70 61 63 65 20 69 6e 20 7a 42  ized space in zB
32270 75 66 20 2d 20 62 75 74 20 76 61 6c 67 72 69 6e  uf - but valgrin
32280 64 20 65 72 72 6f 72 73 20 74 65 6e 64 20 74 6f  d errors tend to
32290 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65   worry.  ** some
322a0 20 75 73 65 72 73 2e 20 20 52 61 74 68 65 72 20   users.  Rather 
322b0 74 68 61 6e 20 61 72 67 75 65 2c 20 69 74 20 73  than argue, it s
322c0 65 65 6d 73 20 65 61 73 69 65 72 20 6a 75 73 74  eems easier just
322d0 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20   to initialize. 
322e0 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20 61 72   ** the whole ar
322f0 72 61 79 20 61 6e 64 20 73 69 6c 65 6e 63 65 20  ray and silence 
32300 76 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e 20 69  valgrind, even i
32310 66 20 74 68 61 74 20 6d 65 61 6e 73 20 6c 65 73  f that means les
32320 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a  s randomness.  *
32330 2a 20 69 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20  * in the random 
32340 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  seed..  **.  ** 
32350 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e  When testing, in
32360 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b  itializing zBuf[
32370 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c  ] to zero is all
32380 20 77 65 20 64 6f 2e 20 20 54 68 61 74 20 6d 65   we do.  That me
32390 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 77 65  ans.  ** that we
323a0 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20   always use the 
323b0 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62  same random numb
323c0 65 72 20 73 65 71 75 65 6e 63 65 2e 20 20 54 68  er sequence.  Th
323d0 69 73 20 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a  is makes the.  *
323e0 2a 20 74 65 73 74 73 20 72 65 70 65 61 74 61 62  * tests repeatab
323f0 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65  le..  */.  memse
32400 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29  t(zBuf, 0, nBuf)
32410 3b 0a 20 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69  ;.  randomnessPi
32420 64 20 3d 20 6f 73 47 65 74 70 69 64 28 30 29 3b  d = osGetpid(0);
32430 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28    .#if !defined(
32440 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20  SQLITE_TEST) && 
32450 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
32460 4f 4d 49 54 5f 52 41 4e 44 4f 4d 4e 45 53 53 29  OMIT_RANDOMNESS)
32470 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 66 64 2c  .  {.    int fd,
32480 20 67 6f 74 3b 0a 20 20 20 20 66 64 20 3d 20 72   got;.    fd = r
32490 6f 62 75 73 74 5f 6f 70 65 6e 28 22 2f 64 65 76  obust_open("/dev
324a0 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f  /urandom", O_RDO
324b0 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  NLY, 0);.    if(
324c0 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 74   fd<0 ){.      t
324d0 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20 20 20 74  ime_t t;.      t
324e0 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 20 20 6d  ime(&t);.      m
324f0 65 6d 63 70 79 28 7a 42 75 66 2c 20 26 74 2c 20  emcpy(zBuf, &t, 
32500 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20 20 20  sizeof(t));.    
32510 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 73    memcpy(&zBuf[s
32520 69 7a 65 6f 66 28 74 29 5d 2c 20 26 72 61 6e 64  izeof(t)], &rand
32530 6f 6d 6e 65 73 73 50 69 64 2c 20 73 69 7a 65 6f  omnessPid, sizeo
32540 66 28 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 29  f(randomnessPid)
32550 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
32560 20 73 69 7a 65 6f 66 28 74 29 2b 73 69 7a 65 6f   sizeof(t)+sizeo
32570 66 28 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 29  f(randomnessPid)
32580 3c 3d 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29  <=(size_t)nBuf )
32590 3b 0a 20 20 20 20 20 20 6e 42 75 66 20 3d 20 73  ;.      nBuf = s
325a0 69 7a 65 6f 66 28 74 29 20 2b 20 73 69 7a 65 6f  izeof(t) + sizeo
325b0 66 28 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 29  f(randomnessPid)
325c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
325d0 20 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 52     do{ got = osR
325e0 65 61 64 28 66 64 2c 20 7a 42 75 66 2c 20 6e 42  ead(fd, zBuf, nB
325f0 75 66 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74  uf); }while( got
32600 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
32610 54 52 20 29 3b 0a 20 20 20 20 20 20 72 6f 62 75  TR );.      robu
32620 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20  st_close(0, fd, 
32630 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d  __LINE__);.    }
32640 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
32650 74 75 72 6e 20 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f  turn nBuf;.}.../
32660 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61  *.** Sleep for a
32670 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20   little while.  
32680 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e  Return the amoun
32690 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e  t of time slept.
326a0 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74  .** The argument
326b0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
326c0 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 77  f microseconds w
326d0 65 20 77 61 6e 74 20 74 6f 20 73 6c 65 65 70 2e  e want to sleep.
326e0 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
326f0 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62  alue is the numb
32700 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e  er of microsecon
32710 64 73 20 6f 66 20 73 6c 65 65 70 20 61 63 74 75  ds of sleep actu
32720 61 6c 6c 79 0a 2a 2a 20 72 65 71 75 65 73 74 65  ally.** requeste
32730 64 20 66 72 6f 6d 20 74 68 65 20 75 6e 64 65 72  d from the under
32740 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20  lying operating 
32750 73 79 73 74 65 6d 2c 20 61 20 6e 75 6d 62 65 72  system, a number
32760 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20   which.** might 
32770 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
32780 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
32790 61 72 67 75 6d 65 6e 74 2c 20 62 75 74 20 6e 6f  argument, but no
327a0 74 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 20 74  t less.** than t
327b0 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  he argument..*/.
327c0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
327d0 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73  leep(sqlite3_vfs
327e0 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6d   *NotUsed, int m
327f0 69 63 72 6f 73 65 63 6f 6e 64 73 29 7b 0a 23 69  icroseconds){.#i
32800 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73  f OS_VXWORKS.  s
32810 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 73  truct timespec s
32820 70 3b 0a 0a 20 20 73 70 2e 74 76 5f 73 65 63 20  p;..  sp.tv_sec 
32830 3d 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 2f  = microseconds /
32840 20 31 30 30 30 30 30 30 3b 0a 20 20 73 70 2e 74   1000000;.  sp.t
32850 76 5f 6e 73 65 63 20 3d 20 28 6d 69 63 72 6f 73  v_nsec = (micros
32860 65 63 6f 6e 64 73 20 25 20 31 30 30 30 30 30 30  econds % 1000000
32870 29 20 2a 20 31 30 30 30 3b 0a 20 20 6e 61 6e 6f  ) * 1000;.  nano
32880 73 6c 65 65 70 28 26 73 70 2c 20 4e 55 4c 4c 29  sleep(&sp, NULL)
32890 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
328a0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
328b0 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63   return microsec
328c0 6f 6e 64 73 3b 0a 23 65 6c 69 66 20 64 65 66 69  onds;.#elif defi
328d0 6e 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50 29  ned(HAVE_USLEEP)
328e0 20 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50 0a   && HAVE_USLEEP.
328f0 20 20 75 73 6c 65 65 70 28 6d 69 63 72 6f 73 65    usleep(microse
32900 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45 44  conds);.  UNUSED
32910 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
32920 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69  ed);.  return mi
32930 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 73  croseconds;.#els
32940 65 0a 20 20 69 6e 74 20 73 65 63 6f 6e 64 73 20  e.  int seconds 
32950 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2b  = (microseconds+
32960 39 39 39 39 39 39 29 2f 31 30 30 30 30 30 30 3b  999999)/1000000;
32970 0a 20 20 73 6c 65 65 70 28 73 65 63 6f 6e 64 73  .  sleep(seconds
32980 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
32990 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
329a0 20 20 72 65 74 75 72 6e 20 73 65 63 6f 6e 64 73    return seconds
329b0 2a 31 30 30 30 30 30 30 3b 0a 23 65 6e 64 69 66  *1000000;.#endif
329c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
329d0 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
329e0 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f  , if set to a no
329f0 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69 73  n-zero value, is
32a00 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 0a   interpreted as.
32a10 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
32a20 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31   seconds since 1
32a30 39 37 30 20 61 6e 64 20 69 73 20 75 73 65 64 20  970 and is used 
32a40 74 6f 20 73 65 74 20 74 68 65 20 72 65 73 75 6c  to set the resul
32a50 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f  t of.** sqlite3O
32a60 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29 20 64  sCurrentTime() d
32a70 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a  uring testing..*
32a80 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
32a90 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
32aa0 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20  _current_time = 
32ab0 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79 73 74  0;  /* Fake syst
32ac0 65 6d 20 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e  em time in secon
32ad0 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e 20 2a  ds since 1970. *
32ae0 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  /.#endif../*.** 
32af0 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74  Find the current
32b00 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72   time (in Univer
32b10 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20  sal Coordinated 
32b20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 69 6e  Time).  Write in
32b30 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65  to *piNow.** the
32b40 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e   current time an
32b50 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69  d date as a Juli
32b60 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 74 69  an Day number ti
32b70 6d 65 73 20 38 36 5f 34 30 30 5f 30 30 30 2e 20  mes 86_400_000. 
32b80 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72   In.** other wor
32b90 64 73 2c 20 77 72 69 74 65 20 69 6e 74 6f 20 2a  ds, write into *
32ba0 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65 72  piNow the number
32bb0 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   of milliseconds
32bc0 20 73 69 6e 63 65 20 74 68 65 20 4a 75 6c 69 61   since the Julia
32bd0 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f  n.** epoch of no
32be0 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69 63 68 20  on in Greenwich 
32bf0 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20  on November 24, 
32c00 34 37 31 34 20 42 2e 43 20 61 63 63 6f 72 64 69  4714 B.C accordi
32c10 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f  ng to the.** pro
32c20 6c 65 70 74 69 63 20 47 72 65 67 6f 72 69 61 6e  leptic Gregorian
32c30 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a   calendar..**.**
32c40 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74   On success, ret
32c50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20  urn SQLITE_OK.  
32c60 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  Return SQLITE_ER
32c70 52 4f 52 20 69 66 20 74 68 65 20 74 69 6d 65 20  ROR if the time 
32c80 61 6e 64 20 64 61 74 65 20 0a 2a 2a 20 63 61 6e  and date .** can
32c90 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f  not be found..*/
32ca0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
32cb0 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
32cc0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
32cd0 74 55 73 65 64 2c 20 73 71 6c 69 74 65 33 5f 69  tUsed, sqlite3_i
32ce0 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20  nt64 *piNow){.  
32cf0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
32d00 69 74 65 33 5f 69 6e 74 36 34 20 75 6e 69 78 45  ite3_int64 unixE
32d10 70 6f 63 68 20 3d 20 32 34 34 30 35 38 37 35 2a  poch = 24405875*
32d20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38  (sqlite3_int64)8
32d30 36 34 30 30 30 30 3b 0a 20 20 69 6e 74 20 72 63  640000;.  int rc
32d40 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 69   = SQLITE_OK;.#i
32d50 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 47 45 54  f defined(NO_GET
32d60 54 4f 44 29 0a 20 20 74 69 6d 65 5f 74 20 74 3b  TOD).  time_t t;
32d70 0a 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 2a  .  time(&t);.  *
32d80 70 69 4e 6f 77 20 3d 20 28 28 73 71 6c 69 74 65  piNow = ((sqlite
32d90 33 5f 69 6e 74 36 34 29 74 29 2a 31 30 30 30 20  3_int64)t)*1000 
32da0 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 23 65 6c  + unixEpoch;.#el
32db0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
32dc0 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20  struct timespec 
32dd0 73 4e 6f 77 3b 0a 20 20 63 6c 6f 63 6b 5f 67 65  sNow;.  clock_ge
32de0 74 74 69 6d 65 28 43 4c 4f 43 4b 5f 52 45 41 4c  ttime(CLOCK_REAL
32df0 54 49 4d 45 2c 20 26 73 4e 6f 77 29 3b 0a 20 20  TIME, &sNow);.  
32e00 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f  *piNow = unixEpo
32e10 63 68 20 2b 20 31 30 30 30 2a 28 73 71 6c 69 74  ch + 1000*(sqlit
32e20 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76  e3_int64)sNow.tv
32e30 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 6e  _sec + sNow.tv_n
32e40 73 65 63 2f 31 30 30 30 30 30 30 3b 0a 23 65 6c  sec/1000000;.#el
32e50 73 65 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65  se.  struct time
32e60 76 61 6c 20 73 4e 6f 77 3b 0a 20 20 28 76 6f 69  val sNow;.  (voi
32e70 64 29 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26  d)gettimeofday(&
32e80 73 4e 6f 77 2c 20 30 29 3b 20 20 2f 2a 20 43 61  sNow, 0);  /* Ca
32e90 6e 6e 6f 74 20 66 61 69 6c 20 67 69 76 65 6e 20  nnot fail given 
32ea0 76 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 73 20  valid arguments 
32eb0 2a 2f 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e  */.  *piNow = un
32ec0 69 78 45 70 6f 63 68 20 2b 20 31 30 30 30 2a 28  ixEpoch + 1000*(
32ed0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 4e  sqlite3_int64)sN
32ee0 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77  ow.tv_sec + sNow
32ef0 2e 74 76 5f 75 73 65 63 2f 31 30 30 30 3b 0a 23  .tv_usec/1000;.#
32f00 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
32f10 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20  LITE_TEST.  if( 
32f20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
32f30 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e  time ){.    *piN
32f40 6f 77 20 3d 20 31 30 30 30 2a 28 73 71 6c 69 74  ow = 1000*(sqlit
32f50 65 33 5f 69 6e 74 36 34 29 73 71 6c 69 74 65 33  e3_int64)sqlite3
32f60 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20  _current_time + 
32f70 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23  unixEpoch;.  }.#
32f80 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f 50  endif.  UNUSED_P
32f90 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
32fa0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
32fb0 7d 0a 0a 23 69 66 20 30 20 2f 2a 20 4e 6f 74 20  }..#if 0 /* Not 
32fc0 75 73 65 64 20 2a 2f 0a 2f 2a 0a 2a 2a 20 46 69  used */./*.** Fi
32fd0 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  nd the current t
32fe0 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61  ime (in Universa
32ff0 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69  l Coordinated Ti
33000 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a  me).  Write the.
33010 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  ** current time 
33020 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75  and date as a Ju
33030 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20  lian Day number 
33040 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a  into *prNow and.
33050 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65  ** return 0.  Re
33060 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74 69  turn 1 if the ti
33070 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e  me and date cann
33080 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  ot be found..*/.
33090 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43  static int unixC
330a0 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74  urrentTime(sqlit
330b0 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
330c0 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b   double *prNow){
330d0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
330e0 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63   i = 0;.  int rc
330f0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
33100 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
33110 20 72 63 20 3d 20 75 6e 69 78 43 75 72 72 65 6e   rc = unixCurren
33120 74 54 69 6d 65 49 6e 74 36 34 28 30 2c 20 26 69  tTimeInt64(0, &i
33130 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f  );.  *prNow = i/
33140 38 36 34 30 30 30 30 30 2e 30 3b 0a 20 20 72 65  86400000.0;.  re
33150 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73 65  turn rc;.}.#else
33160 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 43 75  .# define unixCu
33170 72 72 65 6e 74 54 69 6d 65 20 30 0a 23 65 6e 64  rrentTime 0.#end
33180 69 66 0a 0a 23 69 66 20 30 20 20 2f 2a 20 4e 6f  if..#if 0  /* No
33190 74 20 75 73 65 64 20 2a 2f 0a 2f 2a 0a 2a 2a 20  t used */./*.** 
331a0 57 65 20 61 64 64 65 64 20 74 68 65 20 78 47 65  We added the xGe
331b0 74 4c 61 73 74 45 72 72 6f 72 28 29 20 6d 65 74  tLastError() met
331c0 68 6f 64 20 77 69 74 68 20 74 68 65 20 69 6e 74  hod with the int
331d0 65 6e 74 69 6f 6e 20 6f 66 20 70 72 6f 76 69 64  ention of provid
331e0 69 6e 67 0a 2a 2a 20 62 65 74 74 65 72 20 6c 6f  ing.** better lo
331f0 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20 6d 65  w-level error me
33200 73 73 61 67 65 73 20 77 68 65 6e 20 6f 70 65 72  ssages when oper
33210 61 74 69 6e 67 2d 73 79 73 74 65 6d 20 70 72 6f  ating-system pro
33220 62 6c 65 6d 73 20 63 6f 6d 65 20 75 70 0a 2a 2a  blems come up.**
33230 20 64 75 72 69 6e 67 20 53 51 4c 69 74 65 20 6f   during SQLite o
33240 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 73  peration.  But s
33250 6f 20 66 61 72 2c 20 6e 6f 6e 65 20 6f 66 20 74  o far, none of t
33260 68 61 74 20 68 61 73 20 62 65 65 6e 20 69 6d 70  hat has been imp
33270 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 69 6e 20 74  lemented.** in t
33280 68 65 20 63 6f 72 65 2e 20 20 53 6f 20 74 68 69  he core.  So thi
33290 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76  s routine is nev
332a0 65 72 20 63 61 6c 6c 65 64 2e 20 20 46 6f 72 20  er called.  For 
332b0 6e 6f 77 2c 20 69 74 20 69 73 20 6d 65 72 65 6c  now, it is merel
332c0 79 0a 2a 2a 20 61 20 70 6c 61 63 65 2d 68 6f 6c  y.** a place-hol
332d0 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
332e0 6e 74 20 75 6e 69 78 47 65 74 4c 61 73 74 45 72  nt unixGetLastEr
332f0 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ror(sqlite3_vfs 
33300 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f  *NotUsed, int No
33310 74 55 73 65 64 32 2c 20 63 68 61 72 20 2a 4e 6f  tUsed2, char *No
33320 74 55 73 65 64 33 29 7b 0a 20 20 55 4e 55 53 45  tUsed3){.  UNUSE
33330 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
33340 73 65 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  sed);.  UNUSED_P
33350 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
33360 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2);.  UNUSED_PAR
33370 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 33 29  AMETER(NotUsed3)
33380 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
33390 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 75  #else.# define u
333a0 6e 69 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20  nixGetLastError 
333b0 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  0.#endif.../*.**
333c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
333d0 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 73 71  ****** End of sq
333e0 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64  lite3_vfs method
333f0 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
33400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 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 2a 2a  ****************
33430 2a 2a 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 2f 0a 0a 2f  ************/../
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 2a 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 2a 2a 2a 2a 2a  ****************
334a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
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 20 42 65 67 69 6e 20  ********* Begin 
334d0 50 72 6f 78 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a  Proxy Locking **
334e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
334f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
33500 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69  *.** Proxy locki
33510 6e 67 20 69 73 20 61 20 22 75 62 65 72 2d 6c 6f  ng is a "uber-lo
33520 63 6b 69 6e 67 2d 6d 65 74 68 6f 64 22 20 69 6e  cking-method" in
33530 20 74 68 69 73 20 73 65 6e 73 65 3a 20 20 49 74   this sense:  It
33540 20 75 73 65 73 20 74 68 65 0a 2a 2a 20 6f 74 68   uses the.** oth
33550 65 72 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  er locking metho
33560 64 73 20 6f 6e 20 73 65 63 6f 6e 64 61 72 79 20  ds on secondary 
33570 6c 6f 63 6b 20 66 69 6c 65 73 2e 20 20 50 72 6f  lock files.  Pro
33580 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 0a  xy locking is a.
33590 2a 2a 20 6d 65 74 61 2d 6c 61 79 65 72 20 6f 76  ** meta-layer ov
335a0 65 72 20 74 6f 70 20 6f 66 20 74 68 65 20 70 72  er top of the pr
335b0 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20  imitive locking 
335c0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 62 6f 76  implemented abov
335d0 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 69 73 20  e.  For.** this 
335e0 72 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69  reason, the divi
335f0 73 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d  sion that implem
33600 65 6e 74 73 20 6f 66 20 70 72 6f 78 79 20 6c 6f  ents of proxy lo
33610 63 6b 69 6e 67 20 69 73 20 64 65 66 65 72 72 65  cking is deferre
33620 64 0a 2a 2a 20 75 6e 74 69 6c 20 6c 61 74 65 20  d.** until late 
33630 69 6e 20 74 68 65 20 66 69 6c 65 20 28 68 65 72  in the file (her
33640 65 29 20 61 66 74 65 72 20 61 6c 6c 20 6f 66 20  e) after all of 
33650 74 68 65 20 6f 74 68 65 72 20 49 2f 4f 20 6d 65  the other I/O me
33660 74 68 6f 64 73 20 68 61 76 65 0a 2a 2a 20 62 65  thods have.** be
33670 65 6e 20 64 65 66 69 6e 65 64 20 2d 20 73 6f 20  en defined - so 
33680 74 68 61 74 20 74 68 65 20 70 72 69 6d 69 74 69  that the primiti
33690 76 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  ve locking metho
336a0 64 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ds are available
336b0 0a 2a 2a 20 61 73 20 73 65 72 76 69 63 65 73 20  .** as services 
336c0 74 6f 20 68 65 6c 70 20 77 69 74 68 20 74 68 65  to help with the
336d0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
336e0 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  of proxy locking
336f0 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  ..**.****.**.** 
33700 54 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b  The default lock
33710 69 6e 67 20 73 63 68 65 6d 65 73 20 69 6e 20 53  ing schemes in S
33720 51 4c 69 74 65 20 75 73 65 20 62 79 74 65 2d 72  QLite use byte-r
33730 61 6e 67 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  ange locks on th
33740 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69  e.** database fi
33750 6c 65 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65  le to coordinate
33760 20 73 61 66 65 2c 20 63 6f 6e 63 75 72 72 65 6e   safe, concurren
33770 74 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74  t access by mult
33780 69 70 6c 65 20 72 65 61 64 65 72 73 0a 2a 2a 20  iple readers.** 
33790 61 6e 64 20 77 72 69 74 65 72 73 20 5b 68 74 74  and writers [htt
337a0 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67 2f 6c  p://sqlite.org/l
337b0 6f 63 6b 69 6e 67 76 33 2e 68 74 6d 6c 5d 2e 20  ockingv3.html]. 
337c0 20 54 68 65 20 66 69 76 65 20 66 69 6c 65 20 6c   The five file l
337d0 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73  ocking.** states
337e0 20 28 55 4e 4c 4f 43 4b 45 44 2c 20 50 45 4e 44   (UNLOCKED, PEND
337f0 49 4e 47 2c 20 53 48 41 52 45 44 2c 20 52 45 53  ING, SHARED, RES
33800 45 52 56 45 44 2c 20 45 58 43 4c 55 53 49 56 45  ERVED, EXCLUSIVE
33810 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65  ) are implemente
33820 64 0a 2a 2a 20 61 73 20 50 4f 53 49 58 20 72 65  d.** as POSIX re
33830 61 64 20 26 20 77 72 69 74 65 20 6c 6f 63 6b 73  ad & write locks
33840 20 6f 76 65 72 20 66 69 78 65 64 20 73 65 74 20   over fixed set 
33850 6f 66 20 6c 6f 63 61 74 69 6f 6e 73 20 28 76 69  of locations (vi
33860 61 20 66 73 63 74 6c 29 2c 0a 2a 2a 20 6f 6e 20  a fsctl),.** on 
33870 41 46 50 20 61 6e 64 20 53 4d 42 20 6f 6e 6c 79  AFP and SMB only
33880 20 65 78 63 6c 75 73 69 76 65 20 62 79 74 65 2d   exclusive byte-
33890 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20  range locks are 
338a0 61 76 61 69 6c 61 62 6c 65 20 76 69 61 20 66 73  available via fs
338b0 63 74 6c 0a 2a 2a 20 77 69 74 68 20 5f 49 4f 57  ctl.** with _IOW
338c0 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63  R('z', 23, struc
338d0 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50  t ByteRangeLockP
338e0 42 32 29 20 74 6f 20 74 72 61 63 6b 20 74 68 65  B2) to track the
338f0 20 73 61 6d 65 20 35 20 73 74 61 74 65 73 2e 0a   same 5 states..
33900 2a 2a 20 54 6f 20 73 69 6d 75 6c 61 74 65 20 61  ** To simulate a
33910 20 46 5f 52 44 4c 43 4b 20 6f 6e 20 74 68 65 20   F_RDLCK on the 
33920 73 68 61 72 65 64 20 72 61 6e 67 65 2c 20 6f 6e  shared range, on
33930 20 41 46 50 20 61 20 72 61 6e 64 6f 6d 6c 79 20   AFP a randomly 
33940 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61 64 64 72  selected.** addr
33950 65 73 73 20 69 6e 20 74 68 65 20 73 68 61 72 65  ess in the share
33960 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e  d range is taken
33970 20 66 6f 72 20 61 20 53 48 41 52 45 44 20 6c 6f   for a SHARED lo
33980 63 6b 2c 20 74 68 65 20 65 6e 74 69 72 65 0a 2a  ck, the entire.*
33990 2a 20 73 68 61 72 65 64 20 72 61 6e 67 65 20 69  * shared range i
339a0 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 6e 20 45  s taken for an E
339b0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 29 3a 0a  XCLUSIVE lock):.
339c0 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 45 4e 44 49  **.**      PENDI
339d0 4e 47 5f 42 59 54 45 20 20 20 20 20 20 20 20 30  NG_BYTE        0
339e0 78 34 30 30 30 30 30 30 30 0a 2a 2a 20 20 20 20  x40000000.**    
339f0 20 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 20    RESERVED_BYTE 
33a00 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30 31        0x40000001
33a10 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 5f  .**      SHARED_
33a20 52 41 4e 47 45 20 20 20 20 20 20 20 20 30 78 34  RANGE        0x4
33a30 30 30 30 30 30 30 32 20 2d 3e 20 30 78 34 30 30  0000002 -> 0x400
33a40 30 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73  00200.**.** This
33a50 20 77 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e 20 74   works well on t
33a60 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79  he local file sy
33a70 73 74 65 6d 2c 20 62 75 74 20 73 68 6f 77 73 20  stem, but shows 
33a80 61 20 6e 65 61 72 6c 79 20 31 30 30 78 0a 2a 2a  a nearly 100x.**
33a90 20 73 6c 6f 77 64 6f 77 6e 20 69 6e 20 72 65 61   slowdown in rea
33aa0 64 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 6e  d performance on
33ab0 20 41 46 50 20 62 65 63 61 75 73 65 20 74 68 65   AFP because the
33ac0 20 41 46 50 20 63 6c 69 65 6e 74 20 64 69 73 61   AFP client disa
33ad0 62 6c 65 73 0a 2a 2a 20 74 68 65 20 72 65 61 64  bles.** the read
33ae0 20 63 61 63 68 65 20 77 68 65 6e 20 62 79 74 65   cache when byte
33af0 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65  -range locks are
33b00 20 70 72 65 73 65 6e 74 2e 20 20 45 6e 61 62 6c   present.  Enabl
33b10 69 6e 67 20 74 68 65 20 72 65 61 64 0a 2a 2a 20  ing the read.** 
33b20 63 61 63 68 65 20 65 78 70 6f 73 65 73 20 61 20  cache exposes a 
33b30 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20  cache coherency 
33b40 70 72 6f 62 6c 65 6d 20 74 68 61 74 20 69 73 20  problem that is 
33b50 70 72 65 73 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f  present on all O
33b60 53 20 58 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64  S X.** supported
33b70 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 20 73 79   network file sy
33b80 73 74 65 6d 73 2e 20 20 4e 46 53 20 61 6e 64 20  stems.  NFS and 
33b90 41 46 50 20 62 6f 74 68 20 6f 62 73 65 72 76 65  AFP both observe
33ba0 20 74 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f   the.** close-to
33bb0 2d 6f 70 65 6e 20 73 65 6d 61 6e 74 69 63 73 20  -open semantics 
33bc0 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 63 61 63  for ensuring cac
33bd0 68 65 20 63 6f 68 65 72 65 6e 63 79 0a 2a 2a 20  he coherency.** 
33be0 5b 68 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72  [http://nfs.sour
33bf0 63 65 66 6f 72 67 65 2e 6e 65 74 2f 23 66 61 71  ceforge.net/#faq
33c00 5f 61 38 5d 2c 20 77 68 69 63 68 20 64 6f 65 73  _a8], which does
33c10 20 6e 6f 74 20 65 66 66 65 63 74 69 76 65 6c 79   not effectively
33c20 0a 2a 2a 20 61 64 64 72 65 73 73 20 74 68 65 20  .** address the 
33c30 72 65 71 75 69 72 65 6d 65 6e 74 73 20 66 6f 72  requirements for
33c40 20 63 6f 6e 63 75 72 72 65 6e 74 20 64 61 74 61   concurrent data
33c50 62 61 73 65 20 61 63 63 65 73 73 20 62 79 20 6d  base access by m
33c60 75 6c 74 69 70 6c 65 0a 2a 2a 20 72 65 61 64 65  ultiple.** reade
33c70 72 73 20 61 6e 64 20 77 72 69 74 65 72 73 0a 2a  rs and writers.*
33c80 2a 20 5b 68 74 74 70 3a 2f 2f 77 77 77 2e 6e 61  * [http://www.na
33c90 62 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d  bble.com/SQLite-
33ca0 6f 6e 2d 4e 46 53 2d 63 61 63 68 65 2d 63 6f 68  on-NFS-cache-coh
33cb0 65 72 65 6e 63 79 2d 74 64 31 35 36 35 35 37 30  erency-td1565570
33cc0 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54  1.html]..**.** T
33cd0 6f 20 61 64 64 72 65 73 73 20 74 68 65 20 70 65  o address the pe
33ce0 72 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20 63 61  rformance and ca
33cf0 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20 69 73  che coherency is
33d00 73 75 65 73 2c 20 70 72 6f 78 79 20 66 69 6c 65  sues, proxy file
33d10 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e   locking.** chan
33d20 67 65 73 20 74 68 65 20 77 61 79 20 64 61 74 61  ges the way data
33d30 62 61 73 65 20 61 63 63 65 73 73 20 69 73 20 63  base access is c
33d40 6f 6e 74 72 6f 6c 6c 65 64 20 62 79 20 6c 69 6d  ontrolled by lim
33d50 69 74 69 6e 67 20 61 63 63 65 73 73 20 74 6f 20  iting access to 
33d60 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 68 6f 73 74  a.** single host
33d70 20 61 74 20 61 20 74 69 6d 65 20 61 6e 64 20 6d   at a time and m
33d80 6f 76 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73  oving file locks
33d90 20 6f 66 66 20 6f 66 20 74 68 65 20 64 61 74 61   off of the data
33da0 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64  base file.** and
33db0 20 6f 6e 74 6f 20 61 20 70 72 6f 78 79 20 66 69   onto a proxy fi
33dc0 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  le on the local 
33dd0 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 20 0a 2a  file system.  .*
33de0 2a 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20 70 72  *.**.** Using pr
33df0 6f 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d  oxy locks.** ---
33e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
33e10 2a 0a 2a 2a 20 43 20 41 50 49 73 0a 2a 2a 0a 2a  *.** C APIs.**.*
33e20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  *  sqlite3_file_
33e30 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61  control(db, dbna
33e40 6d 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  me, SQLITE_FCNTL
33e50 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _SET_LOCKPROXYFI
33e60 4c 45 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  LE,.**          
33e70 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 70 72               <pr
33e80 6f 78 79 5f 70 61 74 68 3e 20 7c 20 22 3a 61 75  oxy_path> | ":au
33e90 74 6f 3a 22 29 3b 0a 2a 2a 20 20 73 71 6c 69 74  to:");.**  sqlit
33ea0 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
33eb0 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49  db, dbname, SQLI
33ec0 54 45 5f 46 43 4e 54 4c 5f 47 45 54 5f 4c 4f 43  TE_FCNTL_GET_LOC
33ed0 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20  KPROXYFILE,.**  
33ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33ef0 20 20 20 20 20 26 3c 70 72 6f 78 79 5f 70 61 74       &<proxy_pat
33f00 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51  h>);.**.**.** SQ
33f10 4c 20 70 72 61 67 6d 61 73 0a 2a 2a 0a 2a 2a 20  L pragmas.**.** 
33f20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73   PRAGMA [databas
33f30 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69  e.]lock_proxy_fi
33f40 6c 65 3d 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20  le=<proxy_path> 
33f50 7c 20 3a 61 75 74 6f 3a 0a 2a 2a 20 20 50 52 41  | :auto:.**  PRA
33f60 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c  GMA [database.]l
33f70 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 0a 2a  ock_proxy_file.*
33f80 2a 0a 2a 2a 20 53 70 65 63 69 66 79 69 6e 67 20  *.** Specifying 
33f90 22 3a 61 75 74 6f 3a 22 20 6d 65 61 6e 73 20 74  ":auto:" means t
33fa0 68 61 74 20 69 66 20 74 68 65 72 65 20 69 73 20  hat if there is 
33fb0 61 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 74  a conch file wit
33fc0 68 20 61 20 6d 61 74 63 68 69 6e 67 0a 2a 2a 20  h a matching.** 
33fd0 68 6f 73 74 20 49 44 20 69 6e 20 69 74 2c 20 74  host ID in it, t
33fe0 68 65 20 70 72 6f 78 79 20 70 61 74 68 20 69 6e  he proxy path in
33ff0 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
34000 77 69 6c 6c 20 62 65 20 75 73 65 64 2c 20 6f 74  will be used, ot
34010 68 65 72 77 69 73 65 0a 2a 2a 20 61 20 70 72 6f  herwise.** a pro
34020 78 79 20 70 61 74 68 20 62 61 73 65 64 20 6f 6e  xy path based on
34030 20 74 68 65 20 75 73 65 72 27 73 20 74 65 6d 70   the user's temp
34040 20 64 69 72 0a 2a 2a 20 28 76 69 61 20 63 6f 6e   dir.** (via con
34050 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f  fstr(_CS_DARWIN_
34060 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 2e 2e  USER_TEMP_DIR,..
34070 2e 29 29 20 77 69 6c 6c 20 62 65 20 75 73 65 64  .)) will be used
34080 20 61 6e 64 20 74 68 65 0a 2a 2a 20 61 63 74 75   and the.** actu
34090 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 20 6e 61  al proxy file na
340a0 6d 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  me is generated 
340b0 66 72 6f 6d 20 74 68 65 20 6e 61 6d 65 20 61 6e  from the name an
340c0 64 20 70 61 74 68 20 6f 66 20 74 68 65 0a 2a 2a  d path of the.**
340d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
340e0 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a   For example:.**
340f0 0a 2a 2a 20 20 20 20 20 20 20 46 6f 72 20 64 61  .**       For da
34100 74 61 62 61 73 65 20 70 61 74 68 20 22 2f 55 73  tabase path "/Us
34110 65 72 73 2f 6d 65 2f 66 6f 6f 2e 64 62 22 20 0a  ers/me/foo.db" .
34120 2a 2a 20 20 20 20 20 20 20 54 68 65 20 6c 6f 63  **       The loc
34130 6b 20 70 61 74 68 20 77 69 6c 6c 20 62 65 20 22  k path will be "
34140 3c 74 6d 70 64 69 72 3e 2f 73 71 6c 69 74 65 70  <tmpdir>/sqlitep
34150 6c 6f 63 6b 73 2f 5f 55 73 65 72 73 5f 6d 65 5f  locks/_Users_me_
34160 66 6f 6f 2e 64 62 3a 61 75 74 6f 3a 22 29 0a 2a  foo.db:auto:").*
34170 2a 0a 2a 2a 20 4f 6e 63 65 20 61 20 6c 6f 63 6b  *.** Once a lock
34180 20 70 72 6f 78 79 20 69 73 20 63 6f 6e 66 69 67   proxy is config
34190 75 72 65 64 20 66 6f 72 20 61 20 64 61 74 61 62  ured for a datab
341a0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20  ase connection, 
341b0 69 74 20 63 61 6e 20 6e 6f 74 0a 2a 2a 20 62 65  it can not.** be
341c0 20 72 65 6d 6f 76 65 64 2c 20 68 6f 77 65 76 65   removed, howeve
341d0 72 20 69 74 20 6d 61 79 20 62 65 20 73 77 69 74  r it may be swit
341e0 63 68 65 64 20 74 6f 20 61 20 64 69 66 66 65 72  ched to a differ
341f0 65 6e 74 20 70 72 6f 78 79 20 70 61 74 68 20 76  ent proxy path v
34200 69 61 0a 2a 2a 20 74 68 65 20 61 62 6f 76 65 20  ia.** the above 
34210 41 50 49 73 20 28 61 73 73 75 6d 69 6e 67 20 74  APIs (assuming t
34220 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69 73  he conch file is
34230 20 6e 6f 74 20 62 65 69 6e 67 20 68 65 6c 64 20   not being held 
34240 62 79 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 63 6f  by another.** co
34250 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 70 72 6f 63  nnection or proc
34260 65 73 73 29 2e 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  ess). .**.**.** 
34270 48 6f 77 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  How proxy lockin
34280 67 20 77 6f 72 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d  g works.** -----
34290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
342a0 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 66  --.**.** Proxy f
342b0 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 72 65 6c 69  ile locking reli
342c0 65 73 20 70 72 69 6d 61 72 69 6c 79 20 6f 6e 20  es primarily on 
342d0 74 77 6f 20 6e 65 77 20 73 75 70 70 6f 72 74 69  two new supporti
342e0 6e 67 20 66 69 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a  ng files: .**.**
342f0 20 20 20 2a 20 20 63 6f 6e 63 68 20 66 69 6c 65     *  conch file
34300 20 74 6f 20 6c 69 6d 69 74 20 61 63 63 65 73 73   to limit access
34310 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
34320 20 66 69 6c 65 20 74 6f 20 61 20 73 69 6e 67 6c   file to a singl
34330 65 20 68 6f 73 74 0a 2a 2a 20 20 20 20 20 20 61  e host.**      a
34340 74 20 61 20 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 20  t a time.**.**  
34350 20 2a 20 20 70 72 6f 78 79 20 66 69 6c 65 20 74   *  proxy file t
34360 6f 20 61 63 74 20 61 73 20 61 20 70 72 6f 78 79  o act as a proxy
34370 20 66 6f 72 20 74 68 65 20 61 64 76 69 73 6f 72   for the advisor
34380 79 20 6c 6f 63 6b 73 20 6e 6f 72 6d 61 6c 6c 79  y locks normally
34390 0a 2a 2a 20 20 20 20 20 20 74 61 6b 65 6e 20 6f  .**      taken o
343a0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  n the database.*
343b0 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 63 68 20 66  *.** The conch f
343c0 69 6c 65 20 2d 20 74 6f 20 75 73 65 20 61 20 70  ile - to use a p
343d0 72 6f 78 79 20 66 69 6c 65 2c 20 73 71 6c 69 74  roxy file, sqlit
343e0 65 20 6d 75 73 74 20 66 69 72 73 74 20 22 68 6f  e must first "ho
343f0 6c 64 20 74 68 65 20 63 6f 6e 63 68 22 0a 2a 2a  ld the conch".**
34400 20 62 79 20 74 61 6b 69 6e 67 20 61 6e 20 73 71   by taking an sq
34410 6c 69 74 65 2d 73 74 79 6c 65 20 73 68 61 72 65  lite-style share
34420 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f  d lock on the co
34430 6e 63 68 20 66 69 6c 65 2c 20 72 65 61 64 69 6e  nch file, readin
34440 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  g the.** content
34450 73 20 61 6e 64 20 63 6f 6d 70 61 72 69 6e 67 20  s and comparing 
34460 74 68 65 20 68 6f 73 74 27 73 20 75 6e 69 71 75  the host's uniqu
34470 65 20 68 6f 73 74 20 49 44 20 28 73 65 65 20 62  e host ID (see b
34480 65 6c 6f 77 29 20 61 6e 64 20 6c 6f 63 6b 0a 2a  elow) and lock.*
34490 2a 20 70 72 6f 78 79 20 70 61 74 68 20 61 67 61  * proxy path aga
344a0 69 6e 73 74 20 74 68 65 20 76 61 6c 75 65 73 20  inst the values 
344b0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63 6f  stored in the co
344c0 6e 63 68 2e 20 20 54 68 65 20 63 6f 6e 63 68 20  nch.  The conch 
344d0 66 69 6c 65 20 69 73 0a 2a 2a 20 73 74 6f 72 65  file is.** store
344e0 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69  d in the same di
344f0 72 65 63 74 6f 72 79 20 61 73 20 74 68 65 20 64  rectory as the d
34500 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
34510 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 0a 2a   the file name.*
34520 2a 20 69 73 20 70 61 74 74 65 72 6e 65 64 20 61  * is patterned a
34530 66 74 65 72 20 74 68 65 20 64 61 74 61 62 61 73  fter the databas
34540 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 22  e file name as "
34550 2e 3c 64 61 74 61 62 61 73 65 6e 61 6d 65 3e 2d  .<databasename>-
34560 63 6f 6e 63 68 22 2e 0a 2a 2a 20 49 66 20 74 68  conch"..** If th
34570 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 64 6f 65  e conch file doe
34580 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 6f 72 20  s not exist, or 
34590 69 74 73 20 63 6f 6e 74 65 6e 74 73 20 64 6f 20  its contents do 
345a0 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 0a 2a 2a  not match the.**
345b0 20 68 6f 73 74 20 49 44 20 61 6e 64 2f 6f 72 20   host ID and/or 
345c0 70 72 6f 78 79 20 70 61 74 68 2c 20 74 68 65 6e  proxy path, then
345d0 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 65 73 63   the lock is esc
345e0 61 6c 61 74 65 64 20 74 6f 20 61 6e 20 65 78 63  alated to an exc
345f0 6c 75 73 69 76 65 0a 2a 2a 20 6c 6f 63 6b 20 61  lusive.** lock a
34600 6e 64 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  nd the conch fil
34610 65 20 63 6f 6e 74 65 6e 74 73 20 69 73 20 75 70  e contents is up
34620 64 61 74 65 64 20 77 69 74 68 20 74 68 65 20 68  dated with the h
34630 6f 73 74 20 49 44 20 61 6e 64 20 70 72 6f 78 79  ost ID and proxy
34640 0a 2a 2a 20 70 61 74 68 20 61 6e 64 20 74 68 65  .** path and the
34650 20 6c 6f 63 6b 20 69 73 20 64 6f 77 6e 67 72 61   lock is downgra
34660 64 65 64 20 74 6f 20 61 20 73 68 61 72 65 64 20  ded to a shared 
34670 6c 6f 63 6b 20 61 67 61 69 6e 2e 20 20 49 66 20  lock again.  If 
34680 74 68 65 20 63 6f 6e 63 68 0a 2a 2a 20 69 73 20  the conch.** is 
34690 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 20  held by another 
346a0 70 72 6f 63 65 73 73 20 28 77 69 74 68 20 61 20  process (with a 
346b0 73 68 61 72 65 64 20 6c 6f 63 6b 29 2c 20 74 68  shared lock), th
346c0 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
346d0 0a 2a 2a 20 77 69 6c 6c 20 66 61 69 6c 20 61 6e  .** will fail an
346e0 64 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  d SQLITE_BUSY is
346f0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
34700 20 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20   The proxy file 
34710 2d 20 61 20 73 69 6e 67 6c 65 2d 62 79 74 65 20  - a single-byte 
34720 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 61 6c  file used for al
34730 6c 20 61 64 76 69 73 6f 72 79 20 66 69 6c 65 20  l advisory file 
34740 6c 6f 63 6b 73 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c  locks.** normall
34750 79 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64  y taken on the d
34760 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 20  atabase file.   
34770 54 68 69 73 20 61 6c 6c 6f 77 73 20 66 6f 72 20  This allows for 
34780 73 61 66 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20  safe sharing.** 
34790 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
347a0 66 69 6c 65 20 66 6f 72 20 6d 75 6c 74 69 70 6c  file for multipl
347b0 65 20 72 65 61 64 65 72 73 20 61 6e 64 20 77 72  e readers and wr
347c0 69 74 65 72 73 20 6f 6e 20 74 68 65 20 73 61 6d  iters on the sam
347d0 65 0a 2a 2a 20 68 6f 73 74 20 28 74 68 65 20 63  e.** host (the c
347e0 6f 6e 63 68 20 65 6e 73 75 72 65 73 20 74 68 61  onch ensures tha
347f0 74 20 74 68 65 79 20 61 6c 6c 20 75 73 65 20 74  t they all use t
34800 68 65 20 73 61 6d 65 20 6c 6f 63 61 6c 20 6c 6f  he same local lo
34810 63 6b 20 66 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20  ck file)..**.** 
34820 52 65 71 75 65 73 74 69 6e 67 20 74 68 65 20 6c  Requesting the l
34830 6f 63 6b 20 70 72 6f 78 79 20 64 6f 65 73 20 6e  ock proxy does n
34840 6f 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  ot immediately t
34850 61 6b 65 20 74 68 65 20 63 6f 6e 63 68 2c 20 69  ake the conch, i
34860 74 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 74 61 6b  t is.** only tak
34870 65 6e 20 77 68 65 6e 20 74 68 65 20 66 69 72 73  en when the firs
34880 74 20 72 65 71 75 65 73 74 20 74 6f 20 6c 6f 63  t request to loc
34890 6b 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  k database file 
348a0 69 73 20 6d 61 64 65 2e 20 20 0a 2a 2a 20 54 68  is made.  .** Th
348b0 69 73 20 6d 61 74 63 68 65 73 20 74 68 65 20 73  is matches the s
348c0 65 6d 61 6e 74 69 63 73 20 6f 66 20 74 68 65 20  emantics of the 
348d0 74 72 61 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b  traditional lock
348e0 69 6e 67 20 62 65 68 61 76 69 6f 72 2c 20 77 68  ing behavior, wh
348f0 65 72 65 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 61  ere.** opening a
34900 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61   connection to a
34910 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 64   database file d
34920 6f 65 73 20 6e 6f 74 20 74 61 6b 65 20 61 20 6c  oes not take a l
34930 6f 63 6b 20 6f 6e 20 69 74 2e 0a 2a 2a 20 54 68  ock on it..** Th
34940 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e  e shared lock an
34950 64 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 64  d an open file d
34960 65 73 63 72 69 70 74 6f 72 20 61 72 65 20 6d 61  escriptor are ma
34970 69 6e 74 61 69 6e 65 64 20 75 6e 74 69 6c 20 0a  intained until .
34980 2a 2a 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ** the connectio
34990 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
349a0 65 20 69 73 20 63 6c 6f 73 65 64 2e 20 0a 2a 2a  e is closed. .**
349b0 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 66 69  .** The proxy fi
349c0 6c 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  le and the lock 
349d0 66 69 6c 65 20 61 72 65 20 6e 65 76 65 72 20 64  file are never d
349e0 65 6c 65 74 65 64 20 73 6f 20 74 68 65 79 20 6f  eleted so they o
349f0 6e 6c 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62  nly need.** to b
34a00 65 20 63 72 65 61 74 65 64 20 74 68 65 20 66 69  e created the fi
34a10 72 73 74 20 74 69 6d 65 20 74 68 65 79 20 61 72  rst time they ar
34a20 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f  e used..**.** Co
34a30 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69  nfiguration opti
34a40 6f 6e 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ons.** ---------
34a50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a  ------------.**.
34a60 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 45 46 45  **  SQLITE_PREFE
34a70 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a  R_PROXY_LOCKING.
34a80 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 44 61 74 61  **.**       Data
34a90 62 61 73 65 20 66 69 6c 65 73 20 61 63 63 65 73  base files acces
34aa0 73 65 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c  sed on non-local
34ab0 20 66 69 6c 65 20 73 79 73 74 65 6d 73 20 61 72   file systems ar
34ac0 65 0a 2a 2a 20 20 20 20 20 20 20 61 75 74 6f 6d  e.**       autom
34ad0 61 74 69 63 61 6c 6c 79 20 63 6f 6e 66 69 67 75  atically configu
34ae0 72 65 64 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f  red for proxy lo
34af0 63 6b 69 6e 67 2c 20 6c 6f 63 6b 20 66 69 6c 65  cking, lock file
34b00 73 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20 6e  s are.**       n
34b10 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  amed automatical
34b20 6c 79 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d  ly using the sam
34b30 65 20 6c 6f 67 69 63 20 61 73 0a 2a 2a 20 20 20  e logic as.**   
34b40 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f      PRAGMA lock_
34b50 70 72 6f 78 79 5f 66 69 6c 65 3d 22 3a 61 75 74  proxy_file=":aut
34b60 6f 3a 22 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 53  o:".**    .**  S
34b70 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45 42 55  QLITE_PROXY_DEBU
34b80 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 45 6e  G.**.**       En
34b90 61 62 6c 65 73 20 74 68 65 20 6c 6f 67 67 69 6e  ables the loggin
34ba0 67 20 6f 66 20 65 72 72 6f 72 20 6d 65 73 73 61  g of error messa
34bb0 67 65 73 20 64 75 72 69 6e 67 20 68 6f 73 74 20  ges during host 
34bc0 69 64 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20  id file.**      
34bd0 20 72 65 74 72 69 65 76 61 6c 20 61 6e 64 20 63   retrieval and c
34be0 72 65 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c  reation.**.**  L
34bf0 4f 43 4b 50 52 4f 58 59 44 49 52 0a 2a 2a 0a 2a  OCKPROXYDIR.**.*
34c00 2a 20 20 20 20 20 20 20 4f 76 65 72 72 69 64 65  *       Override
34c10 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 64 69  s the default di
34c20 72 65 63 74 6f 72 79 20 75 73 65 64 20 66 6f 72  rectory used for
34c30 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65   lock proxy file
34c40 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  s that.**       
34c50 61 72 65 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61  are named automa
34c60 74 69 63 61 6c 6c 79 20 76 69 61 20 74 68 65 20  tically via the 
34c70 22 3a 61 75 74 6f 3a 22 20 73 65 74 74 69 6e 67  ":auto:" setting
34c80 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 44  .**.**  SQLITE_D
34c90 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f  EFAULT_PROXYDIR_
34ca0 50 45 52 4d 49 53 53 49 4f 4e 53 0a 2a 2a 0a 2a  PERMISSIONS.**.*
34cb0 2a 20 20 20 20 20 20 20 50 65 72 6d 69 73 73 69  *       Permissi
34cc0 6f 6e 73 20 74 6f 20 75 73 65 20 77 68 65 6e 20  ons to use when 
34cd0 63 72 65 61 74 69 6e 67 20 61 20 64 69 72 65 63  creating a direc
34ce0 74 6f 72 79 20 66 6f 72 20 73 74 6f 72 69 6e 67  tory for storing
34cf0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6c 6f   the.**       lo
34d00 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 2c 20  ck proxy files, 
34d10 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20 4c  only used when L
34d20 4f 43 4b 50 52 4f 58 59 44 49 52 20 69 73 20 6e  OCKPROXYDIR is n
34d30 6f 74 20 73 65 74 2e 0a 2a 2a 20 20 20 20 0a 2a  ot set..**    .*
34d40 2a 20 20 20 20 0a 2a 2a 20 41 73 20 6d 65 6e 74  *    .** As ment
34d50 69 6f 6e 65 64 20 61 62 6f 76 65 2c 20 77 68 65  ioned above, whe
34d60 6e 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  n compiled with 
34d70 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52  SQLITE_PREFER_PR
34d80 4f 58 59 5f 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a 20  OXY_LOCKING,.** 
34d90 73 65 74 74 69 6e 67 20 74 68 65 20 65 6e 76 69  setting the envi
34da0 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
34db0 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52   SQLITE_FORCE_PR
34dc0 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 74 6f 20 31  OXY_LOCKING to 1
34dd0 20 77 69 6c 6c 0a 2a 2a 20 66 6f 72 63 65 20 70   will.** force p
34de0 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20  roxy locking to 
34df0 62 65 20 75 73 65 64 20 66 6f 72 20 65 76 65 72  be used for ever
34e00 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  y database file 
34e10 6f 70 65 6e 65 64 2c 20 61 6e 64 20 30 0a 2a 2a  opened, and 0.**
34e20 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 75 74 6f   will force auto
34e30 6d 61 74 69 63 20 70 72 6f 78 79 20 6c 6f 63 6b  matic proxy lock
34e40 69 6e 67 20 74 6f 20 62 65 20 64 69 73 61 62 6c  ing to be disabl
34e50 65 64 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62  ed for all datab
34e60 61 73 65 0a 2a 2a 20 66 69 6c 65 73 20 28 65 78  ase.** files (ex
34e70 70 6c 69 63 69 74 6c 79 20 63 61 6c 6c 69 6e 67  plicitly calling
34e80 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54   the SQLITE_FCNT
34e90 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  L_SET_LOCKPROXYF
34ea0 49 4c 45 20 70 72 61 67 6d 61 20 6f 72 0a 2a 2a  ILE pragma or.**
34eb0 20 73 71 6c 69 74 65 5f 66 69 6c 65 5f 63 6f 6e   sqlite_file_con
34ec0 74 72 6f 6c 20 41 50 49 20 69 73 20 6e 6f 74 20  trol API is not 
34ed0 61 66 66 65 63 74 65 64 20 62 79 20 53 51 4c 49  affected by SQLI
34ee0 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c  TE_FORCE_PROXY_L
34ef0 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a  OCKING)..*/../*.
34f00 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ** Proxy locking
34f10 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62   is only availab
34f20 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a 2f  le on MacOSX .*/
34f30 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
34f40 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
34f50 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
34f60 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54 68  _STYLE../*.** Th
34f70 65 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f  e proxyLockingCo
34f80 6e 74 65 78 74 20 68 61 73 20 74 68 65 20 70 61  ntext has the pa
34f90 74 68 20 61 6e 64 20 66 69 6c 65 20 73 74 72 75  th and file stru
34fa0 63 74 75 72 65 73 20 66 6f 72 20 74 68 65 20 72  ctures for the r
34fb0 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64 20 6c 6f  emote .** and lo
34fc0 63 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 73 20  cal proxy files 
34fd0 69 6e 20 69 74 0a 2a 2f 0a 74 79 70 65 64 65 66  in it.*/.typedef
34fe0 20 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63   struct proxyLoc
34ff0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 70 72 6f 78  kingContext prox
35000 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  yLockingContext;
35010 0a 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63  .struct proxyLoc
35020 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20  kingContext {.  
35030 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46  unixFile *conchF
35040 69 6c 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ile;         /* 
35050 4f 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 20  Open conch file 
35060 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68  */.  char *conch
35070 46 69 6c 65 50 61 74 68 3b 20 20 20 20 20 20 20  FilePath;       
35080 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
35090 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20   conch file */. 
350a0 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50   unixFile *lockP
350b0 72 6f 78 79 3b 20 20 20 20 20 20 20 20 20 2f 2a  roxy;         /*
350c0 20 4f 70 65 6e 20 70 72 6f 78 79 20 6c 6f 63 6b   Open proxy lock
350d0 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
350e0 2a 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 20  *lockProxyPath; 
350f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
35100 6f 66 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63  of the proxy loc
35110 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  k file */.  char
35120 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20 20   *dbPath;       
35130 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
35140 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c   of the open fil
35150 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e 63 68  e */.  int conch
35160 48 65 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  Held;           
35170 20 20 20 20 2f 2a 20 31 20 69 66 20 74 68 65 20      /* 1 if the 
35180 63 6f 6e 63 68 20 69 73 20 68 65 6c 64 2c 20 2d  conch is held, -
35190 31 20 69 66 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f  1 if lockless */
351a0 0a 20 20 69 6e 74 20 6e 46 61 69 6c 73 3b 20 20  .  int nFails;  
351b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
351c0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e  /* Number of con
351d0 63 68 20 74 61 6b 69 6e 67 20 66 61 69 6c 75 72  ch taking failur
351e0 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f 6c  es */.  void *ol
351f0 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  dLockingContext;
35200 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
35210 20 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65 78 74 20   lockingcontext 
35220 74 6f 20 72 65 73 74 6f 72 65 20 6f 6e 20 63 6c  to restore on cl
35230 6f 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ose */.  sqlite3
35240 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73  _io_methods cons
35250 74 20 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b 20 20  t *pOldMethod;  
35260 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 49     /* Original I
35270 2f 4f 20 6d 65 74 68 6f 64 73 20 66 6f 72 20 63  /O methods for c
35280 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a  lose */.};../* .
35290 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63  ** The proxy loc
352a0 6b 20 66 69 6c 65 20 70 61 74 68 20 66 6f 72 20  k file path for 
352b0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20  the database at 
352c0 64 62 50 61 74 68 20 69 73 20 77 72 69 74 74 65  dbPath is writte
352d0 6e 20 69 6e 74 6f 20 6c 50 61 74 68 2c 20 0a 2a  n into lPath, .*
352e0 2a 20 77 68 69 63 68 20 6d 75 73 74 20 70 6f 69  * which must poi
352f0 6e 74 20 74 6f 20 76 61 6c 69 64 2c 20 77 72 69  nt to valid, wri
35300 74 61 62 6c 65 20 6d 65 6d 6f 72 79 20 6c 61 72  table memory lar
35310 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 20  ge enough for a 
35320 6d 61 78 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a 2a  maxLen length.**
35330 20 66 69 6c 65 20 70 61 74 68 2e 20 0a 2a 2f 0a   file path. .*/.
35340 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
35350 47 65 74 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73  GetLockPath(cons
35360 74 20 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20  t char *dbPath, 
35370 63 68 61 72 20 2a 6c 50 61 74 68 2c 20 73 69 7a  char *lPath, siz
35380 65 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a 20 20 69  e_t maxLen){.  i
35390 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 64 62  nt len;.  int db
353a0 4c 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23  Len;.  int i;..#
353b0 69 66 64 65 66 20 4c 4f 43 4b 50 52 4f 58 59 44  ifdef LOCKPROXYD
353c0 49 52 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63  IR.  len = strlc
353d0 70 79 28 6c 50 61 74 68 2c 20 4c 4f 43 4b 50 52  py(lPath, LOCKPR
353e0 4f 58 59 44 49 52 2c 20 6d 61 78 4c 65 6e 29 3b  OXYDIR, maxLen);
353f0 0a 23 65 6c 73 65 0a 23 20 69 66 64 65 66 20 5f  .#else.# ifdef _
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 0a 20 20 7b 0a 20 20 20 20  EMP_DIR.  {.    
35420 69 66 28 20 21 63 6f 6e 66 73 74 72 28 5f 43 53  if( !confstr(_CS
35430 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d  _DARWIN_USER_TEM
35440 50 5f 44 49 52 2c 20 6c 50 61 74 68 2c 20 6d 61  P_DIR, lPath, ma
35450 78 4c 65 6e 29 20 29 7b 0a 20 20 20 20 20 20 4f  xLen) ){.      O
35460 53 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43 4b  STRACE(("GETLOCK
35470 50 41 54 48 20 20 66 61 69 6c 65 64 20 25 73 20  PATH  failed %s 
35480 65 72 72 6e 6f 3d 25 64 20 70 69 64 3d 25 64 5c  errno=%d pid=%d\
35490 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
354a0 20 20 20 6c 50 61 74 68 2c 20 65 72 72 6e 6f 2c     lPath, errno,
354b0 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a   osGetpid(0)));.
354c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
354d0 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a  ITE_IOERR_LOCK;.
354e0 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20      }.    len = 
354f0 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22  strlcat(lPath, "
35500 73 71 6c 69 74 65 70 6c 6f 63 6b 73 22 2c 20 6d  sqliteplocks", m
35510 61 78 4c 65 6e 29 3b 20 20 20 20 0a 20 20 7d 0a  axLen);    .  }.
35520 23 20 65 6c 73 65 0a 20 20 6c 65 6e 20 3d 20 73  # else.  len = s
35530 74 72 6c 63 70 79 28 6c 50 61 74 68 2c 20 22 2f  trlcpy(lPath, "/
35540 74 6d 70 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a  tmp/", maxLen);.
35550 23 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a  # endif.#endif..
35560 20 20 69 66 28 20 6c 50 61 74 68 5b 6c 65 6e 2d    if( lPath[len-
35570 31 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20 6c  1]!='/' ){.    l
35580 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c 50 61  en = strlcat(lPa
35590 74 68 2c 20 22 2f 22 2c 20 6d 61 78 4c 65 6e 29  th, "/", maxLen)
355a0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 74 72  ;.  }.  .  /* tr
355b0 61 6e 73 66 6f 72 6d 20 74 68 65 20 64 62 20 70  ansform the db p
355c0 61 74 68 20 74 6f 20 61 20 75 6e 69 71 75 65 20  ath to a unique 
355d0 63 61 63 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  cache name */.  
355e0 64 62 4c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72  dbLen = (int)str
355f0 6c 65 6e 28 64 62 50 61 74 68 29 3b 0a 20 20 66  len(dbPath);.  f
35600 6f 72 28 20 69 3d 30 3b 20 69 3c 64 62 4c 65 6e  or( i=0; i<dbLen
35610 20 26 26 20 28 69 2b 6c 65 6e 2b 37 29 3c 28 69   && (i+len+7)<(i
35620 6e 74 29 6d 61 78 4c 65 6e 3b 20 69 2b 2b 29 7b  nt)maxLen; i++){
35630 0a 20 20 20 20 63 68 61 72 20 63 20 3d 20 64 62  .    char c = db
35640 50 61 74 68 5b 69 5d 3b 0a 20 20 20 20 6c 50 61  Path[i];.    lPa
35650 74 68 5b 69 2b 6c 65 6e 5d 20 3d 20 28 63 3d 3d  th[i+len] = (c==
35660 27 2f 27 29 3f 27 5f 27 3a 63 3b 0a 20 20 7d 0a  '/')?'_':c;.  }.
35670 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 3d 27    lPath[i+len]='
35680 5c 30 27 3b 0a 20 20 73 74 72 6c 63 61 74 28 6c  \0';.  strlcat(l
35690 50 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 2c 20  Path, ":auto:", 
356a0 6d 61 78 4c 65 6e 29 3b 0a 20 20 4f 53 54 52 41  maxLen);.  OSTRA
356b0 43 45 28 28 22 47 45 54 4c 4f 43 4b 50 41 54 48  CE(("GETLOCKPATH
356c0 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74    proxy lock pat
356d0 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20  h=%s pid=%d\n", 
356e0 6c 50 61 74 68 2c 20 6f 73 47 65 74 70 69 64 28  lPath, osGetpid(
356f0 30 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  0)));.  return S
35700 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
35710 0a 20 2a 2a 20 43 72 65 61 74 65 73 20 74 68 65  . ** Creates the
35720 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6e 64 20 61   lock file and a
35730 6e 79 20 6d 69 73 73 69 6e 67 20 64 69 72 65 63  ny missing direc
35740 74 6f 72 69 65 73 20 69 6e 20 6c 6f 63 6b 50 61  tories in lockPa
35750 74 68 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  th. */.static in
35760 74 20 70 72 6f 78 79 43 72 65 61 74 65 4c 6f 63  t proxyCreateLoc
35770 6b 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61 72  kPath(const char
35780 20 2a 6c 6f 63 6b 50 61 74 68 29 7b 0a 20 20 69   *lockPath){.  i
35790 6e 74 20 69 2c 20 6c 65 6e 3b 0a 20 20 63 68 61  nt i, len;.  cha
357a0 72 20 62 75 66 5b 4d 41 58 50 41 54 48 4c 45 4e  r buf[MAXPATHLEN
357b0 5d 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 20 3d  ];.  int start =
357c0 20 30 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28   0;.  .  assert(
357d0 6c 6f 63 6b 50 61 74 68 21 3d 4e 55 4c 4c 29 3b  lockPath!=NULL);
357e0 0a 20 20 2f 2a 20 74 72 79 20 74 6f 20 63 72 65  .  /* try to cre
357f0 61 74 65 20 61 6c 6c 20 74 68 65 20 69 6e 74 65  ate all the inte
35800 72 6d 65 64 69 61 74 65 20 64 69 72 65 63 74 6f  rmediate directo
35810 72 69 65 73 20 2a 2f 0a 20 20 6c 65 6e 20 3d 20  ries */.  len = 
35820 28 69 6e 74 29 73 74 72 6c 65 6e 28 6c 6f 63 6b  (int)strlen(lock
35830 50 61 74 68 29 3b 0a 20 20 62 75 66 5b 30 5d 20  Path);.  buf[0] 
35840 3d 20 6c 6f 63 6b 50 61 74 68 5b 30 5d 3b 0a 20  = lockPath[0];. 
35850 20 66 6f 72 28 20 69 3d 31 3b 20 69 3c 6c 65 6e   for( i=1; i<len
35860 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 69 66 28  ; i++ ){.    if(
35870 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 20 3d 3d 20   lockPath[i] == 
35880 27 2f 27 20 26 26 20 28 69 20 2d 20 73 74 61 72  '/' && (i - star
35890 74 20 3e 20 30 29 20 29 7b 0a 20 20 20 20 20 20  t > 0) ){.      
358a0 2f 2a 20 6f 6e 6c 79 20 6d 6b 64 69 72 20 69 66  /* only mkdir if
358b0 20 6c 65 61 66 20 64 69 72 20 21 3d 20 22 2e 22   leaf dir != "."
358c0 20 6f 72 20 22 2f 22 20 6f 72 20 22 2e 2e 22 20   or "/" or ".." 
358d0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 2d 73  */.      if( i-s
358e0 74 61 72 74 3e 32 20 7c 7c 20 28 69 2d 73 74 61  tart>2 || (i-sta
358f0 72 74 3d 3d 31 20 26 26 20 62 75 66 5b 73 74 61  rt==1 && buf[sta
35900 72 74 5d 20 21 3d 20 27 2e 27 20 26 26 20 62 75  rt] != '.' && bu
35910 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2f 27 29  f[start] != '/')
35920 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69   .         || (i
35930 2d 73 74 61 72 74 3d 3d 32 20 26 26 20 62 75 66  -start==2 && buf
35940 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e 27 20 26  [start] != '.' &
35950 26 20 62 75 66 5b 73 74 61 72 74 2b 31 5d 20 21  & buf[start+1] !
35960 3d 20 27 2e 27 29 20 29 7b 0a 20 20 20 20 20 20  = '.') ){.      
35970 20 20 62 75 66 5b 69 5d 3d 27 5c 30 27 3b 0a 20    buf[i]='\0';. 
35980 20 20 20 20 20 20 20 69 66 28 20 6f 73 4d 6b 64         if( osMkd
35990 69 72 28 62 75 66 2c 20 53 51 4c 49 54 45 5f 44  ir(buf, SQLITE_D
359a0 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f  EFAULT_PROXYDIR_
359b0 50 45 52 4d 49 53 53 49 4f 4e 53 29 20 29 7b 0a  PERMISSIONS) ){.
359c0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 65 72            int er
359d0 72 3d 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  r=errno;.       
359e0 20 20 20 69 66 28 20 65 72 72 21 3d 45 45 58 49     if( err!=EEXI
359f0 53 54 20 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ST ) {.         
35a00 20 20 20 4f 53 54 52 41 43 45 28 28 22 43 52 45     OSTRACE(("CRE
35a10 41 54 45 4c 4f 43 4b 50 41 54 48 20 20 46 41 49  ATELOCKPATH  FAI
35a20 4c 45 44 20 63 72 65 61 74 69 6e 67 20 25 73 2c  LED creating %s,
35a30 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
35a40 20 20 20 20 20 20 20 20 22 27 25 73 27 20 70 72          "'%s' pr
35a50 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73  oxy lock path=%s
35a60 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20   pid=%d\n",.    
35a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35a80 20 62 75 66 2c 20 73 74 72 65 72 72 6f 72 28 65   buf, strerror(e
35a90 72 72 29 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 6f  rr), lockPath, o
35aa0 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20 20  sGetpid(0)));.  
35ab0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
35ac0 20 65 72 72 3b 0a 20 20 20 20 20 20 20 20 20 20   err;.          
35ad0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
35ae0 20 20 7d 0a 20 20 20 20 20 20 73 74 61 72 74 3d    }.      start=
35af0 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  i+1;.    }.    b
35b00 75 66 5b 69 5d 20 3d 20 6c 6f 63 6b 50 61 74 68  uf[i] = lockPath
35b10 5b 69 5d 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41  [i];.  }.  OSTRA
35b20 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b 50  CE(("CREATELOCKP
35b30 41 54 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20  ATH  proxy lock 
35b40 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e  path=%s pid=%d\n
35b50 22 2c 6c 6f 63 6b 50 61 74 68 2c 6f 73 47 65 74  ",lockPath,osGet
35b60 70 69 64 28 30 29 29 29 3b 0a 20 20 72 65 74 75  pid(0)));.  retu
35b70 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
35b80 72 65 61 74 65 20 61 20 6e 65 77 20 56 46 53 20  reate a new VFS 
35b90 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
35ba0 28 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72  (stored in memor
35bb0 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  y obtained from.
35bc0 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
35bd0 63 29 20 61 6e 64 20 6f 70 65 6e 20 74 68 65 20  c) and open the 
35be0 66 69 6c 65 20 6e 61 6d 65 64 20 22 70 61 74 68  file named "path
35bf0 22 20 69 6e 20 74 68 65 20 66 69 6c 65 20 64 65  " in the file de
35c00 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  scriptor..**.** 
35c10 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65  The caller is re
35c20 73 70 6f 6e 73 69 62 6c 65 20 6e 6f 74 20 6f 6e  sponsible not on
35c30 6c 79 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20 74  ly for closing t
35c40 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
35c50 6f 72 0a 2a 2a 20 62 75 74 20 61 6c 73 6f 20 66  or.** but also f
35c60 6f 72 20 66 72 65 65 69 6e 67 20 74 68 65 20 6d  or freeing the m
35c70 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
35c80 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20 64   with the file d
35c90 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73 74  escriptor..*/.st
35ca0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72  atic int proxyCr
35cb0 65 61 74 65 55 6e 69 78 46 69 6c 65 28 0a 20 20  eateUnixFile(.  
35cc0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61    const char *pa
35cd0 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 70 61  th,        /* pa
35ce0 74 68 20 66 6f 72 20 74 68 65 20 6e 65 77 20 75  th for the new u
35cf0 6e 69 78 46 69 6c 65 20 2a 2f 0a 20 20 20 20 75  nixFile */.    u
35d00 6e 69 78 46 69 6c 65 20 2a 2a 70 70 46 69 6c 65  nixFile **ppFile
35d10 2c 20 20 20 20 20 20 20 2f 2a 20 75 6e 69 78 46  ,       /* unixF
35d20 69 6c 65 20 63 72 65 61 74 65 64 20 61 6e 64 20  ile created and 
35d30 72 65 74 75 72 6e 65 64 20 62 79 20 72 65 66 20  returned by ref 
35d40 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 6c 6f 63  */.    int isloc
35d50 6b 66 69 6c 65 20 20 20 20 20 20 20 20 20 20 20  kfile           
35d60 2f 2a 20 69 66 20 6e 6f 6e 20 7a 65 72 6f 20 6d  /* if non zero m
35d70 69 73 73 69 6e 67 20 64 69 72 73 20 77 69 6c 6c  issing dirs will
35d80 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 29   be created */.)
35d90 20 7b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31   {.  int fd = -1
35da0 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  ;.  unixFile *pN
35db0 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ew;.  int rc = S
35dc0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
35dd0 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44  openFlags = O_RD
35de0 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20 20  WR | O_CREAT;.  
35df0 73 71 6c 69 74 65 33 5f 76 66 73 20 64 75 6d 6d  sqlite3_vfs dumm
35e00 79 56 66 73 3b 0a 20 20 69 6e 74 20 74 65 72 72  yVfs;.  int terr
35e10 6e 6f 20 3d 20 30 3b 0a 20 20 55 6e 69 78 55 6e  no = 0;.  UnixUn
35e20 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20  usedFd *pUnused 
35e30 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 31 2e  = NULL;..  /* 1.
35e40 20 66 69 72 73 74 20 74 72 79 20 74 6f 20 6f 70   first try to op
35e50 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20 66 69  en/create the fi
35e60 6c 65 0a 20 20 2a 2a 20 32 2e 20 69 66 20 74 68  le.  ** 2. if th
35e70 61 74 20 66 61 69 6c 73 2c 20 61 6e 64 20 74 68  at fails, and th
35e80 69 73 20 69 73 20 61 20 6c 6f 63 6b 20 66 69 6c  is is a lock fil
35e90 65 20 28 6e 6f 74 2d 63 6f 6e 63 68 29 2c 20 74  e (not-conch), t
35ea0 72 79 20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a  ry creating.  **
35eb0 20 74 68 65 20 70 61 72 65 6e 74 20 64 69 72 65   the parent dire
35ec0 63 74 6f 72 69 65 73 20 61 6e 64 20 74 68 65 6e  ctories and then
35ed0 20 74 72 79 20 61 67 61 69 6e 2e 0a 20 20 2a 2a   try again..  **
35ee0 20 33 2e 20 69 66 20 74 68 61 74 20 66 61 69 6c   3. if that fail
35ef0 73 2c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 74  s, try to open t
35f00 68 65 20 66 69 6c 65 20 72 65 61 64 2d 6f 6e 6c  he file read-onl
35f10 79 0a 20 20 2a 2a 20 6f 74 68 65 72 77 69 73 65  y.  ** otherwise
35f20 20 72 65 74 75 72 6e 20 42 55 53 59 20 28 69 66   return BUSY (if
35f30 20 6c 6f 63 6b 20 66 69 6c 65 29 20 6f 72 20 43   lock file) or C
35f40 41 4e 54 4f 50 45 4e 20 66 6f 72 20 74 68 65 20  ANTOPEN for the 
35f50 63 6f 6e 63 68 20 66 69 6c 65 0a 20 20 2a 2f 0a  conch file.  */.
35f60 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e 64    pUnused = find
35f70 52 65 75 73 61 62 6c 65 46 64 28 70 61 74 68 2c  ReusableFd(path,
35f80 20 6f 70 65 6e 46 6c 61 67 73 29 3b 0a 20 20 69   openFlags);.  i
35f90 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  f( pUnused ){.  
35fa0 20 20 66 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e    fd = pUnused->
35fb0 66 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  fd;.  }else{.   
35fc0 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69 74   pUnused = sqlit
35fd0 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 69 7a 65  e3_malloc64(size
35fe0 6f 66 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20  of(*pUnused));. 
35ff0 20 20 20 69 66 28 20 21 70 55 6e 75 73 65 64 20     if( !pUnused 
36000 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
36010 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
36020 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 64    }.  }.  if( fd
36030 3c 30 20 29 7b 0a 20 20 20 20 66 64 20 3d 20 72  <0 ){.    fd = r
36040 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c  obust_open(path,
36050 20 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a   openFlags, 0);.
36060 20 20 20 20 74 65 72 72 6e 6f 20 3d 20 65 72 72      terrno = err
36070 6e 6f 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30  no;.    if( fd<0
36080 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e   && errno==ENOEN
36090 54 20 26 26 20 69 73 6c 6f 63 6b 66 69 6c 65 20  T && islockfile 
360a0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 72 6f  ){.      if( pro
360b0 78 79 43 72 65 61 74 65 4c 6f 63 6b 50 61 74 68  xyCreateLockPath
360c0 28 70 61 74 68 29 20 3d 3d 20 53 51 4c 49 54 45  (path) == SQLITE
360d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 66  _OK ){.        f
360e0 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  d = robust_open(
360f0 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c  path, openFlags,
36100 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
36110 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c   }.  }.  if( fd<
36120 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 46 6c 61  0 ){.    openFla
36130 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20  gs = O_RDONLY;. 
36140 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f     fd = robust_o
36150 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c  pen(path, openFl
36160 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 74 65 72  ags, 0);.    ter
36170 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d  rno = errno;.  }
36180 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20  .  if( fd<0 ){. 
36190 20 20 20 69 66 28 20 69 73 6c 6f 63 6b 66 69 6c     if( islockfil
361a0 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
361b0 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
361c0 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 20     }.    switch 
361d0 28 74 65 72 72 6e 6f 29 20 7b 0a 20 20 20 20 20  (terrno) {.     
361e0 20 63 61 73 65 20 45 41 43 43 45 53 3a 0a 20 20   case EACCES:.  
361f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
36200 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20  ITE_PERM;.      
36210 63 61 73 65 20 45 49 4f 3a 20 0a 20 20 20 20 20  case EIO: .     
36220 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
36230 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 20 2f 2a 20  _IOERR_LOCK; /* 
36240 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69  even though it i
36250 73 20 74 68 65 20 63 6f 6e 63 68 20 2a 2f 0a 20  s the conch */. 
36260 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20       default:.  
36270 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
36280 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
36290 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  T;.    }.  }.  .
362a0 20 20 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69    pNew = (unixFi
362b0 6c 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  le *)sqlite3_mal
362c0 6c 6f 63 36 34 28 73 69 7a 65 6f 66 28 2a 70 4e  loc64(sizeof(*pN
362d0 65 77 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  ew));.  if( pNew
362e0 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63  ==NULL ){.    rc
362f0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
36300 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 63 72  .    goto end_cr
36310 65 61 74 65 5f 70 72 6f 78 79 3b 0a 20 20 7d 0a  eate_proxy;.  }.
36320 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30    memset(pNew, 0
36330 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c  , sizeof(unixFil
36340 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 65  e));.  pNew->ope
36350 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61  nFlags = openFla
36360 67 73 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 75  gs;.  memset(&du
36370 6d 6d 79 56 66 73 2c 20 30 2c 20 73 69 7a 65 6f  mmyVfs, 0, sizeo
36380 66 28 64 75 6d 6d 79 56 66 73 29 29 3b 0a 20 20  f(dummyVfs));.  
36390 64 75 6d 6d 79 56 66 73 2e 70 41 70 70 44 61 74  dummyVfs.pAppDat
363a0 61 20 3d 20 28 76 6f 69 64 2a 29 26 61 75 74 6f  a = (void*)&auto
363b0 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 3b 0a 20 20  lockIoFinder;.  
363c0 64 75 6d 6d 79 56 66 73 2e 7a 4e 61 6d 65 20 3d  dummyVfs.zName =
363d0 20 22 64 75 6d 6d 79 22 3b 0a 20 20 70 55 6e 75   "dummy";.  pUnu
363e0 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20  sed->fd = fd;.  
363f0 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d  pUnused->flags =
36400 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 70 4e   openFlags;.  pN
36410 65 77 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 55  ew->pUnused = pU
36420 6e 75 73 65 64 3b 0a 20 20 0a 20 20 72 63 20 3d  nused;.  .  rc =
36430 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28   fillInUnixFile(
36440 26 64 75 6d 6d 79 56 66 73 2c 20 66 64 2c 20 28  &dummyVfs, fd, (
36450 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 4e  sqlite3_file*)pN
36460 65 77 2c 20 70 61 74 68 2c 20 30 29 3b 0a 20 20  ew, path, 0);.  
36470 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
36480 4b 20 29 7b 0a 20 20 20 20 2a 70 70 46 69 6c 65  K ){.    *ppFile
36490 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 72 65 74   = pNew;.    ret
364a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
364b0 20 7d 0a 65 6e 64 5f 63 72 65 61 74 65 5f 70 72   }.end_create_pr
364c0 6f 78 79 3a 20 20 20 20 0a 20 20 72 6f 62 75 73  oxy:    .  robus
364d0 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 66 64  t_close(pNew, fd
364e0 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 73  , __LINE__);.  s
364f0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
36500 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
36510 65 28 70 55 6e 75 73 65 64 29 3b 0a 20 20 72 65  e(pUnused);.  re
36520 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
36530 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
36540 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69  * simulate multi
36550 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63 72 65  ple hosts by cre
36560 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68 6f 73  ating unique hos
36570 74 69 64 20 66 69 6c 65 20 70 61 74 68 73 20 2a  tid file paths *
36580 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 68 6f  /.int sqlite3_ho
36590 73 74 69 64 5f 6e 75 6d 20 3d 20 30 3b 0a 23 65  stid_num = 0;.#e
365a0 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 50 52  ndif..#define PR
365b0 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 20 20  OXY_HOSTIDLEN   
365c0 20 31 36 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69   16  /* conch fi
365d0 6c 65 20 68 6f 73 74 20 69 64 20 6c 65 6e 67 74  le host id lengt
365e0 68 20 2a 2f 0a 0a 23 69 66 64 65 66 20 48 41 56  h */..#ifdef HAV
365f0 45 5f 47 45 54 48 4f 53 54 55 55 49 44 0a 2f 2a  E_GETHOSTUUID./*
36600 20 4e 6f 74 20 61 6c 77 61 79 73 20 64 65 66 69   Not always defi
36610 6e 65 64 20 69 6e 20 74 68 65 20 68 65 61 64 65  ned in the heade
36620 72 73 20 61 73 20 69 74 20 6f 75 67 68 74 20 74  rs as it ought t
36630 6f 20 62 65 20 2a 2f 0a 65 78 74 65 72 6e 20 69  o be */.extern i
36640 6e 74 20 67 65 74 68 6f 73 74 75 75 69 64 28 75  nt gethostuuid(u
36650 75 69 64 5f 74 20 69 64 2c 20 63 6f 6e 73 74 20  uid_t id, const 
36660 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20  struct timespec 
36670 2a 77 61 69 74 29 3b 0a 23 65 6e 64 69 66 0a 0a  *wait);.#endif..
36680 2f 2a 20 67 65 74 20 74 68 65 20 68 6f 73 74 20  /* get the host 
36690 49 44 20 76 69 61 20 67 65 74 68 6f 73 74 75 75  ID via gethostuu
366a0 69 64 28 29 2c 20 70 48 6f 73 74 49 44 20 6d 75  id(), pHostID mu
366b0 73 74 20 70 6f 69 6e 74 20 74 6f 20 50 52 4f 58  st point to PROX
366c0 59 5f 48 4f 53 54 49 44 4c 45 4e 20 0a 2a 2a 20  Y_HOSTIDLEN .** 
366d0 62 79 74 65 73 20 6f 66 20 77 72 69 74 61 62 6c  bytes of writabl
366e0 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  e memory..*/.sta
366f0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74  tic int proxyGet
36700 48 6f 73 74 49 44 28 75 6e 73 69 67 6e 65 64 20  HostID(unsigned 
36710 63 68 61 72 20 2a 70 48 6f 73 74 49 44 2c 20 69  char *pHostID, i
36720 6e 74 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 61  nt *pError){.  a
36730 73 73 65 72 74 28 50 52 4f 58 59 5f 48 4f 53 54  ssert(PROXY_HOST
36740 49 44 4c 45 4e 20 3d 3d 20 73 69 7a 65 6f 66 28  IDLEN == sizeof(
36750 75 75 69 64 5f 74 29 29 3b 0a 20 20 6d 65 6d 73  uuid_t));.  mems
36760 65 74 28 70 48 6f 73 74 49 44 2c 20 30 2c 20 50  et(pHostID, 0, P
36770 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b  ROXY_HOSTIDLEN);
36780 0a 23 69 66 64 65 66 20 48 41 56 45 5f 47 45 54  .#ifdef HAVE_GET
36790 48 4f 53 54 55 55 49 44 0a 20 20 7b 0a 20 20 20  HOSTUUID.  {.   
367a0 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63   struct timespec
367b0 20 74 69 6d 65 6f 75 74 20 3d 20 7b 31 2c 20 30   timeout = {1, 0
367c0 7d 3b 20 2f 2a 20 31 20 73 65 63 20 74 69 6d 65  }; /* 1 sec time
367d0 6f 75 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 67  out */.    if( g
367e0 65 74 68 6f 73 74 75 75 69 64 28 70 48 6f 73 74  ethostuuid(pHost
367f0 49 44 2c 20 26 74 69 6d 65 6f 75 74 29 20 29 7b  ID, &timeout) ){
36800 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d  .      int err =
36810 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66   errno;.      if
36820 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  ( pError ){.    
36830 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 72      *pError = er
36840 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  r;.      }.     
36850 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
36860 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OERR;.    }.  }.
36870 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
36880 41 52 41 4d 45 54 45 52 28 70 45 72 72 6f 72 29  ARAMETER(pError)
36890 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
368a0 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f 2a  SQLITE_TEST.  /*
368b0 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70   simulate multip
368c0 6c 65 20 68 6f 73 74 73 20 62 79 20 63 72 65 61  le hosts by crea
368d0 74 69 6e 67 20 75 6e 69 71 75 65 20 68 6f 73 74  ting unique host
368e0 69 64 20 66 69 6c 65 20 70 61 74 68 73 20 2a 2f  id file paths */
368f0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 68  .  if( sqlite3_h
36900 6f 73 74 69 64 5f 6e 75 6d 20 21 3d 20 30 29 7b  ostid_num != 0){
36910 0a 20 20 20 20 70 48 6f 73 74 49 44 5b 30 5d 20  .    pHostID[0] 
36920 3d 20 28 63 68 61 72 29 28 70 48 6f 73 74 49 44  = (char)(pHostID
36930 5b 30 5d 20 2b 20 28 63 68 61 72 29 28 73 71 6c  [0] + (char)(sql
36940 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20  ite3_hostid_num 
36950 26 20 30 78 46 46 29 29 3b 0a 20 20 7d 0a 23 65  & 0xFF));.  }.#e
36960 6e 64 69 66 0a 20 20 0a 20 20 72 65 74 75 72 6e  ndif.  .  return
36970 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
36980 2a 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  * The conch file
36990 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 68 65   contains the he
369a0 61 64 65 72 2c 20 68 6f 73 74 20 69 64 20 61 6e  ader, host id an
369b0 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68  d lock file path
369c0 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f  . */.#define PRO
369d0 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 20  XY_CONCHVERSION 
369e0 32 20 20 20 2f 2a 20 31 2d 62 79 74 65 20 68 65  2   /* 1-byte he
369f0 61 64 65 72 2c 20 31 36 2d 62 79 74 65 20 68 6f  ader, 16-byte ho
36a00 73 74 20 69 64 2c 20 70 61 74 68 20 2a 2f 0a 23  st id, path */.#
36a10 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 48 45 41  define PROXY_HEA
36a20 44 45 52 4c 45 4e 20 20 20 20 31 20 20 20 2f 2a  DERLEN    1   /*
36a30 20 63 6f 6e 63 68 20 66 69 6c 65 20 68 65 61 64   conch file head
36a40 65 72 20 6c 65 6e 67 74 68 20 2a 2f 0a 23 64 65  er length */.#de
36a50 66 69 6e 65 20 50 52 4f 58 59 5f 50 41 54 48 49  fine PROXY_PATHI
36a60 4e 44 45 58 20 20 20 20 28 50 52 4f 58 59 5f 48  NDEX    (PROXY_H
36a70 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48  EADERLEN+PROXY_H
36a80 4f 53 54 49 44 4c 45 4e 29 0a 23 64 65 66 69 6e  OSTIDLEN).#defin
36a90 65 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48  e PROXY_MAXCONCH
36aa0 4c 45 4e 20 20 28 50 52 4f 58 59 5f 48 45 41 44  LEN  (PROXY_HEAD
36ab0 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54  ERLEN+PROXY_HOST
36ac0 49 44 4c 45 4e 2b 4d 41 58 50 41 54 48 4c 45 4e  IDLEN+MAXPATHLEN
36ad0 29 0a 0a 2f 2a 20 0a 2a 2a 20 54 61 6b 65 73 20  )../* .** Takes 
36ae0 61 6e 20 6f 70 65 6e 20 63 6f 6e 63 68 20 66 69  an open conch fi
36af0 6c 65 2c 20 63 6f 70 69 65 73 20 74 68 65 20 63  le, copies the c
36b00 6f 6e 74 65 6e 74 73 20 74 6f 20 61 20 6e 65 77  ontents to a new
36b10 20 70 61 74 68 20 61 6e 64 20 74 68 65 6e 20 6d   path and then m
36b20 6f 76 65 73 20 0a 2a 2a 20 69 74 20 62 61 63 6b  oves .** it back
36b30 2e 20 20 54 68 65 20 6e 65 77 6c 79 20 63 72 65  .  The newly cre
36b40 61 74 65 64 20 66 69 6c 65 27 73 20 66 69 6c 65  ated file's file
36b50 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
36b60 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 0a 2a  ssigned to the.*
36b70 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 73 74 72  * conch file str
36b80 75 63 74 75 72 65 20 61 6e 64 20 66 69 6e 61 6c  ucture and final
36b90 6c 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  ly the original 
36ba0 63 6f 6e 63 68 20 66 69 6c 65 20 64 65 73 63 72  conch file descr
36bb0 69 70 74 6f 72 20 69 73 20 0a 2a 2a 20 63 6c 6f  iptor is .** clo
36bc0 73 65 64 2e 20 20 52 65 74 75 72 6e 73 20 7a 65  sed.  Returns ze
36bd0 72 6f 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  ro if successful
36be0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
36bf0 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c  proxyBreakConchL
36c00 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ock(unixFile *pF
36c10 69 6c 65 2c 20 75 75 69 64 5f 74 20 6d 79 48 6f  ile, uuid_t myHo
36c20 73 74 49 44 29 7b 0a 20 20 70 72 6f 78 79 4c 6f  stID){.  proxyLo
36c30 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
36c40 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
36c50 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c  ngContext *)pFil
36c60 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
36c70 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  t; .  unixFile *
36c80 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78  conchFile = pCtx
36c90 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 63  ->conchFile;.  c
36ca0 68 61 72 20 74 50 61 74 68 5b 4d 41 58 50 41 54  har tPath[MAXPAT
36cb0 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20 62 75  HLEN];.  char bu
36cc0 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48  f[PROXY_MAXCONCH
36cd0 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20 2a 63 50  LEN];.  char *cP
36ce0 61 74 68 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63  ath = pCtx->conc
36cf0 68 46 69 6c 65 50 61 74 68 3b 0a 20 20 73 69 7a  hFilePath;.  siz
36d00 65 5f 74 20 72 65 61 64 4c 65 6e 20 3d 20 30 3b  e_t readLen = 0;
36d10 0a 20 20 73 69 7a 65 5f 74 20 70 61 74 68 4c 65  .  size_t pathLe
36d20 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 65 72  n = 0;.  char er
36d30 72 6d 73 67 5b 36 34 5d 20 3d 20 22 22 3b 0a 20  rmsg[64] = "";. 
36d40 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20   int fd = -1;.  
36d50 69 6e 74 20 72 63 20 3d 20 2d 31 3b 0a 20 20 55  int rc = -1;.  U
36d60 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
36d70 6d 79 48 6f 73 74 49 44 29 3b 0a 0a 20 20 2f 2a  myHostID);..  /*
36d80 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 70 61   create a new pa
36d90 74 68 20 62 79 20 72 65 70 6c 61 63 65 20 74 68  th by replace th
36da0 65 20 74 72 61 69 6c 69 6e 67 20 27 2d 63 6f 6e  e trailing '-con
36db0 63 68 27 20 77 69 74 68 20 27 2d 62 72 65 61 6b  ch' with '-break
36dc0 27 20 2a 2f 0a 20 20 70 61 74 68 4c 65 6e 20 3d  ' */.  pathLen =
36dd0 20 73 74 72 6c 63 70 79 28 74 50 61 74 68 2c 20   strlcpy(tPath, 
36de0 63 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45  cPath, MAXPATHLE
36df0 4e 29 3b 0a 20 20 69 66 28 20 70 61 74 68 4c 65  N);.  if( pathLe
36e00 6e 3e 4d 41 58 50 41 54 48 4c 45 4e 20 7c 7c 20  n>MAXPATHLEN || 
36e10 70 61 74 68 4c 65 6e 3c 36 20 7c 7c 20 0a 20 20  pathLen<6 || .  
36e20 20 20 20 28 73 74 72 6c 63 70 79 28 26 74 50 61     (strlcpy(&tPa
36e30 74 68 5b 70 61 74 68 4c 65 6e 2d 35 5d 2c 20 22  th[pathLen-5], "
36e40 62 72 65 61 6b 22 2c 20 36 29 20 21 3d 20 35 29  break", 6) != 5)
36e50 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
36e60 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
36e70 65 72 72 6d 73 67 29 2c 65 72 72 6d 73 67 2c 22  errmsg),errmsg,"
36e80 70 61 74 68 20 65 72 72 6f 72 20 28 6c 65 6e 20  path error (len 
36e90 25 64 29 22 2c 28 69 6e 74 29 70 61 74 68 4c 65  %d)",(int)pathLe
36ea0 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  n);.    goto end
36eb0 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a  _breaklock;.  }.
36ec0 20 20 2f 2a 20 72 65 61 64 20 74 68 65 20 63 6f    /* read the co
36ed0 6e 63 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  nch content */. 
36ee0 20 72 65 61 64 4c 65 6e 20 3d 20 6f 73 50 72 65   readLen = osPre
36ef0 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  ad(conchFile->h,
36f00 20 62 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43   buf, PROXY_MAXC
36f10 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 69  ONCHLEN, 0);.  i
36f20 66 28 20 72 65 61 64 4c 65 6e 3c 50 52 4f 58 59  f( readLen<PROXY
36f30 5f 50 41 54 48 49 4e 44 45 58 20 29 7b 0a 20 20  _PATHINDEX ){.  
36f40 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
36f50 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67  tf(sizeof(errmsg
36f60 29 2c 65 72 72 6d 73 67 2c 22 72 65 61 64 20 65  ),errmsg,"read e
36f70 72 72 6f 72 20 28 6c 65 6e 20 25 64 29 22 2c 28  rror (len %d)",(
36f80 69 6e 74 29 72 65 61 64 4c 65 6e 29 3b 0a 20 20  int)readLen);.  
36f90 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b    goto end_break
36fa0 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20 77  lock;.  }.  /* w
36fb0 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74  rite it out to t
36fc0 68 65 20 74 65 6d 70 6f 72 61 72 79 20 62 72 65  he temporary bre
36fd0 61 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 66 64 20  ak file */.  fd 
36fe0 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 74 50  = robust_open(tP
36ff0 61 74 68 2c 20 28 4f 5f 52 44 57 52 7c 4f 5f 43  ath, (O_RDWR|O_C
37000 52 45 41 54 7c 4f 5f 45 58 43 4c 29 2c 20 30 29  REAT|O_EXCL), 0)
37010 3b 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a  ;.  if( fd<0 ){.
37020 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
37030 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d  intf(sizeof(errm
37040 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22 63 72  sg), errmsg, "cr
37050 65 61 74 65 20 66 61 69 6c 65 64 20 28 25 64 29  eate failed (%d)
37060 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67  ", errno);.    g
37070 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63  oto end_breakloc
37080 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 50  k;.  }.  if( osP
37090 77 72 69 74 65 28 66 64 2c 20 62 75 66 2c 20 72  write(fd, buf, r
370a0 65 61 64 4c 65 6e 2c 20 30 29 20 21 3d 20 28 73  eadLen, 0) != (s
370b0 73 69 7a 65 5f 74 29 72 65 61 64 4c 65 6e 20 29  size_t)readLen )
370c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
370d0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72  printf(sizeof(er
370e0 72 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22  rmsg), errmsg, "
370f0 77 72 69 74 65 20 66 61 69 6c 65 64 20 28 25 64  write failed (%d
37100 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  )", errno);.    
37110 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f  goto end_breaklo
37120 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 65  ck;.  }.  if( re
37130 6e 61 6d 65 28 74 50 61 74 68 2c 20 63 50 61 74  name(tPath, cPat
37140 68 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  h) ){.    sqlite
37150 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
37160 66 28 65 72 72 6d 73 67 29 2c 20 65 72 72 6d 73  f(errmsg), errms
37170 67 2c 20 22 72 65 6e 61 6d 65 20 66 61 69 6c 65  g, "rename faile
37180 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b  d (%d)", errno);
37190 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72  .    goto end_br
371a0 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72  eaklock;.  }.  r
371b0 63 20 3d 20 30 3b 0a 20 20 66 70 72 69 6e 74 66  c = 0;.  fprintf
371c0 28 73 74 64 65 72 72 2c 20 22 62 72 6f 6b 65 20  (stderr, "broke 
371d0 73 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73  stale lock on %s
371e0 5c 6e 22 2c 20 63 50 61 74 68 29 3b 0a 20 20 72  \n", cPath);.  r
371f0 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c  obust_close(pFil
37200 65 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  e, conchFile->h,
37210 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 63 6f   __LINE__);.  co
37220 6e 63 68 46 69 6c 65 2d 3e 68 20 3d 20 66 64 3b  nchFile->h = fd;
37230 0a 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70  .  conchFile->op
37240 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52  enFlags = O_RDWR
37250 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 0a 65 6e 64   | O_CREAT;..end
37260 5f 62 72 65 61 6b 6c 6f 63 6b 3a 0a 20 20 69 66  _breaklock:.  if
37270 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20  ( rc ){.    if( 
37280 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f  fd>=0 ){.      o
37290 73 55 6e 6c 69 6e 6b 28 74 50 61 74 68 29 3b 0a  sUnlink(tPath);.
372a0 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
372b0 73 65 28 70 46 69 6c 65 2c 20 66 64 2c 20 5f 5f  se(pFile, fd, __
372c0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20  LINE__);.    }. 
372d0 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
372e0 72 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 62 72  r, "failed to br
372f0 65 61 6b 20 73 74 61 6c 65 20 6c 6f 63 6b 20 6f  eak stale lock o
37300 6e 20 25 73 2c 20 25 73 5c 6e 22 2c 20 63 50 61  n %s, %s\n", cPa
37310 74 68 2c 20 65 72 72 6d 73 67 29 3b 0a 20 20 7d  th, errmsg);.  }
37320 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
37330 0a 2f 2a 20 54 61 6b 65 20 74 68 65 20 72 65 71  ./* Take the req
37340 75 65 73 74 65 64 20 6c 6f 63 6b 20 6f 6e 20 74  uested lock on t
37350 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 61 6e  he conch file an
37360 64 20 62 72 65 61 6b 20 61 20 73 74 61 6c 65 20  d break a stale 
37370 6c 6f 63 6b 20 69 66 20 74 68 65 20 0a 2a 2a 20  lock if the .** 
37380 68 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73 2e  host id matches.
37390 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
373a0 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e  roxyConchLock(un
373b0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75  ixFile *pFile, u
373c0 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 2c 20  uid_t myHostID, 
373d0 69 6e 74 20 6c 6f 63 6b 54 79 70 65 29 7b 0a 20  int lockType){. 
373e0 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
373f0 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72  text *pCtx = (pr
37400 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
37410 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  t *)pFile->locki
37420 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75 6e  ngContext; .  un
37430 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c  ixFile *conchFil
37440 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46  e = pCtx->conchF
37450 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ile;.  int rc = 
37460 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
37470 20 6e 54 72 69 65 73 20 3d 20 30 3b 0a 20 20 73   nTries = 0;.  s
37480 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 63  truct timespec c
37490 6f 6e 63 68 4d 6f 64 54 69 6d 65 3b 0a 20 20 0a  onchModTime;.  .
374a0 20 20 6d 65 6d 73 65 74 28 26 63 6f 6e 63 68 4d    memset(&conchM
374b0 6f 64 54 69 6d 65 2c 20 30 2c 20 73 69 7a 65 6f  odTime, 0, sizeo
374c0 66 28 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 29 29  f(conchModTime))
374d0 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20  ;.  do {.    rc 
374e0 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65  = conchFile->pMe
374f0 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c  thod->xLock((sql
37500 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68  ite3_file*)conch
37510 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29 3b  File, lockType);
37520 0a 20 20 20 20 6e 54 72 69 65 73 20 2b 2b 3b 0a  .    nTries ++;.
37530 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
37540 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
37550 20 2f 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 20   /* If the lock 
37560 66 61 69 6c 65 64 20 28 62 75 73 79 29 3a 0a 20  failed (busy):. 
37570 20 20 20 20 20 20 2a 20 31 73 74 20 74 72 79 3a        * 1st try:
37580 20 67 65 74 20 74 68 65 20 6d 6f 64 20 74 69 6d   get the mod tim
37590 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 2c 20  e of the conch, 
375a0 77 61 69 74 20 30 2e 35 73 20 61 6e 64 20 74 72  wait 0.5s and tr
375b0 79 20 61 67 61 69 6e 2e 20 0a 20 20 20 20 20 20  y again. .      
375c0 20 2a 20 32 6e 64 20 74 72 79 3a 20 66 61 69 6c   * 2nd try: fail
375d0 20 69 66 20 74 68 65 20 6d 6f 64 20 74 69 6d 65   if the mod time
375e0 20 63 68 61 6e 67 65 64 20 6f 72 20 68 6f 73 74   changed or host
375f0 20 69 64 20 69 73 20 64 69 66 66 65 72 65 6e 74   id is different
37600 2c 20 77 61 69 74 20 0a 20 20 20 20 20 20 20 2a  , wait .       *
37610 20 20 20 20 20 20 20 20 20 20 20 31 30 20 73 65             10 se
37620 63 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 0a  c and try again.
37630 20 20 20 20 20 20 20 2a 20 33 72 64 20 74 72 79         * 3rd try
37640 3a 20 62 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b  : break the lock
37650 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 6f 64 20   unless the mod 
37660 74 69 6d 65 20 68 61 73 20 63 68 61 6e 67 65 64  time has changed
37670 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ..       */.    
37680 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
37690 66 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46  f;.      if( osF
376a0 73 74 61 74 28 63 6f 6e 63 68 46 69 6c 65 2d 3e  stat(conchFile->
376b0 68 2c 20 26 62 75 66 29 20 29 7b 0a 20 20 20 20  h, &buf) ){.    
376c0 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
376d0 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29  no(pFile, errno)
376e0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
376f0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
37700 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  CK;.      }.    
37710 20 20 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72    .      if( nTr
37720 69 65 73 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ies==1 ){.      
37730 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 20 3d    conchModTime =
37740 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65   buf.st_mtimespe
37750 63 3b 0a 20 20 20 20 20 20 20 20 75 73 6c 65 65  c;.        uslee
37760 70 28 35 30 30 30 30 30 29 3b 20 2f 2a 20 77 61  p(500000); /* wa
37770 69 74 20 30 2e 35 20 73 65 63 20 61 6e 64 20 74  it 0.5 sec and t
37780 72 79 20 74 68 65 20 6c 6f 63 6b 20 61 67 61 69  ry the lock agai
37790 6e 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 74  n*/.        cont
377a0 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 7d 0a  inue;  .      }.
377b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
377c0 54 72 69 65 73 3e 31 20 29 3b 0a 20 20 20 20 20  Tries>1 );.     
377d0 20 69 66 28 20 63 6f 6e 63 68 4d 6f 64 54 69 6d   if( conchModTim
377e0 65 2e 74 76 5f 73 65 63 20 21 3d 20 62 75 66 2e  e.tv_sec != buf.
377f0 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f  st_mtimespec.tv_
37800 73 65 63 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  sec || .        
37810 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76   conchModTime.tv
37820 5f 6e 73 65 63 20 21 3d 20 62 75 66 2e 73 74 5f  _nsec != buf.st_
37830 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f 6e 73 65  mtimespec.tv_nse
37840 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  c ){.        ret
37850 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
37860 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a  .      }.      .
37870 20 20 20 20 20 20 69 66 28 20 6e 54 72 69 65 73        if( nTries
37880 3d 3d 32 20 29 7b 20 20 0a 20 20 20 20 20 20 20  ==2 ){  .       
37890 20 63 68 61 72 20 74 42 75 66 5b 50 52 4f 58 59   char tBuf[PROXY
378a0 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20  _MAXCONCHLEN];. 
378b0 20 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d         int len =
378c0 20 6f 73 50 72 65 61 64 28 63 6f 6e 63 68 46 69   osPread(conchFi
378d0 6c 65 2d 3e 68 2c 20 74 42 75 66 2c 20 50 52 4f  le->h, tBuf, PRO
378e0 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 2c 20  XY_MAXCONCHLEN, 
378f0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
37900 6c 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  len<0 ){.       
37910 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
37920 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b  o(pFile, errno);
37930 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
37940 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  n SQLITE_IOERR_L
37950 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  OCK;.        }. 
37960 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e 50         if( len>P
37970 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20 26  ROXY_PATHINDEX &
37980 26 20 74 42 75 66 5b 30 5d 3d 3d 28 63 68 61 72  & tBuf[0]==(char
37990 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53  )PROXY_CONCHVERS
379a0 49 4f 4e 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ION){.          
379b0 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b 20 74  /* don't break t
379c0 68 65 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 68  he lock if the h
379d0 6f 73 74 20 69 64 20 64 6f 65 73 6e 27 74 20 6d  ost id doesn't m
379e0 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20  atch */.        
379f0 20 20 69 66 28 20 30 21 3d 6d 65 6d 63 6d 70 28    if( 0!=memcmp(
37a00 26 74 42 75 66 5b 50 52 4f 58 59 5f 48 45 41 44  &tBuf[PROXY_HEAD
37a10 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44  ERLEN], myHostID
37a20 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  , PROXY_HOSTIDLE
37a30 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  N) ){.          
37a40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
37a50 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20  BUSY;.          
37a60 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
37a70 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 6f  .          /* do
37a80 6e 27 74 20 62 72 65 61 6b 20 74 68 65 20 6c 6f  n't break the lo
37a90 63 6b 20 6f 6e 20 73 68 6f 72 74 20 72 65 61 64  ck on short read
37aa0 20 6f 72 20 61 20 76 65 72 73 69 6f 6e 20 6d 69   or a version mi
37ab0 73 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20  smatch */.      
37ac0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
37ad0 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
37ae0 7d 0a 20 20 20 20 20 20 20 20 75 73 6c 65 65 70  }.        usleep
37af0 28 31 30 30 30 30 30 30 30 29 3b 20 2f 2a 20 77  (10000000); /* w
37b00 61 69 74 20 31 30 20 73 65 63 20 61 6e 64 20 74  ait 10 sec and t
37b10 72 79 20 74 68 65 20 6c 6f 63 6b 20 61 67 61 69  ry the lock agai
37b20 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e  n */.        con
37b30 74 69 6e 75 65 3b 20 0a 20 20 20 20 20 20 7d 0a  tinue; .      }.
37b40 20 20 20 20 20 20 0a 20 20 20 20 20 20 61 73 73        .      ass
37b50 65 72 74 28 20 6e 54 72 69 65 73 3d 3d 33 20 29  ert( nTries==3 )
37b60 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70  ;.      if( 0==p
37b70 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f  roxyBreakConchLo
37b80 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74  ck(pFile, myHost
37b90 49 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ID) ){.        r
37ba0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
37bb0 20 20 20 20 20 20 20 69 66 28 20 6c 6f 63 6b 54         if( lockT
37bc0 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
37bd0 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  OCK ){.         
37be0 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d   rc = conchFile-
37bf0 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28  >pMethod->xLock(
37c00 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63  (sqlite3_file*)c
37c10 6f 6e 63 68 46 69 6c 65 2c 20 53 48 41 52 45 44  onchFile, SHARED
37c20 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
37c30 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 72  }.        if( !r
37c40 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  c ){.          r
37c50 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70  c = conchFile->p
37c60 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73  Method->xLock((s
37c70 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e  qlite3_file*)con
37c80 63 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65  chFile, lockType
37c90 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
37ca0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 77     }.    }.  } w
37cb0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
37cc0 5f 42 55 53 59 20 26 26 20 6e 54 72 69 65 73 3c  _BUSY && nTries<
37cd0 33 20 29 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e  3 );.  .  return
37ce0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 73   rc;.}../* Takes
37cf0 20 74 68 65 20 63 6f 6e 63 68 20 62 79 20 74 61   the conch by ta
37d00 6b 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f  king a shared lo
37d10 63 6b 20 61 6e 64 20 72 65 61 64 20 74 68 65 20  ck and read the 
37d20 63 6f 6e 74 65 6e 74 73 20 63 6f 6e 63 68 2c 20  contents conch, 
37d30 69 66 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20  if .** lockPath 
37d40 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65  is non-NULL, the
37d50 20 68 6f 73 74 20 49 44 20 61 6e 64 20 6c 6f 63   host ID and loc
37d60 6b 20 66 69 6c 65 20 70 61 74 68 20 6d 75 73 74  k file path must
37d70 20 6d 61 74 63 68 2e 20 20 41 20 4e 55 4c 4c 20   match.  A NULL 
37d80 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 6d 65 61  .** lockPath mea
37d90 6e 73 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b  ns that the lock
37da0 50 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63  Path in the conc
37db0 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75  h file will be u
37dc0 73 65 64 20 69 66 20 74 68 65 20 0a 2a 2a 20 68  sed if the .** h
37dd0 6f 73 74 20 49 44 73 20 6d 61 74 63 68 2c 20 6f  ost IDs match, o
37de0 72 20 61 20 6e 65 77 20 6c 6f 63 6b 20 70 61 74  r a new lock pat
37df0 68 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61  h will be genera
37e00 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ted automaticall
37e10 79 20 0a 2a 2a 20 61 6e 64 20 77 72 69 74 74 65  y .** and writte
37e20 6e 20 74 6f 20 74 68 65 20 63 6f 6e 63 68 20 66  n to the conch f
37e30 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
37e40 6e 74 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63  nt proxyTakeConc
37e50 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  h(unixFile *pFil
37e60 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69  e){.  proxyLocki
37e70 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
37e80 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  = (proxyLockingC
37e90 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e  ontext *)pFile->
37ea0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20  lockingContext; 
37eb0 0a 20 20 0a 20 20 69 66 28 20 70 43 74 78 2d 3e  .  .  if( pCtx->
37ec0 63 6f 6e 63 68 48 65 6c 64 21 3d 30 20 29 7b 0a  conchHeld!=0 ){.
37ed0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
37ee0 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
37ef0 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e     unixFile *con
37f00 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63  chFile = pCtx->c
37f10 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 20 20 75 75  onchFile;.    uu
37f20 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 3b 0a 20  id_t myHostID;. 
37f30 20 20 20 69 6e 74 20 70 45 72 72 6f 72 20 3d 20     int pError = 
37f40 30 3b 0a 20 20 20 20 63 68 61 72 20 72 65 61 64  0;.    char read
37f50 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  Buf[PROXY_MAXCON
37f60 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72  CHLEN];.    char
37f70 20 6c 6f 63 6b 50 61 74 68 5b 4d 41 58 50 41 54   lockPath[MAXPAT
37f80 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20  HLEN];.    char 
37f90 2a 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20  *tempLockPath = 
37fa0 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 63  NULL;.    int rc
37fb0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
37fc0 20 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6e 63    int createConc
37fd0 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 68  h = 0;.    int h
37fe0 6f 73 74 49 64 4d 61 74 63 68 20 3d 20 30 3b 0a  ostIdMatch = 0;.
37ff0 20 20 20 20 69 6e 74 20 72 65 61 64 4c 65 6e 20      int readLen 
38000 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 72 79  = 0;.    int try
38010 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b  OldLockPath = 0;
38020 0a 20 20 20 20 69 6e 74 20 66 6f 72 63 65 4e 65  .    int forceNe
38030 77 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20  wLockPath = 0;. 
38040 20 20 20 0a 20 20 20 20 4f 53 54 52 41 43 45 28     .    OSTRACE(
38050 28 22 54 41 4b 45 43 4f 4e 43 48 20 20 25 64 20  ("TAKECONCH  %d 
38060 66 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e 22  for %s pid=%d\n"
38070 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a  , conchFile->h,.
38080 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70 43               (pC
38090 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
380a0 68 20 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  h ? pCtx->lockPr
380b0 6f 78 79 50 61 74 68 20 3a 20 22 3a 61 75 74 6f  oxyPath : ":auto
380c0 3a 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  :"),.           
380d0 20 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b    osGetpid(0)));
380e0 0a 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79  ..    rc = proxy
380f0 47 65 74 48 6f 73 74 49 44 28 6d 79 48 6f 73 74  GetHostID(myHost
38100 49 44 2c 20 26 70 45 72 72 6f 72 29 3b 0a 20 20  ID, &pError);.  
38110 20 20 69 66 28 20 28 72 63 26 30 78 66 66 29 3d    if( (rc&0xff)=
38120 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b  =SQLITE_IOERR ){
38130 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
38140 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 70 45 72  Errno(pFile, pEr
38150 72 6f 72 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ror);.      goto
38160 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a   end_takeconch;.
38170 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 70      }.    rc = p
38180 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 70 46  roxyConchLock(pF
38190 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44 2c 20 53  ile, myHostID, S
381a0 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
381b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
381c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
381d0 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a   end_takeconch;.
381e0 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 72 65 61      }.    /* rea
381f0 64 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 63  d the existing c
38200 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 20  onch file */.   
38210 20 72 65 61 64 4c 65 6e 20 3d 20 73 65 65 6b 41   readLen = seekA
38220 6e 64 52 65 61 64 28 28 75 6e 69 78 46 69 6c 65  ndRead((unixFile
38230 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 30 2c 20  *)conchFile, 0, 
38240 72 65 61 64 42 75 66 2c 20 50 52 4f 58 59 5f 4d  readBuf, PROXY_M
38250 41 58 43 4f 4e 43 48 4c 45 4e 29 3b 0a 20 20 20  AXCONCHLEN);.   
38260 20 69 66 28 20 72 65 61 64 4c 65 6e 3c 30 20 29   if( readLen<0 )
38270 7b 0a 20 20 20 20 20 20 2f 2a 20 49 2f 4f 20 65  {.      /* I/O e
38280 72 72 6f 72 3a 20 6c 61 73 74 45 72 72 6e 6f 20  rror: lastErrno 
38290 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64 52 65  set by seekAndRe
382a0 61 64 20 2a 2f 0a 20 20 20 20 20 20 73 74 6f 72  ad */.      stor
382b0 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
382c0 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 6c 61 73  , conchFile->las
382d0 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72  tErrno);.      r
382e0 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
382f0 5f 52 45 41 44 3b 0a 20 20 20 20 20 20 67 6f 74  _READ;.      got
38300 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b  o end_takeconch;
38310 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72  .    }else if( r
38320 65 61 64 4c 65 6e 3c 3d 28 50 52 4f 58 59 5f 48  eadLen<=(PROXY_H
38330 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48  EADERLEN+PROXY_H
38340 4f 53 54 49 44 4c 45 4e 29 20 7c 7c 20 0a 20 20  OSTIDLEN) || .  
38350 20 20 20 20 20 20 20 20 20 20 20 72 65 61 64 42             readB
38360 75 66 5b 30 5d 21 3d 28 63 68 61 72 29 50 52 4f  uf[0]!=(char)PRO
38370 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 20  XY_CONCHVERSION 
38380 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 20 73 68  ){.      /* a sh
38390 6f 72 74 20 72 65 61 64 20 6f 72 20 76 65 72 73  ort read or vers
383a0 69 6f 6e 20 66 6f 72 6d 61 74 20 6d 69 73 6d 61  ion format misma
383b0 74 63 68 20 6d 65 61 6e 73 20 77 65 20 6e 65 65  tch means we nee
383c0 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65  d to create a ne
383d0 77 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 63  w .      ** conc
383e0 68 20 66 69 6c 65 2e 20 0a 20 20 20 20 20 20 2a  h file. .      *
383f0 2f 0a 20 20 20 20 20 20 63 72 65 61 74 65 43 6f  /.      createCo
38400 6e 63 68 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  nch = 1;.    }. 
38410 20 20 20 2f 2a 20 69 66 20 74 68 65 20 68 6f 73     /* if the hos
38420 74 20 69 64 20 6d 61 74 63 68 65 73 20 61 6e 64  t id matches and
38430 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 61   the lock path a
38440 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69 6e  lready exists in
38450 20 74 68 65 20 63 6f 6e 63 68 0a 20 20 20 20 2a   the conch.    *
38460 2a 20 77 65 27 6c 6c 20 74 72 79 20 74 6f 20 75  * we'll try to u
38470 73 65 20 74 68 65 20 70 61 74 68 20 74 68 65 72  se the path ther
38480 65 2c 20 69 66 20 77 65 20 63 61 6e 27 74 20 6f  e, if we can't o
38490 70 65 6e 20 74 68 61 74 20 70 61 74 68 2c 20 77  pen that path, w
384a0 65 27 6c 6c 20 0a 20 20 20 20 2a 2a 20 72 65 74  e'll .    ** ret
384b0 72 79 20 77 69 74 68 20 61 20 6e 65 77 20 61 75  ry with a new au
384c0 74 6f 2d 67 65 6e 65 72 61 74 65 64 20 70 61 74  to-generated pat
384d0 68 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f  h .    */.    do
384e0 20 7b 20 2f 2a 20 69 6e 20 63 61 73 65 20 77 65   { /* in case we
384f0 20 6e 65 65 64 20 74 6f 20 74 72 79 20 61 67 61   need to try aga
38500 69 6e 20 66 6f 72 20 61 6e 20 3a 61 75 74 6f 3a  in for an :auto:
38510 20 6e 61 6d 65 64 20 6c 6f 63 6b 20 66 69 6c 65   named lock file
38520 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21   */..      if( !
38530 63 72 65 61 74 65 43 6f 6e 63 68 20 26 26 20 21  createConch && !
38540 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61 74 68  forceNewLockPath
38550 20 29 7b 0a 20 20 20 20 20 20 20 20 68 6f 73 74   ){.        host
38560 49 64 4d 61 74 63 68 20 3d 20 21 6d 65 6d 63 6d  IdMatch = !memcm
38570 70 28 26 72 65 61 64 42 75 66 5b 50 52 4f 58 59  p(&readBuf[PROXY
38580 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48  _HEADERLEN], myH
38590 6f 73 74 49 44 2c 20 0a 20 20 20 20 20 20 20 20  ostID, .        
385a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20