/ Hex Artifact Content
Login

Artifact 5808a077bf6842a47d65197f7843d4c391636b75:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e 64 61 72  f../*.** standar
0b40: 64 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 2e  d include files.
0b50: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .*/.#include <sy
0b60: 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c  s/types.h>.#incl
0b70: 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e  ude <sys/stat.h>
0b80: 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c  .#include <fcntl
0b90: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e  .h>.#include <un
0ba0: 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  istd.h>.#include
0bb0: 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75   <time.h>.#inclu
0bc0: 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a  de <sys/time.h>.
0bd0: 23 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e  #include <errno.
0be0: 68 3e 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  h>.#if !defined(
0bf0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
0c00: 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   || SQLITE_MAX_M
0c10: 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 69 6e 63  MAP_SIZE>0.# inc
0c20: 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e 2e 68  lude <sys/mman.h
0c30: 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  >.#endif..#if SQ
0c40: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
0c50: 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c  ING_STYLE.# incl
0c60: 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68  ude <sys/ioctl.h
0c70: 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73  >.# include <sys
0c80: 2f 66 69 6c 65 2e 68 3e 0a 23 20 69 6e 63 6c 75  /file.h>.# inclu
0c90: 64 65 20 3c 73 79 73 2f 70 61 72 61 6d 2e 68 3e  de <sys/param.h>
0ca0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
0cb0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
0cc0: 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 64  _STYLE */..#if d
0cd0: 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
0ce0: 29 20 26 26 20 28 28 5f 5f 4d 41 43 5f 4f 53 5f  ) && ((__MAC_OS_
0cf0: 58 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45  X_VERSION_MIN_RE
0d00: 51 55 49 52 45 44 20 3e 20 31 30 35 30 29 20 7c  QUIRED > 1050) |
0d10: 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  | \.            
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
0d30: 5f 5f 49 50 48 4f 4e 45 5f 4f 53 5f 56 45 52 53  __IPHONE_OS_VERS
0d40: 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44  ION_MIN_REQUIRED
0d50: 20 3e 20 32 30 30 30 29 29 0a 23 20 20 69 66 20   > 2000)).#  if 
0d60: 28 21 64 65 66 69 6e 65 64 28 54 41 52 47 45 54  (!defined(TARGET
0d70: 5f 4f 53 5f 45 4d 42 45 44 44 45 44 29 20 7c 7c  _OS_EMBEDDED) ||
0d80: 20 28 54 41 52 47 45 54 5f 4f 53 5f 45 4d 42 45   (TARGET_OS_EMBE
0d90: 44 44 45 44 3d 3d 30 29 29 20 5c 0a 20 20 20 20  DDED==0)) \.    
0da0: 20 20 20 26 26 20 28 21 64 65 66 69 6e 65 64 28     && (!defined(
0db0: 54 41 52 47 45 54 5f 49 50 48 4f 4e 45 5f 53 49  TARGET_IPHONE_SI
0dc0: 4d 55 4c 41 54 4f 52 29 20 7c 7c 20 28 54 41 52  MULATOR) || (TAR
0dd0: 47 45 54 5f 49 50 48 4f 4e 45 5f 53 49 4d 55 4c  GET_IPHONE_SIMUL
0de0: 41 54 4f 52 3d 3d 30 29 29 0a 23 20 20 20 20 64  ATOR==0)).#    d
0df0: 65 66 69 6e 65 20 48 41 56 45 5f 47 45 54 48 4f  efine HAVE_GETHO
0e00: 53 54 55 55 49 44 20 31 0a 23 20 20 65 6c 73 65  STUUID 1.#  else
0e10: 0a 23 20 20 20 20 77 61 72 6e 69 6e 67 20 22 67  .#    warning "g
0e20: 65 74 68 6f 73 74 75 75 69 64 28 29 20 69 73 20  ethostuuid() is 
0e30: 64 69 73 61 62 6c 65 64 2e 22 0a 23 20 20 65 6e  disabled.".#  en
0e40: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  dif.#endif...#if
0e50: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 23 20 69 6e   OS_VXWORKS.# in
0e60: 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c  clude <sys/ioctl
0e70: 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73  .h>.# include <s
0e80: 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20 69 6e  emaphore.h>.# in
0e90: 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e  clude <limits.h>
0ea0: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
0eb0: 57 4f 52 4b 53 20 2a 2f 0a 0a 23 69 66 20 64 65  WORKS */..#if de
0ec0: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0ed0: 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   || SQLITE_ENABL
0ee0: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
0ef0: 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d  # include <sys/m
0f00: 6f 75 6e 74 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a  ount.h>.#endif..
0f10: 23 69 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d  #ifdef HAVE_UTIM
0f20: 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 74 69  E.# include <uti
0f30: 6d 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a  me.h>.#endif../*
0f40: 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75  .** Allowed valu
0f50: 65 73 20 6f 66 20 75 6e 69 78 46 69 6c 65 2e 66  es of unixFile.f
0f60: 73 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e  sFlags.*/.#defin
0f70: 65 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53  e SQLITE_FSFLAGS
0f80: 5f 49 53 5f 4d 53 44 4f 53 20 20 20 20 20 30 78  _IS_MSDOS     0x
0f90: 31 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61  1../*.** If we a
0fa0: 72 65 20 74 6f 20 62 65 20 74 68 72 65 61 64 2d  re to be thread-
0fb0: 73 61 66 65 2c 20 69 6e 63 6c 75 64 65 20 74 68  safe, include th
0fc0: 65 20 70 74 68 72 65 61 64 73 20 68 65 61 64 65  e pthreads heade
0fd0: 72 20 61 6e 64 20 64 65 66 69 6e 65 0a 2a 2a 20  r and define.** 
0fe0: 74 68 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  the SQLITE_UNIX_
0ff0: 54 48 52 45 41 44 53 20 6d 61 63 72 6f 2e 0a 2a  THREADS macro..*
1000: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  /.#if SQLITE_THR
1010: 45 41 44 53 41 46 45 0a 23 20 69 6e 63 6c 75 64  EADSAFE.# includ
1020: 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 20  e <pthread.h>.# 
1030: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 55 4e  define SQLITE_UN
1040: 49 58 5f 54 48 52 45 41 44 53 20 31 0a 23 65 6e  IX_THREADS 1.#en
1050: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75  dif../*.** Defau
1060: 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 77  lt permissions w
1070: 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20 6e  hen creating a n
1080: 65 77 20 66 69 6c 65 0a 2a 2f 0a 23 69 66 6e 64  ew file.*/.#ifnd
1090: 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ef SQLITE_DEFAUL
10a0: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
10b0: 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  NS.# define SQLI
10c0: 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
10d0: 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 36 34 34  PERMISSIONS 0644
10e0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
10f0: 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f  efault permissio
1100: 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ns when creating
1110: 20 61 75 74 6f 20 70 72 6f 78 79 20 64 69 72 0a   auto proxy dir.
1120: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1130: 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44  E_DEFAULT_PROXYD
1140: 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 23  IR_PERMISSIONS.#
1150: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44   define SQLITE_D
1160: 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f  EFAULT_PROXYDIR_
1170: 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 37 35 35  PERMISSIONS 0755
1180: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
1190: 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64  aximum supported
11a0: 20 70 61 74 68 2d 6c 65 6e 67 74 68 2e 0a 2a 2f   path-length..*/
11b0: 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f 50 41 54  .#define MAX_PAT
11c0: 48 4e 41 4d 45 20 35 31 32 0a 0a 2f 2a 20 41 6c  HNAME 512../* Al
11d0: 77 61 79 73 20 63 61 73 74 20 74 68 65 20 67 65  ways cast the ge
11e0: 74 70 69 64 28 29 20 72 65 74 75 72 6e 20 74 79  tpid() return ty
11f0: 70 65 20 66 6f 72 20 63 6f 6d 70 61 74 69 62 69  pe for compatibi
1200: 6c 69 74 79 20 77 69 74 68 0a 2a 2a 20 6b 65 72  lity with.** ker
1210: 6e 65 6c 20 6d 6f 64 75 6c 65 73 20 69 6e 20 56  nel modules in V
1220: 78 57 6f 72 6b 73 2e 20 2a 2f 0a 23 64 65 66 69  xWorks. */.#defi
1230: 6e 65 20 6f 73 47 65 74 70 69 64 28 58 29 20 28  ne osGetpid(X) (
1240: 70 69 64 5f 74 29 67 65 74 70 69 64 28 29 0a 0a  pid_t)getpid()..
1250: 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74 20 74  /*.** Only set t
1260: 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 69 66 20  he lastErrno if 
1270: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  the error code i
1280: 73 20 61 20 72 65 61 6c 20 65 72 72 6f 72 20 61  s a real error a
1290: 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e 6f 72  nd not .** a nor
12a0: 6d 61 6c 20 65 78 70 65 63 74 65 64 20 72 65 74  mal expected ret
12b0: 75 72 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c 49  urn code of SQLI
12c0: 54 45 5f 42 55 53 59 20 6f 72 20 53 51 4c 49 54  TE_BUSY or SQLIT
12d0: 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  E_OK.*/.#define 
12e0: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 78 29  IS_LOCK_ERROR(x)
12f0: 20 20 28 28 78 20 21 3d 20 53 51 4c 49 54 45 5f    ((x != SQLITE_
1300: 4f 4b 29 20 26 26 20 28 78 20 21 3d 20 53 51 4c  OK) && (x != SQL
1310: 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f 2a 20 46  ITE_BUSY))../* F
1320: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
1330: 73 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  s */.typedef str
1340: 75 63 74 20 75 6e 69 78 53 68 6d 20 75 6e 69 78  uct unixShm unix
1350: 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Shm;            
1360: 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
1370: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
1380: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1390: 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 75 6e 69   unixShmNode uni
13a0: 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20  xShmNode;       
13b0: 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* Shared memory
13c0: 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 74 79 70   instance */.typ
13d0: 65 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78  edef struct unix
13e0: 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69 78 49 6e  InodeInfo unixIn
13f0: 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a 20 41 6e  odeInfo;   /* An
1400: 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79 70 65 64   i-node */.typed
1410: 65 66 20 73 74 72 75 63 74 20 55 6e 69 78 55 6e  ef struct UnixUn
1420: 75 73 65 64 46 64 20 55 6e 69 78 55 6e 75 73 65  usedFd UnixUnuse
1430: 64 46 64 3b 20 20 20 20 20 2f 2a 20 41 6e 20 75  dFd;     /* An u
1440: 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
1450: 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  iptor */../*.** 
1460: 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66 74 65 72  Sometimes, after
1470: 20 61 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 69   a file handle i
1480: 73 20 63 6c 6f 73 65 64 20 62 79 20 53 51 4c 69  s closed by SQLi
1490: 74 65 2c 20 74 68 65 20 66 69 6c 65 20 64 65 73  te, the file des
14a0: 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61 6e 6e 6f  criptor.** canno
14b0: 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65  t be closed imme
14c0: 64 69 61 74 65 6c 79 2e 20 49 6e 20 74 68 65 73  diately. In thes
14d0: 65 20 63 61 73 65 73 2c 20 69 6e 73 74 61 6e 63  e cases, instanc
14e0: 65 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  es of the follow
14f0: 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ing.** structure
1500: 20 61 72 65 20 75 73 65 64 20 74 6f 20 73 74 6f   are used to sto
1510: 72 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  re the file desc
1520: 72 69 70 74 6f 72 20 77 68 69 6c 65 20 77 61 69  riptor while wai
1530: 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a 20 6f  ting for an.** o
1540: 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 65 69  pportunity to ei
1550: 74 68 65 72 20 63 6c 6f 73 65 20 6f 72 20 72 65  ther close or re
1560: 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63  use it..*/.struc
1570: 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 7b  t UnixUnusedFd {
1580: 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20  .  int fd;      
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15a0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
15b0: 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 69 6e  to close */.  in
15c0: 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20  t flags;        
15d0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
15e0: 20 74 68 69 73 20 66 69 6c 65 20 64 65 73 63 72   this file descr
15f0: 69 70 74 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  iptor was opened
1600: 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69 78 55   with */.  UnixU
1610: 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 20  nusedFd *pNext; 
1620: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 75       /* Next unu
1630: 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  sed file descrip
1640: 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69 6c 65  tor on same file
1650: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.};../*.** Th
1660: 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  e unixFile struc
1670: 74 75 72 65 20 69 73 20 73 75 62 63 6c 61 73 73  ture is subclass
1680: 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65   of sqlite3_file
1690: 20 73 70 65 63 69 66 69 63 20 74 6f 20 74 68 65   specific to the
16a0: 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69 6d 70   unix.** VFS imp
16b0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a 2f  lementations..*/
16c0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
16d0: 75 6e 69 78 46 69 6c 65 20 75 6e 69 78 46 69 6c  unixFile unixFil
16e0: 65 3b 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69  e;.struct unixFi
16f0: 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  le {.  sqlite3_i
1700: 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20  o_methods const 
1710: 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41 6c  *pMethod;  /* Al
1720: 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20 65  ways the first e
1730: 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ntry */.  sqlite
1740: 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20  3_vfs *pVfs;    
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1760: 20 54 68 65 20 56 46 53 20 74 68 61 74 20 63 72   The VFS that cr
1770: 65 61 74 65 64 20 74 68 69 73 20 75 6e 69 78 46  eated this unixF
1780: 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  ile */.  unixIno
1790: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20  deInfo *pInode; 
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17b0: 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63 6b 73  Info about locks
17c0: 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a   on this inode *
17d0: 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20  /.  int h;      
17e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
1800: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
1810: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
1820: 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20  r eFileLock;    
1830: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
1840: 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65 6c 64  ype of lock held
1850: 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f 0a 20   on this fd */. 
1860: 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20   unsigned short 
1870: 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 3b 20 20  int ctrlFlags;  
1880: 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69 6f 72       /* Behavior
1890: 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58 46 49  al bits.  UNIXFI
18a0: 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20  LE_* flags */.  
18b0: 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20  int lastErrno;  
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d0: 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69 78 20      /* The unix 
18e0: 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73 74 20  errno from last 
18f0: 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 76  I/O error */.  v
1900: 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74  oid *lockingCont
1910: 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
1920: 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20 73 74     /* Locking st
1930: 79 6c 65 20 73 70 65 63 69 66 69 63 20 73 74 61  yle specific sta
1940: 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73  te */.  UnixUnus
1950: 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20  edFd *pUnused;  
1960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1970: 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55 6e 69  re-allocated Uni
1980: 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20 20 63  xUnusedFd */.  c
1990: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
19a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19b0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
19c0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  e file */.  unix
19d0: 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20 20 20  Shm *pShm;      
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f0: 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* Shared memory
1a00: 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72 6d 61   segment informa
1a10: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  tion */.  int sz
1a20: 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20  Chunk;          
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a40: 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46   Configured by F
1a50: 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20  CNTL_CHUNK_SIZE 
1a60: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  */.#if SQLITE_MA
1a70: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
1a80: 69 6e 74 20 6e 46 65 74 63 68 4f 75 74 3b 20 20  int nFetchOut;  
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1ab0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65   outstanding xFe
1ac0: 74 63 68 20 72 65 66 73 20 2a 2f 0a 20 20 73 71  tch refs */.  sq
1ad0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70  lite3_int64 mmap
1ae0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
1af0: 20 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65    /* Usable size
1b00: 20 6f 66 20 6d 61 70 70 69 6e 67 20 61 74 20 70   of mapping at p
1b10: 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73  MapRegion */.  s
1b20: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61  qlite3_int64 mma
1b30: 70 53 69 7a 65 41 63 74 75 61 6c 3b 20 20 20 20  pSizeActual;    
1b40: 20 20 20 2f 2a 20 41 63 74 75 61 6c 20 73 69 7a     /* Actual siz
1b50: 65 20 6f 66 20 6d 61 70 70 69 6e 67 20 61 74 20  e of mapping at 
1b60: 70 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20  pMapRegion */.  
1b70: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d  sqlite3_int64 mm
1b80: 61 70 53 69 7a 65 4d 61 78 3b 20 20 20 20 20 20  apSizeMax;      
1b90: 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65      /* Configure
1ba0: 64 20 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a  d FCNTL_MMAP_SIZ
1bb0: 45 20 76 61 6c 75 65 20 2a 2f 0a 20 20 76 6f 69  E value */.  voi
1bc0: 64 20 2a 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20  d *pMapRegion;  
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be0: 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65   /* Memory mappe
1bf0: 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 23 65 6e 64  d region */.#end
1c00: 69 66 0a 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e  if.#ifdef __QNXN
1c10: 54 4f 5f 5f 0a 20 20 69 6e 74 20 73 65 63 74 6f  TO__.  int secto
1c20: 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
1c30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
1c40: 76 69 63 65 20 73 65 63 74 6f 72 20 73 69 7a 65  vice sector size
1c50: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 76 69 63 65   */.  int device
1c60: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 3b  Characteristics;
1c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
1c80: 63 6f 6d 70 75 74 65 64 20 64 65 76 69 63 65 20  computed device 
1c90: 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
1ca0: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  */.#endif.#if SQ
1cb0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1cc0: 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20  ING_STYLE.  int 
1cd0: 6f 70 65 6e 46 6c 61 67 73 3b 20 20 20 20 20 20  openFlags;      
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf0: 2f 2a 20 54 68 65 20 66 6c 61 67 73 20 73 70 65  /* The flags spe
1d00: 63 69 66 69 65 64 20 61 74 20 6f 70 65 6e 28 29  cified at open()
1d10: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   */.#endif.#if S
1d20: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1d30: 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 64 65  KING_STYLE || de
1d40: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1d50: 0a 20 20 75 6e 73 69 67 6e 65 64 20 66 73 46 6c  .  unsigned fsFl
1d60: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
1d70: 20 20 20 20 20 20 20 2f 2a 20 63 61 63 68 65 64         /* cached
1d80: 20 64 65 74 61 69 6c 73 20 66 72 6f 6d 20 73 74   details from st
1d90: 61 74 66 73 28 29 20 2a 2f 0a 23 65 6e 64 69 66  atfs() */.#endif
1da0: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
1db0: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
1dc0: 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20  FileId *pId;    
1dd0: 20 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20        /* Unique 
1de0: 66 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69  file ID */.#endi
1df0: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
1e00: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 6e  DEBUG.  /* The n
1e10: 65 78 74 20 67 72 6f 75 70 20 6f 66 20 76 61 72  ext group of var
1e20: 69 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20  iables are used 
1e30: 74 6f 20 74 72 61 63 6b 20 77 68 65 74 68 65 72  to track whether
1e40: 20 6f 72 20 6e 6f 74 20 74 68 65 0a 20 20 2a 2a   or not the.  **
1e50: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1e60: 6e 74 65 72 20 69 6e 20 62 79 74 65 73 20 32 34  nter in bytes 24
1e70: 2d 32 37 20 6f 66 20 64 61 74 61 62 61 73 65 20  -27 of database 
1e80: 66 69 6c 65 73 20 61 72 65 20 75 70 64 61 74 65  files are update
1e90: 64 0a 20 20 2a 2a 20 77 68 65 6e 65 76 65 72 20  d.  ** whenever 
1ea0: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
1eb0: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
1ec0: 2e 20 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  .  An assertion 
1ed0: 66 61 75 6c 74 20 77 69 6c 6c 0a 20 20 2a 2a 20  fault will.  ** 
1ee0: 6f 63 63 75 72 20 69 66 20 61 20 66 69 6c 65 20  occur if a file 
1ef0: 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 6f  is updated witho
1f00: 75 74 20 61 6c 73 6f 20 75 70 64 61 74 69 6e 67  ut also updating
1f10: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1f20: 0a 20 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20 20  .  ** counter.  
1f30: 54 68 69 73 20 74 65 73 74 20 69 73 20 6d 61 64  This test is mad
1f40: 65 20 74 6f 20 61 76 6f 69 64 20 6e 65 77 20 70  e to avoid new p
1f50: 72 6f 62 6c 65 6d 73 20 73 69 6d 69 6c 61 72 20  roblems similar 
1f60: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6f 6e 65 20  to the.  ** one 
1f70: 64 65 73 63 72 69 62 65 64 20 62 79 20 74 69 63  described by tic
1f80: 6b 65 74 20 23 33 35 38 34 2e 20 0a 20 20 2a 2f  ket #3584. .  */
1f90: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1fa0: 20 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3b 20   transCntrChng; 
1fb0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
1fc0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1fd0: 6e 74 65 72 20 63 68 61 6e 67 65 64 20 2a 2f 0a  nter changed */.
1fe0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1ff0: 64 62 55 70 64 61 74 65 3b 20 20 20 20 20 20 20  dbUpdate;       
2000: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20   /* True if any 
2010: 70 61 72 74 20 6f 66 20 64 61 74 61 62 61 73 65  part of database
2020: 20 66 69 6c 65 20 63 68 61 6e 67 65 64 20 2a 2f   file changed */
2030: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2040: 20 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3b 20   inNormalWrite; 
2050: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 20    /* True if in 
2060: 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 6f  a normal write o
2070: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 23 65 6e  peration */..#en
2080: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
2090: 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 49 6e 20  TE_TEST.  /* In 
20a0: 74 65 73 74 20 6d 6f 64 65 2c 20 69 6e 63 72 65  test mode, incre
20b0: 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ase the size of 
20c0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 61  this structure a
20d0: 20 62 69 74 20 73 6f 20 74 68 61 74 20 0a 20 20   bit so that .  
20e0: 2a 2a 20 69 74 20 69 73 20 6c 61 72 67 65 72 20  ** it is larger 
20f0: 74 68 61 6e 20 74 68 65 20 73 74 72 75 63 74 20  than the struct 
2100: 43 72 61 73 68 46 69 6c 65 20 64 65 66 69 6e 65  CrashFile define
2110: 64 20 69 6e 20 74 65 73 74 36 2e 63 2e 0a 20 20  d in test6.c..  
2120: 2a 2f 0a 20 20 63 68 61 72 20 61 50 61 64 64 69  */.  char aPaddi
2130: 6e 67 5b 33 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d  ng[32];.#endif.}
2140: 3b 0a 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61  ;../* This varia
2150: 62 6c 65 20 68 6f 6c 64 73 20 74 68 65 20 70 72  ble holds the pr
2160: 6f 63 65 73 73 20 69 64 20 28 70 69 64 29 20 66  ocess id (pid) f
2170: 72 6f 6d 20 77 68 65 6e 20 74 68 65 20 78 52 61  rom when the xRa
2180: 6e 64 6f 6d 6e 65 73 73 28 29 0a 2a 2a 20 6d 65  ndomness().** me
2190: 74 68 6f 64 20 77 61 73 20 63 61 6c 6c 65 64 2e  thod was called.
21a0: 20 20 49 66 20 78 4f 70 65 6e 28 29 20 69 73 20    If xOpen() is 
21b0: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 20 64 69  called from a di
21c0: 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 20  fferent process 
21d0: 69 64 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e  id,.** indicatin
21e0: 67 20 74 68 61 74 20 61 20 66 6f 72 6b 28 29 20  g that a fork() 
21f0: 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 74 68  has occurred, th
2200: 65 20 50 52 4e 47 20 77 69 6c 6c 20 62 65 20 72  e PRNG will be r
2210: 65 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eset..*/.static 
2220: 70 69 64 5f 74 20 72 61 6e 64 6f 6d 6e 65 73 73  pid_t randomness
2230: 50 69 64 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  Pid = 0;../*.** 
2240: 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66  Allowed values f
2250: 6f 72 20 74 68 65 20 75 6e 69 78 46 69 6c 65 2e  or the unixFile.
2260: 63 74 72 6c 46 6c 61 67 73 20 62 69 74 6d 61 73  ctrlFlags bitmas
2270: 6b 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  k:.*/.#define UN
2280: 49 58 46 49 4c 45 5f 45 58 43 4c 20 20 20 20 20  IXFILE_EXCL     
2290: 20 20 20 30 78 30 31 20 20 20 20 20 2f 2a 20 43     0x01     /* C
22a0: 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20  onnections from 
22b0: 6f 6e 65 20 70 72 6f 63 65 73 73 20 6f 6e 6c 79  one process only
22c0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58   */.#define UNIX
22d0: 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20 20 20  FILE_RDONLY     
22e0: 20 30 78 30 32 20 20 20 20 20 2f 2a 20 43 6f 6e   0x02     /* Con
22f0: 6e 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 20  nection is read 
2300: 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20  only */.#define 
2310: 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53 54  UNIXFILE_PERSIST
2320: 5f 57 41 4c 20 30 78 30 34 20 20 20 20 20 2f 2a  _WAL 0x04     /*
2330: 20 50 65 72 73 69 73 74 65 6e 74 20 57 41 4c 20   Persistent WAL 
2340: 6d 6f 64 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20  mode */.#ifndef 
2350: 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44  SQLITE_DISABLE_D
2360: 49 52 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20  IRSYNC.# define 
2370: 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43  UNIXFILE_DIRSYNC
2380: 20 20 20 20 30 78 30 38 20 20 20 20 20 2f 2a 20      0x08     /* 
2390: 44 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 6e  Directory sync n
23a0: 65 65 64 65 64 20 2a 2f 0a 23 65 6c 73 65 0a 23  eeded */.#else.#
23b0: 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45   define UNIXFILE
23c0: 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78 30 30  _DIRSYNC    0x00
23d0: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
23e0: 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 20 20 20  UNIXFILE_PSOW   
23f0: 20 20 20 20 20 30 78 31 30 20 20 20 20 20 2f 2a       0x10     /*
2400: 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
2410: 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
2420: 45 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  E */.#define UNI
2430: 58 46 49 4c 45 5f 44 45 4c 45 54 45 20 20 20 20  XFILE_DELETE    
2440: 20 20 30 78 32 30 20 20 20 20 20 2f 2a 20 44 65    0x20     /* De
2450: 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f  lete on close */
2460: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
2470: 45 5f 55 52 49 20 20 20 20 20 20 20 20 20 30 78  E_URI         0x
2480: 34 30 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61  40     /* Filena
2490: 6d 65 20 6d 69 67 68 74 20 68 61 76 65 20 71 75  me might have qu
24a0: 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20 2a  ery parameters *
24b0: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49  /.#define UNIXFI
24c0: 4c 45 5f 4e 4f 4c 4f 43 4b 20 20 20 20 20 20 30  LE_NOLOCK      0
24d0: 78 38 30 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  x80     /* Do no
24e0: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f   file locking */
24f0: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
2500: 45 5f 42 4c 4f 43 4b 20 20 20 20 20 30 78 30 31  E_BLOCK     0x01
2510: 30 30 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 53  00     /* Next S
2520: 48 4d 20 6c 6f 63 6b 20 6d 69 67 68 74 20 62 6c  HM lock might bl
2530: 6f 63 6b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ock */../*.** In
2540: 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74 20  clude code that 
2550: 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  is common to all
2560: 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f   os_*.c files.*/
2570: 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f  .#include "os_co
2580: 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44  mmon.h"../*.** D
2590: 65 66 69 6e 65 20 76 61 72 69 6f 75 73 20 6d 61  efine various ma
25a0: 63 72 6f 73 20 74 68 61 74 20 61 72 65 20 6d 69  cros that are mi
25b0: 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f 6d 65 20  ssing from some 
25c0: 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e  systems..*/.#ifn
25d0: 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a  def O_LARGEFILE.
25e0: 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45  # define O_LARGE
25f0: 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69  FILE 0.#endif.#i
2600: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41  fdef SQLITE_DISA
2610: 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64 65 66 20  BLE_LFS.# undef 
2620: 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65  O_LARGEFILE.# de
2630: 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45  fine O_LARGEFILE
2640: 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65   0.#endif.#ifnde
2650: 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64  f O_NOFOLLOW.# d
2660: 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57  efine O_NOFOLLOW
2670: 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65   0.#endif.#ifnde
2680: 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20 64 65 66  f O_BINARY.# def
2690: 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20 30 0a 23  ine O_BINARY 0.#
26a0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
26b0: 20 74 68 72 65 61 64 69 64 20 6d 61 63 72 6f 20   threadid macro 
26c0: 72 65 73 6f 6c 76 65 73 20 74 6f 20 74 68 65 20  resolves to the 
26d0: 74 68 72 65 61 64 2d 69 64 20 6f 72 20 74 6f 20  thread-id or to 
26e0: 30 2e 20 20 55 73 65 64 20 66 6f 72 0a 2a 2a 20  0.  Used for.** 
26f0: 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  testing and debu
2700: 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23  gging only..*/.#
2710: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
2720: 53 41 46 45 0a 23 64 65 66 69 6e 65 20 74 68 72  SAFE.#define thr
2730: 65 61 64 69 64 20 70 74 68 72 65 61 64 5f 73 65  eadid pthread_se
2740: 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64 65 66 69  lf().#else.#defi
2750: 6e 65 20 74 68 72 65 61 64 69 64 20 30 0a 23 65  ne threadid 0.#e
2760: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48 41 56 45  ndif../*.** HAVE
2770: 5f 4d 52 45 4d 41 50 20 64 65 66 61 75 6c 74 73  _MREMAP defaults
2780: 20 74 6f 20 74 72 75 65 20 6f 6e 20 4c 69 6e 75   to true on Linu
2790: 78 20 61 6e 64 20 66 61 6c 73 65 20 65 76 65 72  x and false ever
27a0: 79 77 68 65 72 65 20 65 6c 73 65 2e 0a 2a 2f 0a  ywhere else..*/.
27b0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 48 41 56  #if !defined(HAV
27c0: 45 5f 4d 52 45 4d 41 50 29 0a 23 20 69 66 20 64  E_MREMAP).# if d
27d0: 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f  efined(__linux__
27e0: 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 47 4e  ) && defined(_GN
27f0: 55 5f 53 4f 55 52 43 45 29 0a 23 20 20 64 65 66  U_SOURCE).#  def
2800: 69 6e 65 20 48 41 56 45 5f 4d 52 45 4d 41 50 20  ine HAVE_MREMAP 
2810: 31 0a 23 20 65 6c 73 65 0a 23 20 20 64 65 66 69  1.# else.#  defi
2820: 6e 65 20 48 41 56 45 5f 4d 52 45 4d 41 50 20 30  ne HAVE_MREMAP 0
2830: 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  .# endif.#endif.
2840: 0a 2f 2a 0a 2a 2a 20 45 78 70 6c 69 63 69 74 6c  ./*.** Explicitl
2850: 79 20 63 61 6c 6c 20 74 68 65 20 36 34 2d 62 69  y call the 64-bi
2860: 74 20 76 65 72 73 69 6f 6e 20 6f 66 20 6c 73 65  t version of lse
2870: 65 6b 28 29 20 6f 6e 20 41 6e 64 72 6f 69 64 2e  ek() on Android.
2880: 20 4f 74 68 65 72 77 69 73 65 2c 20 6c 73 65 65   Otherwise, lsee
2890: 6b 28 29 0a 2a 2a 20 69 73 20 74 68 65 20 33 32  k().** is the 32
28a0: 2d 62 69 74 20 76 65 72 73 69 6f 6e 2c 20 65 76  -bit version, ev
28b0: 65 6e 20 69 66 20 5f 46 49 4c 45 5f 4f 46 46 53  en if _FILE_OFFS
28c0: 45 54 5f 42 49 54 53 3d 36 34 20 69 73 20 64 65  ET_BITS=64 is de
28d0: 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66  fined..*/.#ifdef
28e0: 20 5f 5f 41 4e 44 52 4f 49 44 5f 5f 0a 23 20 64   __ANDROID__.# d
28f0: 65 66 69 6e 65 20 6c 73 65 65 6b 20 6c 73 65 65  efine lseek lsee
2900: 6b 36 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  k64.#endif../*.*
2910: 2a 20 44 69 66 66 65 72 65 6e 74 20 55 6e 69 78  * Different Unix
2920: 20 73 79 73 74 65 6d 73 20 64 65 63 6c 61 72 65   systems declare
2930: 20 6f 70 65 6e 28 29 20 69 6e 20 64 69 66 66 65   open() in diffe
2940: 72 65 6e 74 20 77 61 79 73 2e 20 20 53 61 6d 65  rent ways.  Same
2950: 20 75 73 65 0a 2a 2a 20 6f 70 65 6e 28 63 6f 6e   use.** open(con
2960: 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 6d 6f 64  st char*,int,mod
2970: 65 5f 74 29 2e 20 20 4f 74 68 65 72 73 20 75 73  e_t).  Others us
2980: 65 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61  e open(const cha
2990: 72 2a 2c 69 6e 74 2c 2e 2e 2e 29 2e 0a 2a 2a 20  r*,int,...)..** 
29a0: 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 69  The difference i
29b0: 73 20 69 6d 70 6f 72 74 61 6e 74 20 77 68 65 6e  s important when
29c0: 20 75 73 69 6e 67 20 61 20 70 6f 69 6e 74 65 72   using a pointer
29d0: 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
29e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 66 65  ..**.** The safe
29f0: 73 74 20 77 61 79 20 74 6f 20 64 65 61 6c 20 77  st way to deal w
2a00: 69 74 68 20 74 68 65 20 70 72 6f 62 6c 65 6d 20  ith the problem 
2a10: 69 73 20 74 6f 20 61 6c 77 61 79 73 20 75 73 65  is to always use
2a20: 20 74 68 69 73 20 77 72 61 70 70 65 72 0a 2a 2a   this wrapper.**
2a30: 20 77 68 69 63 68 20 61 6c 77 61 79 73 20 68 61   which always ha
2a40: 73 20 74 68 65 20 73 61 6d 65 20 77 65 6c 6c 2d  s the same well-
2a50: 64 65 66 69 6e 65 64 20 69 6e 74 65 72 66 61 63  defined interfac
2a60: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2a70: 20 70 6f 73 69 78 4f 70 65 6e 28 63 6f 6e 73 74   posixOpen(const
2a80: 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 69 6e   char *zFile, in
2a90: 74 20 66 6c 61 67 73 2c 20 69 6e 74 20 6d 6f 64  t flags, int mod
2aa0: 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65  e){.  return ope
2ab0: 6e 28 7a 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20  n(zFile, flags, 
2ac0: 6d 6f 64 65 29 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  mode);.}../* For
2ad0: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
2ae0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65  /.static int ope
2af0: 6e 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74  nDirectory(const
2b00: 20 63 68 61 72 2a 2c 20 69 6e 74 2a 29 3b 0a 73   char*, int*);.s
2b10: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65  tatic int unixGe
2b20: 74 70 61 67 65 73 69 7a 65 28 76 6f 69 64 29 3b  tpagesize(void);
2b30: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73  ../*.** Many sys
2b40: 74 65 6d 20 63 61 6c 6c 73 20 61 72 65 20 61 63  tem calls are ac
2b50: 63 65 73 73 65 64 20 74 68 72 6f 75 67 68 20 70  cessed through p
2b60: 6f 69 6e 74 65 72 2d 74 6f 2d 66 75 6e 63 74 69  ointer-to-functi
2b70: 6f 6e 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74  ons so that.** t
2b80: 68 65 79 20 6d 61 79 20 62 65 20 6f 76 65 72 72  hey may be overr
2b90: 69 64 64 65 6e 20 61 74 20 72 75 6e 74 69 6d 65  idden at runtime
2ba0: 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 66   to facilitate f
2bb0: 61 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e 20 64  ault injection d
2bc0: 75 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67  uring.** testing
2bd0: 20 61 6e 64 20 73 61 6e 64 62 6f 78 69 6e 67 2e   and sandboxing.
2be0: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
2bf0: 61 72 72 61 79 20 68 6f 6c 64 73 20 74 68 65 20  array holds the 
2c00: 6e 61 6d 65 73 20 61 6e 64 20 70 6f 69 6e 74 65  names and pointe
2c10: 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76 65  rs.** to all ove
2c20: 72 72 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d  rrideable system
2c30: 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   calls..*/.stati
2c40: 63 20 73 74 72 75 63 74 20 75 6e 69 78 5f 73 79  c struct unix_sy
2c50: 73 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74 20  scall {.  const 
2c60: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
2c70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2c80: 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61  of the system ca
2c90: 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ll */.  sqlite3_
2ca0: 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 43 75 72  syscall_ptr pCur
2cb0: 72 65 6e 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74  rent; /* Current
2cc0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79   value of the sy
2cd0: 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73  stem call */.  s
2ce0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
2cf0: 74 72 20 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20  tr pDefault; /* 
2d00: 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f  Default value */
2d10: 0a 7d 20 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20  .} aSyscall[] = 
2d20: 7b 0a 20 20 7b 20 22 6f 70 65 6e 22 2c 20 20 20  {.  { "open",   
2d30: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
2d40: 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78  yscall_ptr)posix
2d50: 4f 70 65 6e 2c 20 20 30 20 20 7d 2c 0a 23 64 65  Open,  0  },.#de
2d60: 66 69 6e 65 20 6f 73 4f 70 65 6e 20 20 20 20 20  fine osOpen     
2d70: 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20   ((int(*)(const 
2d80: 63 68 61 72 2a 2c 69 6e 74 2c 69 6e 74 29 29 61  char*,int,int))a
2d90: 53 79 73 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72  Syscall[0].pCurr
2da0: 65 6e 74 29 0a 0a 20 20 7b 20 22 63 6c 6f 73 65  ent)..  { "close
2db0: 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ",        (sqlit
2dc0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 63  e3_syscall_ptr)c
2dd0: 6c 6f 73 65 2c 20 20 20 20 20 20 30 20 20 7d 2c  lose,      0  },
2de0: 0a 23 64 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65  .#define osClose
2df0: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e       ((int(*)(in
2e00: 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70  t))aSyscall[1].p
2e10: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 61  Current)..  { "a
2e20: 63 63 65 73 73 22 2c 20 20 20 20 20 20 20 28 73  ccess",       (s
2e30: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
2e40: 74 72 29 61 63 63 65 73 73 2c 20 20 20 20 20 30  tr)access,     0
2e50: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 41    },.#define osA
2e60: 63 63 65 73 73 20 20 20 20 28 28 69 6e 74 28 2a  ccess    ((int(*
2e70: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e  )(const char*,in
2e80: 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70  t))aSyscall[2].p
2e90: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 67  Current)..  { "g
2ea0: 65 74 63 77 64 22 2c 20 20 20 20 20 20 20 28 73  etcwd",       (s
2eb0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
2ec0: 74 72 29 67 65 74 63 77 64 2c 20 20 20 20 20 30  tr)getcwd,     0
2ed0: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 47    },.#define osG
2ee0: 65 74 63 77 64 20 20 20 20 28 28 63 68 61 72 2a  etcwd    ((char*
2ef0: 28 2a 29 28 63 68 61 72 2a 2c 73 69 7a 65 5f 74  (*)(char*,size_t
2f00: 29 29 61 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43  ))aSyscall[3].pC
2f10: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 73 74  urrent)..  { "st
2f20: 61 74 22 2c 20 20 20 20 20 20 20 20 20 28 73 71  at",         (sq
2f30: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
2f40: 72 29 73 74 61 74 2c 20 20 20 20 20 20 20 30 20  r)stat,       0 
2f50: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 53 74   },.#define osSt
2f60: 61 74 20 20 20 20 20 20 28 28 69 6e 74 28 2a 29  at      ((int(*)
2f70: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 74 72  (const char*,str
2f80: 75 63 74 20 73 74 61 74 2a 29 29 61 53 79 73 63  uct stat*))aSysc
2f90: 61 6c 6c 5b 34 5d 2e 70 43 75 72 72 65 6e 74 29  all[4].pCurrent)
2fa0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 44 4a 47 50  ../*.** The DJGP
2fb0: 50 20 63 6f 6d 70 69 6c 65 72 20 65 6e 76 69 72  P compiler envir
2fc0: 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73  onment looks mos
2fd0: 74 6c 79 20 6c 69 6b 65 20 55 6e 69 78 2c 20 62  tly like Unix, b
2fe0: 75 74 20 69 74 0a 2a 2a 20 6c 61 63 6b 73 20 74  ut it.** lacks t
2ff0: 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65  he fcntl() syste
3000: 6d 20 63 61 6c 6c 2e 20 20 53 6f 20 72 65 64 65  m call.  So rede
3010: 66 69 6e 65 20 66 63 6e 74 6c 28 29 20 74 6f 20  fine fcntl() to 
3020: 62 65 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20  be something.** 
3030: 74 68 61 74 20 61 6c 77 61 79 73 20 73 75 63 63  that always succ
3040: 65 65 64 73 2e 20 20 54 68 69 73 20 6d 65 61 6e  eeds.  This mean
3050: 73 20 74 68 61 74 20 6c 6f 63 6b 69 6e 67 20 64  s that locking d
3060: 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e  oes not occur un
3070: 64 65 72 0a 2a 2a 20 44 4a 47 50 50 2e 20 20 42  der.** DJGPP.  B
3080: 75 74 20 69 74 20 69 73 20 44 4f 53 20 2d 20 77  ut it is DOS - w
3090: 68 61 74 20 64 69 64 20 79 6f 75 20 65 78 70 65  hat did you expe
30a0: 63 74 3f 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f  ct?.*/.#ifdef __
30b0: 44 4a 47 50 50 5f 5f 0a 20 20 7b 20 22 66 73 74  DJGPP__.  { "fst
30c0: 61 74 22 2c 20 20 20 20 20 20 20 20 30 2c 20 20  at",        0,  
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
30e0: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46    },.#define osF
30f0: 73 74 61 74 28 61 2c 62 2c 63 29 20 20 20 20 30  stat(a,b,c)    0
3100: 0a 23 65 6c 73 65 20 20 20 20 20 0a 20 20 7b 20  .#else     .  { 
3110: 22 66 73 74 61 74 22 2c 20 20 20 20 20 20 20 20  "fstat",        
3120: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3130: 5f 70 74 72 29 66 73 74 61 74 2c 20 20 20 20 20  _ptr)fstat,     
3140: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
3150: 73 46 73 74 61 74 20 20 20 20 20 28 28 69 6e 74  sFstat     ((int
3160: 28 2a 29 28 69 6e 74 2c 73 74 72 75 63 74 20 73  (*)(int,struct s
3170: 74 61 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 35  tat*))aSyscall[5
3180: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64  ].pCurrent).#end
3190: 69 66 0a 0a 20 20 7b 20 22 66 74 72 75 6e 63 61  if..  { "ftrunca
31a0: 74 65 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33  te",    (sqlite3
31b0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 74 72  _syscall_ptr)ftr
31c0: 75 6e 63 61 74 65 2c 20 20 30 20 20 7d 2c 0a 23  uncate,  0  },.#
31d0: 64 65 66 69 6e 65 20 6f 73 46 74 72 75 6e 63 61  define osFtrunca
31e0: 74 65 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c  te ((int(*)(int,
31f0: 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  off_t))aSyscall[
3200: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  6].pCurrent)..  
3210: 7b 20 22 66 63 6e 74 6c 22 2c 20 20 20 20 20 20  { "fcntl",      
3220: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3230: 6c 6c 5f 70 74 72 29 66 63 6e 74 6c 2c 20 20 20  ll_ptr)fcntl,   
3240: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
3250: 20 6f 73 46 63 6e 74 6c 20 20 20 20 20 28 28 69   osFcntl     ((i
3260: 6e 74 28 2a 29 28 69 6e 74 2c 69 6e 74 2c 2e 2e  nt(*)(int,int,..
3270: 2e 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70  .))aSyscall[7].p
3280: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72  Current)..  { "r
3290: 65 61 64 22 2c 20 20 20 20 20 20 20 20 20 28 73  ead",         (s
32a0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
32b0: 74 72 29 72 65 61 64 2c 20 20 20 20 20 20 20 30  tr)read,       0
32c0: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52    },.#define osR
32d0: 65 61 64 20 20 20 20 20 20 28 28 73 73 69 7a 65  ead      ((ssize
32e0: 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c  _t(*)(int,void*,
32f0: 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  size_t))aSyscall
3300: 5b 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [8].pCurrent)..#
3310: 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
3320: 52 45 41 44 29 20 7c 7c 20 53 51 4c 49 54 45 5f  READ) || SQLITE_
3330: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
3340: 54 59 4c 45 0a 20 20 7b 20 22 70 72 65 61 64 22  TYLE.  { "pread"
3350: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
3360: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 72  3_syscall_ptr)pr
3370: 65 61 64 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a  ead,      0  },.
3380: 23 65 6c 73 65 0a 20 20 7b 20 22 70 72 65 61 64  #else.  { "pread
3390: 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ",        (sqlit
33a0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30  e3_syscall_ptr)0
33b0: 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c  ,          0  },
33c0: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
33d0: 6f 73 50 72 65 61 64 20 20 20 20 20 28 28 73 73  osPread     ((ss
33e0: 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69  ize_t(*)(int,voi
33f0: 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29  d*,size_t,off_t)
3400: 29 61 53 79 73 63 61 6c 6c 5b 39 5d 2e 70 43 75  )aSyscall[9].pCu
3410: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
3420: 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29  ned(USE_PREAD64)
3430: 0a 20 20 7b 20 22 70 72 65 61 64 36 34 22 2c 20  .  { "pread64", 
3440: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3450: 73 63 61 6c 6c 5f 70 74 72 29 70 72 65 61 64 36  scall_ptr)pread6
3460: 34 2c 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73  4,    0  },.#els
3470: 65 0a 20 20 7b 20 22 70 72 65 61 64 36 34 22 2c  e.  { "pread64",
3480: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3490: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
34a0: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e         0  },.#en
34b0: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 72  dif.#define osPr
34c0: 65 61 64 36 34 20 20 20 28 28 73 73 69 7a 65 5f  ead64   ((ssize_
34d0: 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73  t(*)(int,void*,s
34e0: 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79  ize_t,off_t))aSy
34f0: 73 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65  scall[10].pCurre
3500: 6e 74 29 0a 0a 20 20 7b 20 22 77 72 69 74 65 22  nt)..  { "write"
3510: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
3520: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 77 72  3_syscall_ptr)wr
3530: 69 74 65 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a  ite,      0  },.
3540: 23 64 65 66 69 6e 65 20 6f 73 57 72 69 74 65 20  #define osWrite 
3550: 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29      ((ssize_t(*)
3560: 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  (int,const void*
3570: 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c  ,size_t))aSyscal
3580: 6c 5b 31 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[11].pCurrent).
3590: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
35a0: 5f 50 52 45 41 44 29 20 7c 7c 20 53 51 4c 49 54  _PREAD) || SQLIT
35b0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
35c0: 5f 53 54 59 4c 45 0a 20 20 7b 20 22 70 77 72 69  _STYLE.  { "pwri
35d0: 74 65 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  te",       (sqli
35e0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
35f0: 70 77 72 69 74 65 2c 20 20 20 20 20 30 20 20 7d  pwrite,     0  }
3600: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 77 72  ,.#else.  { "pwr
3610: 69 74 65 22 2c 20 20 20 20 20 20 20 28 73 71 6c  ite",       (sql
3620: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3630: 29 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20  )0,          0  
3640: 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e  },.#endif.#defin
3650: 65 20 6f 73 50 77 72 69 74 65 20 20 20 20 28 28  e osPwrite    ((
3660: 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63  ssize_t(*)(int,c
3670: 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f  onst void*,size_
3680: 74 2c 6f 66 66 5f 74 29 29 5c 0a 20 20 20 20 20  t,off_t))\.     
3690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
36a0: 53 79 73 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72  Syscall[12].pCur
36b0: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
36c0: 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a  ed(USE_PREAD64).
36d0: 20 20 7b 20 22 70 77 72 69 74 65 36 34 22 2c 20    { "pwrite64", 
36e0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
36f0: 63 61 6c 6c 5f 70 74 72 29 70 77 72 69 74 65 36  call_ptr)pwrite6
3700: 34 2c 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65  4,   0  },.#else
3710: 0a 20 20 7b 20 22 70 77 72 69 74 65 36 34 22 2c  .  { "pwrite64",
3720: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3730: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
3740: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64        0  },.#end
3750: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 77 72  if.#define osPwr
3760: 69 74 65 36 34 20 20 28 28 73 73 69 7a 65 5f 74  ite64  ((ssize_t
3770: 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  (*)(int,const vo
3780: 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74  id*,size_t,off_t
3790: 29 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))\.            
37a0: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
37b0: 5b 31 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [13].pCurrent)..
37c0: 20 20 7b 20 22 66 63 68 6d 6f 64 22 2c 20 20 20    { "fchmod",   
37d0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
37e0: 63 61 6c 6c 5f 70 74 72 29 66 63 68 6d 6f 64 2c  call_ptr)fchmod,
37f0: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
3800: 23 64 65 66 69 6e 65 20 6f 73 46 63 68 6d 6f 64  #define osFchmod
3810: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74      ((int(*)(int
3820: 2c 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61 6c  ,mode_t))aSyscal
3830: 6c 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[14].pCurrent).
3840: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56  .#if defined(HAV
3850: 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54  E_POSIX_FALLOCAT
3860: 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58  E) && HAVE_POSIX
3870: 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 7b 20 22  _FALLOCATE.  { "
3880: 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20 28  fallocate",    (
3890: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
38a0: 70 74 72 29 70 6f 73 69 78 5f 66 61 6c 6c 6f 63  ptr)posix_falloc
38b0: 61 74 65 2c 20 20 30 20 7d 2c 0a 23 65 6c 73 65  ate,  0 },.#else
38c0: 0a 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65 22  .  { "fallocate"
38d0: 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79  ,    (sqlite3_sy
38e0: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
38f0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3900: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
3910: 6f 73 46 61 6c 6c 6f 63 61 74 65 20 28 28 69 6e  osFallocate ((in
3920: 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 2c 6f  t(*)(int,off_t,o
3930: 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31  ff_t))aSyscall[1
3940: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  5].pCurrent)..  
3950: 7b 20 22 75 6e 6c 69 6e 6b 22 2c 20 20 20 20 20  { "unlink",     
3960: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3970: 6c 6c 5f 70 74 72 29 75 6e 6c 69 6e 6b 2c 20 20  ll_ptr)unlink,  
3980: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64           0 },.#d
3990: 65 66 69 6e 65 20 6f 73 55 6e 6c 69 6e 6b 20 20  efine osUnlink  
39a0: 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74    ((int(*)(const
39b0: 20 63 68 61 72 2a 29 29 61 53 79 73 63 61 6c 6c   char*))aSyscall
39c0: 5b 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [16].pCurrent)..
39d0: 20 20 7b 20 22 6f 70 65 6e 44 69 72 65 63 74 6f    { "openDirecto
39e0: 72 79 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33  ry",    (sqlite3
39f0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6f 70 65  _syscall_ptr)ope
3a00: 6e 44 69 72 65 63 74 6f 72 79 2c 20 20 20 20 20  nDirectory,     
3a10: 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73   0 },.#define os
3a20: 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 20 28 28  OpenDirectory ((
3a30: 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  int(*)(const cha
3a40: 72 2a 2c 69 6e 74 2a 29 29 61 53 79 73 63 61 6c  r*,int*))aSyscal
3a50: 6c 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[17].pCurrent).
3a60: 0a 20 20 7b 20 22 6d 6b 64 69 72 22 2c 20 20 20  .  { "mkdir",   
3a70: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3a80: 73 63 61 6c 6c 5f 70 74 72 29 6d 6b 64 69 72 2c  scall_ptr)mkdir,
3a90: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3aa0: 23 64 65 66 69 6e 65 20 6f 73 4d 6b 64 69 72 20  #define osMkdir 
3ab0: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e      ((int(*)(con
3ac0: 73 74 20 63 68 61 72 2a 2c 6d 6f 64 65 5f 74 29  st char*,mode_t)
3ad0: 29 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 43  )aSyscall[18].pC
3ae0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72 6d  urrent)..  { "rm
3af0: 64 69 72 22 2c 20 20 20 20 20 20 20 20 28 73 71  dir",        (sq
3b00: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3b10: 72 29 72 6d 64 69 72 2c 20 20 20 20 20 20 20 20  r)rmdir,        
3b20: 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20     0 },.#define 
3b30: 6f 73 52 6d 64 69 72 20 20 20 20 20 28 28 69 6e  osRmdir     ((in
3b40: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
3b50: 29 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70  ))aSyscall[19].p
3b60: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66  Current)..  { "f
3b70: 63 68 6f 77 6e 22 2c 20 20 20 20 20 20 20 28 73  chown",       (s
3b80: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3b90: 74 72 29 66 63 68 6f 77 6e 2c 20 20 20 20 20 20  tr)fchown,      
3ba0: 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65      0 },.#define
3bb0: 20 6f 73 46 63 68 6f 77 6e 20 20 20 20 28 28 69   osFchown    ((i
3bc0: 6e 74 28 2a 29 28 69 6e 74 2c 75 69 64 5f 74 2c  nt(*)(int,uid_t,
3bd0: 67 69 64 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  gid_t))aSyscall[
3be0: 32 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  20].pCurrent).. 
3bf0: 20 7b 20 22 67 65 74 65 75 69 64 22 2c 20 20 20   { "geteuid",   
3c00: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3c10: 61 6c 6c 5f 70 74 72 29 67 65 74 65 75 69 64 2c  all_ptr)geteuid,
3c20: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64           0 },.#d
3c30: 65 66 69 6e 65 20 6f 73 47 65 74 65 75 69 64 20  efine osGeteuid 
3c40: 20 20 28 28 75 69 64 5f 74 28 2a 29 28 76 6f 69    ((uid_t(*)(voi
3c50: 64 29 29 61 53 79 73 63 61 6c 6c 5b 32 31 5d 2e  d))aSyscall[21].
3c60: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
3c70: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
3c80: 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49  MIT_WAL) || SQLI
3c90: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
3ca0: 3e 30 0a 20 20 7b 20 22 6d 6d 61 70 22 2c 20 20  >0.  { "mmap",  
3cb0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3cc0: 73 63 61 6c 6c 5f 70 74 72 29 6d 6d 61 70 2c 20  scall_ptr)mmap, 
3cd0: 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65      0 },.#define
3ce0: 20 6f 73 4d 6d 61 70 20 28 28 76 6f 69 64 2a 28   osMmap ((void*(
3cf0: 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c  *)(void*,size_t,
3d00: 69 6e 74 2c 69 6e 74 2c 69 6e 74 2c 6f 66 66 5f  int,int,int,off_
3d10: 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 32 5d 2e  t))aSyscall[22].
3d20: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3d30: 6d 75 6e 6d 61 70 22 2c 20 20 20 20 20 20 20 28  munmap",       (
3d40: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3d50: 70 74 72 29 6d 75 6e 6d 61 70 2c 20 20 20 20 20  ptr)munmap,     
3d60: 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e       0 },.#defin
3d70: 65 20 6f 73 4d 75 6e 6d 61 70 20 28 28 76 6f 69  e osMunmap ((voi
3d80: 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65  d*(*)(void*,size
3d90: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 33 5d  _t))aSyscall[23]
3da0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
3db0: 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20 20 7b 20  HAVE_MREMAP.  { 
3dc0: 22 6d 72 65 6d 61 70 22 2c 20 20 20 20 20 20 20  "mremap",       
3dd0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3de0: 5f 70 74 72 29 6d 72 65 6d 61 70 2c 20 20 20 20  _ptr)mremap,    
3df0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
3e00: 0a 20 20 7b 20 22 6d 72 65 6d 61 70 22 2c 20 20  .  { "mremap",  
3e10: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3e20: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
3e30: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3e40: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
3e50: 73 4d 72 65 6d 61 70 20 28 28 76 6f 69 64 2a 28  sMremap ((void*(
3e60: 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c  *)(void*,size_t,
3e70: 73 69 7a 65 5f 74 2c 69 6e 74 2c 2e 2e 2e 29 29  size_t,int,...))
3e80: 61 53 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75  aSyscall[24].pCu
3e90: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 67 65 74  rrent)..  { "get
3ea0: 70 61 67 65 73 69 7a 65 22 2c 20 20 28 73 71 6c  pagesize",  (sql
3eb0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3ec0: 29 75 6e 69 78 47 65 74 70 61 67 65 73 69 7a 65  )unixGetpagesize
3ed0: 2c 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f  , 0 },.#define o
3ee0: 73 47 65 74 70 61 67 65 73 69 7a 65 20 28 28 69  sGetpagesize ((i
3ef0: 6e 74 28 2a 29 28 76 6f 69 64 29 29 61 53 79 73  nt(*)(void))aSys
3f00: 63 61 6c 6c 5b 32 35 5d 2e 70 43 75 72 72 65 6e  call[25].pCurren
3f10: 74 29 0a 0a 20 20 7b 20 22 72 65 61 64 6c 69 6e  t)..  { "readlin
3f20: 6b 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65 33  k",     (sqlite3
3f30: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 65 61  _syscall_ptr)rea
3f40: 64 6c 69 6e 6b 2c 20 20 20 20 20 20 20 20 30 20  dlink,        0 
3f50: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52 65 61  },.#define osRea
3f60: 64 6c 69 6e 6b 20 28 28 73 73 69 7a 65 5f 74 28  dlink ((ssize_t(
3f70: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63  *)(const char*,c
3f80: 68 61 72 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79  har*,size_t))aSy
3f90: 73 63 61 6c 6c 5b 32 36 5d 2e 70 43 75 72 72 65  scall[26].pCurre
3fa0: 6e 74 29 0a 0a 23 65 6e 64 69 66 0a 0a 7d 3b 20  nt)..#endif..}; 
3fb0: 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6f 76  /* End of the ov
3fc0: 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74 65  errideable syste
3fd0: 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 0a 2f 2a 0a  m calls */.../*.
3fe0: 2a 2a 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65  ** On some syste
3ff0: 6d 73 2c 20 63 61 6c 6c 73 20 74 6f 20 66 63 68  ms, calls to fch
4000: 6f 77 6e 28 29 20 77 69 6c 6c 20 74 72 69 67 67  own() will trigg
4010: 65 72 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20  er a message in 
4020: 61 20 73 65 63 75 72 69 74 79 0a 2a 2a 20 6c 6f  a security.** lo
4030: 67 20 69 66 20 74 68 65 79 20 63 6f 6d 65 20 66  g if they come f
4040: 72 6f 6d 20 6e 6f 6e 2d 72 6f 6f 74 20 70 72 6f  rom non-root pro
4050: 63 65 73 73 65 73 2e 20 20 53 6f 20 61 76 6f 69  cesses.  So avoi
4060: 64 20 63 61 6c 6c 69 6e 67 20 66 63 68 6f 77 6e  d calling fchown
4070: 28 29 20 69 66 0a 2a 2a 20 77 65 20 61 72 65 20  () if.** we are 
4080: 6e 6f 74 20 72 75 6e 6e 69 6e 67 20 61 73 20 72  not running as r
4090: 6f 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  oot..*/.static i
40a0: 6e 74 20 72 6f 62 75 73 74 46 63 68 6f 77 6e 28  nt robustFchown(
40b0: 69 6e 74 20 66 64 2c 20 75 69 64 5f 74 20 75 69  int fd, uid_t ui
40c0: 64 2c 20 67 69 64 5f 74 20 67 69 64 29 7b 0a 23  d, gid_t gid){.#
40d0: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
40e0: 72 65 74 75 72 6e 20 30 3b 0a 23 65 6c 73 65 0a  return 0;.#else.
40f0: 20 20 72 65 74 75 72 6e 20 6f 73 47 65 74 65 75    return osGeteu
4100: 69 64 28 29 20 3f 20 30 20 3a 20 6f 73 46 63 68  id() ? 0 : osFch
4110: 6f 77 6e 28 66 64 2c 75 69 64 2c 67 69 64 29 3b  own(fd,uid,gid);
4120: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
4130: 20 54 68 69 73 20 69 73 20 74 68 65 20 78 53 65   This is the xSe
4140: 74 53 79 73 74 65 6d 43 61 6c 6c 28 29 20 6d 65  tSystemCall() me
4150: 74 68 6f 64 20 6f 66 20 73 71 6c 69 74 65 33 5f  thod of sqlite3_
4160: 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74  vfs for all of t
4170: 68 65 0a 2a 2a 20 22 75 6e 69 78 22 20 56 46 53  he.** "unix" VFS
4180: 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  es.  Return SQLI
4190: 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65  TE_OK opon succe
41a0: 73 73 66 75 6c 6c 79 20 75 70 64 61 74 69 6e 67  ssfully updating
41b0: 20 74 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63   the.** system c
41c0: 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20  all pointer, or 
41d0: 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
41e0: 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63  if there is no c
41f0: 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73  onfigurable.** s
4200: 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64  ystem call named
4210: 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69   zName..*/.stati
4220: 63 20 69 6e 74 20 75 6e 69 78 53 65 74 53 79 73  c int unixSetSys
4230: 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74  temCall(.  sqlit
4240: 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64  e3_vfs *pNotUsed
4250: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
4260: 56 46 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f  VFS pointer.  No
4270: 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  t used */.  cons
4280: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20  t char *zName,  
4290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
42a0: 65 20 6f 66 20 73 79 73 74 65 6d 20 63 61 6c 6c  e of system call
42b0: 20 74 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a   to override */.
42c0: 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c    sqlite3_syscal
42d0: 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e 63 20 20  l_ptr pNewFunc  
42e0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65  /* Pointer to ne
42f0: 77 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 76 61  w system call va
4300: 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69  lue */.){.  unsi
4310: 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 69 6e  gned int i;.  in
4320: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  t rc = SQLITE_NO
4330: 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55 53 45  TFOUND;..  UNUSE
4340: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74  D_PARAMETER(pNot
4350: 55 73 65 64 29 3b 0a 20 20 69 66 28 20 7a 4e 61  Used);.  if( zNa
4360: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  me==0 ){.    /* 
4370: 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 20 67  If no zName is g
4380: 69 76 65 6e 2c 20 72 65 73 74 6f 72 65 20 61 6c  iven, restore al
4390: 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 74  l system calls t
43a0: 6f 20 74 68 65 69 72 20 64 65 66 61 75 6c 74 0a  o their default.
43b0: 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 73 20      ** settings 
43c0: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a  and return NULL.
43d0: 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
43e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 66  SQLITE_OK;.    f
43f0: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
4400: 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f  (aSyscall)/sizeo
4410: 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20  f(aSyscall[0]); 
4420: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
4430: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66  aSyscall[i].pDef
4440: 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ault ){.        
4450: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
4460: 72 65 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b  rent = aSyscall[
4470: 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20  i].pDefault;.   
4480: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
4490: 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e  se{.    /* If zN
44a0: 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64  ame is specified
44b0: 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c  , operate on onl
44c0: 79 20 74 68 65 20 6f 6e 65 20 73 79 73 74 65 6d  y the one system
44d0: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65   call.    ** spe
44e0: 63 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  cified..    */. 
44f0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69     for(i=0; i<si
4500: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73  zeof(aSyscall)/s
4510: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30  izeof(aSyscall[0
4520: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ]); i++){.      
4530: 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65  if( strcmp(zName
4540: 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e  , aSyscall[i].zN
4550: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
4560: 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b     if( aSyscall[
4570: 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d 30 20 29  i].pDefault==0 )
4580: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 53 79 73  {.          aSys
4590: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
45a0: 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70   = aSyscall[i].p
45b0: 43 75 72 72 65 6e 74 3b 0a 20 20 20 20 20 20 20  Current;.       
45c0: 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
45d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
45e0: 20 20 20 69 66 28 20 70 4e 65 77 46 75 6e 63 3d     if( pNewFunc=
45f0: 3d 30 20 29 20 70 4e 65 77 46 75 6e 63 20 3d 20  =0 ) pNewFunc = 
4600: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66  aSyscall[i].pDef
4610: 61 75 6c 74 3b 0a 20 20 20 20 20 20 20 20 61 53  ault;.        aS
4620: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
4630: 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20  nt = pNewFunc;. 
4640: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4650: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
4660: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
4670: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
4680: 20 76 61 6c 75 65 20 6f 66 20 61 20 73 79 73 74   value of a syst
4690: 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e  em call.  Return
46a0: 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69   NULL if zName i
46b0: 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67  s not a.** recog
46c0: 6e 69 7a 65 64 20 73 79 73 74 65 6d 20 63 61 6c  nized system cal
46d0: 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73  l name.  NULL is
46e0: 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69   also returned i
46f0: 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c  f the system cal
4700: 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c  l.** is currentl
4710: 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  y undefined..*/.
4720: 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73  static sqlite3_s
4730: 79 73 63 61 6c 6c 5f 70 74 72 20 75 6e 69 78 47  yscall_ptr unixG
4740: 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20  etSystemCall(.  
4750: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f  sqlite3_vfs *pNo
4760: 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74 20 63  tUsed,.  const c
4770: 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20  har *zName.){.  
4780: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a  unsigned int i;.
4790: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
47a0: 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20  TER(pNotUsed);. 
47b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
47c0: 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a  of(aSyscall)/siz
47d0: 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29  eof(aSyscall[0])
47e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
47f0: 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53  strcmp(zName, aS
4800: 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  yscall[i].zName)
4810: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79  ==0 ) return aSy
4820: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
4830: 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
4840: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
4850: 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  rn the name of t
4860: 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20  he first system 
4870: 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65  call after zName
4880: 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c  .  If zName==NUL
4890: 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e  L.** then return
48a0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
48b0: 20 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61   first system ca
48c0: 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ll.  Return NULL
48d0: 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20   if zName.** is 
48e0: 74 68 65 20 6c 61 73 74 20 73 79 73 74 65 6d 20  the last system 
48f0: 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65  call or if zName
4900: 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65   is not the name
4910: 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73   of a valid.** s
4920: 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73  ystem call..*/.s
4930: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
4940: 20 2a 75 6e 69 78 4e 65 78 74 53 79 73 74 65 6d   *unixNextSystem
4950: 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66 73  Call(sqlite3_vfs
4960: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
4970: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *zName){.  int i
4980: 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45 44   = -1;..  UNUSED
4990: 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20  _PARAMETER(p);. 
49a0: 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20   if( zName ){.  
49b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72    for(i=0; i<Arr
49c0: 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29  aySize(aSyscall)
49d0: 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  -1; i++){.      
49e0: 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65  if( strcmp(zName
49f0: 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e  , aSyscall[i].zN
4a00: 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ame)==0 ) break;
4a10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
4a20: 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i++; i<ArraySiz
4a30: 65 28 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b 2b  e(aSyscall); i++
4a40: 29 7b 0a 20 20 20 20 69 66 28 20 61 53 79 73 63  ){.    if( aSysc
4a50: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 21  all[i].pCurrent!
4a60: 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79 73  =0 ) return aSys
4a70: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20  call[i].zName;. 
4a80: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
4a90: 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61  ../*.** Do not a
4aa0: 63 63 65 70 74 20 61 6e 79 20 66 69 6c 65 20 64  ccept any file d
4ab0: 65 73 63 72 69 70 74 6f 72 20 6c 65 73 73 20 74  escriptor less t
4ac0: 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2c 20  han this value, 
4ad0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69  in order to avoi
4ae0: 64 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 64 61 74  d.** opening dat
4af0: 61 62 61 73 65 20 66 69 6c 65 20 75 73 69 6e 67  abase file using
4b00: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
4b10: 73 20 74 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f  s that are commo
4b20: 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 0a 2a 2a  nly used for .**
4b30: 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74 2c   standard input,
4b40: 20 6f 75 74 70 75 74 2c 20 61 6e 64 20 65 72 72   output, and err
4b50: 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  or..*/.#ifndef S
4b60: 51 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d 5f 46 49  QLITE_MINIMUM_FI
4b70: 4c 45 5f 44 45 53 43 52 49 50 54 4f 52 0a 23 20  LE_DESCRIPTOR.# 
4b80: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4d 49  define SQLITE_MI
4b90: 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52  NIMUM_FILE_DESCR
4ba0: 49 50 54 4f 52 20 33 0a 23 65 6e 64 69 66 0a 0a  IPTOR 3.#endif..
4bb0: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 6f 70 65  /*.** Invoke ope
4bc0: 6e 28 29 2e 20 20 44 6f 20 73 6f 20 6d 75 6c 74  n().  Do so mult
4bd0: 69 70 6c 65 20 74 69 6d 65 73 2c 20 75 6e 74 69  iple times, unti
4be0: 6c 20 69 74 20 65 69 74 68 65 72 20 73 75 63 63  l it either succ
4bf0: 65 65 64 73 20 6f 72 0a 2a 2a 20 66 61 69 6c 73  eeds or.** fails
4c00: 20 66 6f 72 20 73 6f 6d 65 20 72 65 61 73 6f 6e   for some reason
4c10: 20 6f 74 68 65 72 20 74 68 61 6e 20 45 49 4e 54   other than EINT
4c20: 52 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  R..**.** If the 
4c30: 66 69 6c 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f  file creation mo
4c40: 64 65 20 22 6d 22 20 69 73 20 30 20 74 68 65 6e  de "m" is 0 then
4c50: 20 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 64   set it to the d
4c60: 65 66 61 75 6c 74 20 66 6f 72 0a 2a 2a 20 53 51  efault for.** SQ
4c70: 4c 69 74 65 2e 20 20 54 68 65 20 64 65 66 61 75  Lite.  The defau
4c80: 6c 74 20 69 73 20 53 51 4c 49 54 45 5f 44 45 46  lt is SQLITE_DEF
4c90: 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
4ca0: 53 49 4f 4e 53 20 28 6e 6f 72 6d 61 6c 6c 79 0a  SIONS (normally.
4cb0: 2a 2a 20 30 36 34 34 29 20 61 73 20 6d 6f 64 69  ** 0644) as modi
4cc0: 66 69 65 64 20 62 79 20 74 68 65 20 73 79 73 74  fied by the syst
4cd0: 65 6d 20 75 6d 61 73 6b 2e 20 20 49 66 20 6d 20  em umask.  If m 
4ce0: 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 0a 2a  is not 0, then.*
4cf0: 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20  * make the file 
4d00: 63 72 65 61 74 69 6f 6e 20 6d 6f 64 65 20 62 65  creation mode be
4d10: 20 65 78 61 63 74 6c 79 20 6d 20 69 67 6e 6f 72   exactly m ignor
4d20: 69 6e 67 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a  ing the umask..*
4d30: 2a 0a 2a 2a 20 54 68 65 20 6d 20 70 61 72 61 6d  *.** The m param
4d40: 65 74 65 72 20 77 69 6c 6c 20 62 65 20 6e 6f 6e  eter will be non
4d50: 2d 7a 65 72 6f 20 6f 6e 6c 79 20 77 68 65 6e 20  -zero only when 
4d60: 63 72 65 61 74 69 6e 67 20 2d 77 61 6c 2c 20 2d  creating -wal, -
4d70: 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 61 6e 64 20  journal,.** and 
4d80: 2d 73 68 6d 20 66 69 6c 65 73 2e 20 20 57 65 20  -shm files.  We 
4d90: 77 61 6e 74 20 74 68 6f 73 65 20 66 69 6c 65 73  want those files
4da0: 20 74 6f 20 68 61 76 65 20 2a 65 78 61 63 74 6c   to have *exactl
4db0: 79 2a 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 70  y* the same.** p
4dc0: 65 72 6d 69 73 73 69 6f 6e 73 20 61 73 20 74 68  ermissions as th
4dd0: 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  eir original dat
4de0: 61 62 61 73 65 2c 20 75 6e 61 64 75 6c 74 65 72  abase, unadulter
4df0: 61 74 65 64 20 62 79 20 74 68 65 20 75 6d 61 73  ated by the umas
4e00: 6b 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20 77 61  k..** In that wa
4e10: 79 2c 20 69 66 20 61 20 64 61 74 61 62 61 73 65  y, if a database
4e20: 20 66 69 6c 65 20 69 73 20 2d 72 77 2d 72 77 2d   file is -rw-rw-
4e30: 72 77 20 6f 72 20 2d 72 77 2d 72 77 2d 72 2d 2c  rw or -rw-rw-r-,
4e40: 20 61 6e 64 20 61 0a 2a 2a 20 74 72 61 6e 73 61   and a.** transa
4e50: 63 74 69 6f 6e 20 63 72 61 73 68 65 73 20 61 6e  ction crashes an
4e60: 64 20 6c 65 61 76 65 73 20 62 65 68 69 6e 64 20  d leaves behind 
4e70: 68 6f 74 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68  hot journals, th
4e80: 65 6e 20 61 6e 79 0a 2a 2a 20 70 72 6f 63 65 73  en any.** proces
4e90: 73 20 74 68 61 74 20 69 73 20 61 62 6c 65 20 74  s that is able t
4ea0: 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64  o write to the d
4eb0: 61 74 61 62 61 73 65 20 77 69 6c 6c 20 61 6c 73  atabase will als
4ec0: 6f 20 62 65 20 61 62 6c 65 20 74 6f 0a 2a 2a 20  o be able to.** 
4ed0: 72 65 63 6f 76 65 72 20 74 68 65 20 68 6f 74 20  recover the hot 
4ee0: 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2f 0a 73 74 61  journals..*/.sta
4ef0: 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 6f  tic int robust_o
4f00: 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  pen(const char *
4f10: 7a 2c 20 69 6e 74 20 66 2c 20 6d 6f 64 65 5f 74  z, int f, mode_t
4f20: 20 6d 29 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20   m){.  int fd;. 
4f30: 20 6d 6f 64 65 5f 74 20 6d 32 20 3d 20 6d 20 3f   mode_t m2 = m ?
4f40: 20 6d 20 3a 20 53 51 4c 49 54 45 5f 44 45 46 41   m : SQLITE_DEFA
4f50: 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
4f60: 49 4f 4e 53 3b 0a 20 20 77 68 69 6c 65 28 31 29  IONS;.  while(1)
4f70: 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 5f  {.#if defined(O_
4f80: 43 4c 4f 45 58 45 43 29 0a 20 20 20 20 66 64 20  CLOEXEC).    fd 
4f90: 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66 7c 4f 5f 43  = osOpen(z,f|O_C
4fa0: 4c 4f 45 58 45 43 2c 6d 32 29 3b 0a 23 65 6c 73  LOEXEC,m2);.#els
4fb0: 65 0a 20 20 20 20 66 64 20 3d 20 6f 73 4f 70 65  e.    fd = osOpe
4fc0: 6e 28 7a 2c 66 2c 6d 32 29 3b 0a 23 65 6e 64 69  n(z,f,m2);.#endi
4fd0: 66 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29  f.    if( fd<0 )
4fe0: 7b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72 6e  {.      if( errn
4ff0: 6f 3d 3d 45 49 4e 54 52 20 29 20 63 6f 6e 74 69  o==EINTR ) conti
5000: 6e 75 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nue;.      break
5010: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
5020: 66 64 3e 3d 53 51 4c 49 54 45 5f 4d 49 4e 49 4d  fd>=SQLITE_MINIM
5030: 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52 49 50 54  UM_FILE_DESCRIPT
5040: 4f 52 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  OR ) break;.    
5050: 6f 73 43 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20  osClose(fd);.   
5060: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
5070: 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 0a 20 20  ITE_WARNING, .  
5080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 61                "a
5090: 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 5c  ttempt to open \
50a0: 22 25 73 5c 22 20 61 73 20 66 69 6c 65 20 64 65  "%s\" as file de
50b0: 73 63 72 69 70 74 6f 72 20 25 64 22 2c 20 7a 2c  scriptor %d", z,
50c0: 20 66 64 29 3b 0a 20 20 20 20 66 64 20 3d 20 2d   fd);.    fd = -
50d0: 31 3b 0a 20 20 20 20 69 66 28 20 6f 73 4f 70 65  1;.    if( osOpe
50e0: 6e 28 22 2f 64 65 76 2f 6e 75 6c 6c 22 2c 20 66  n("/dev/null", f
50f0: 2c 20 6d 29 3c 30 20 29 20 62 72 65 61 6b 3b 0a  , m)<0 ) break;.
5100: 20 20 7d 0a 20 20 69 66 28 20 66 64 3e 3d 30 20    }.  if( fd>=0 
5110: 29 7b 0a 20 20 20 20 69 66 28 20 6d 21 3d 30 20  ){.    if( m!=0 
5120: 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
5130: 73 74 61 74 20 73 74 61 74 62 75 66 3b 0a 20 20  stat statbuf;.  
5140: 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28      if( osFstat(
5150: 66 64 2c 20 26 73 74 61 74 62 75 66 29 3d 3d 30  fd, &statbuf)==0
5160: 20 0a 20 20 20 20 20 20 20 26 26 20 73 74 61 74   .       && stat
5170: 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 0a 20  buf.st_size==0. 
5180: 20 20 20 20 20 20 26 26 20 28 73 74 61 74 62 75        && (statbu
5190: 66 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37 29 21  f.st_mode&0777)!
51a0: 3d 6d 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  =m .      ){.   
51b0: 20 20 20 20 20 6f 73 46 63 68 6d 6f 64 28 66 64       osFchmod(fd
51c0: 2c 20 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , m);.      }.  
51d0: 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28    }.#if defined(
51e0: 46 44 5f 43 4c 4f 45 58 45 43 29 20 26 26 20 28  FD_CLOEXEC) && (
51f0: 21 64 65 66 69 6e 65 64 28 4f 5f 43 4c 4f 45 58  !defined(O_CLOEX
5200: 45 43 29 20 7c 7c 20 4f 5f 43 4c 4f 45 58 45 43  EC) || O_CLOEXEC
5210: 3d 3d 30 29 0a 20 20 20 20 6f 73 46 63 6e 74 6c  ==0).    osFcntl
5220: 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20 6f 73  (fd, F_SETFD, os
5230: 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46  Fcntl(fd, F_GETF
5240: 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58  D, 0) | FD_CLOEX
5250: 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  EC);.#endif.  }.
5260: 20 20 72 65 74 75 72 6e 20 66 64 3b 0a 7d 0a 0a    return fd;.}..
5270: 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e  /*.** Helper fun
5280: 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e  ctions to obtain
5290: 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20   and relinquish 
52a0: 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78  the global mutex
52b0: 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20  . The.** global 
52c0: 6d 75 74 65 78 20 69 73 20 75 73 65 64 20 74 6f  mutex is used to
52d0: 20 70 72 6f 74 65 63 74 20 74 68 65 20 75 6e 69   protect the uni
52e0: 78 49 6e 6f 64 65 49 6e 66 6f 20 61 6e 64 0a 2a  xInodeInfo and.*
52f0: 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  * vxworksFileId 
5300: 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62 79 20  objects used by 
5310: 74 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f  this file, all o
5320: 66 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a  f which may be .
5330: 2a 2a 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c  ** shared by mul
5340: 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a  tiple threads..*
5350: 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 75 6e  *.** Function un
5360: 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73  ixMutexHeld() is
5370: 20 75 73 65 64 20 74 6f 20 61 73 73 65 72 74 28   used to assert(
5380: 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61  ) that the globa
5390: 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20 68  l mutex .** is h
53a0: 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72 65  eld when require
53b0: 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
53c0: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73   is only used as
53d0: 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74 28   part of assert(
53e0: 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73  ) .** statements
53f0: 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75  . e.g..**.**   u
5400: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 0a  nixEnterMutex().
5410: 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 20 75  **     assert( u
5420: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
5430: 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65 72  ;.**   unixEnter
5440: 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74 61 74 69  Leave().*/.stati
5450: 63 20 76 6f 69 64 20 75 6e 69 78 45 6e 74 65 72  c void unixEnter
5460: 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73  Mutex(void){.  s
5470: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
5480: 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  er(sqlite3MutexA
5490: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
54a0: 58 5f 53 54 41 54 49 43 5f 56 46 53 31 29 29 3b  X_STATIC_VFS1));
54b0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  .}.static void u
54c0: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 76 6f  nixLeaveMutex(vo
54d0: 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  id){.  sqlite3_m
54e0: 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74  utex_leave(sqlit
54f0: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
5500: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
5510: 5f 56 46 53 31 29 29 3b 0a 7d 0a 23 69 66 64 65  _VFS1));.}.#ifde
5520: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73  f SQLITE_DEBUG.s
5530: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 75  tatic int unixMu
5540: 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a  texHeld(void) {.
5550: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
5560: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c 69  _mutex_held(sqli
5570: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
5580: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
5590: 43 5f 56 46 53 31 29 29 3b 0a 7d 0a 23 65 6e 64  C_VFS1));.}.#end
55a0: 69 66 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  if...#ifdef SQLI
55b0: 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43 45  TE_HAVE_OS_TRACE
55c0: 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75  ./*.** Helper fu
55d0: 6e 63 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74  nction for print
55e0: 69 6e 67 20 6f 75 74 20 74 72 61 63 65 20 69 6e  ing out trace in
55f0: 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64  formation from d
5600: 65 62 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61  ebugging.** bina
5610: 72 69 65 73 2e 20 54 68 69 73 20 72 65 74 75 72  ries. This retur
5620: 6e 73 20 74 68 65 20 73 74 72 69 6e 67 20 72 65  ns the string re
5630: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
5640: 74 68 65 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20  the supplied.** 
5650: 69 6e 74 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70  integer lock-typ
5660: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  e..*/.static con
5670: 73 74 20 63 68 61 72 20 2a 61 7a 46 69 6c 65 4c  st char *azFileL
5680: 6f 63 6b 28 69 6e 74 20 65 46 69 6c 65 4c 6f 63  ock(int eFileLoc
5690: 6b 29 7b 0a 20 20 73 77 69 74 63 68 28 20 65 46  k){.  switch( eF
56a0: 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 63  ileLock ){.    c
56b0: 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74  ase NO_LOCK: ret
56c0: 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a 20 20 20 20  urn "NONE";.    
56d0: 63 61 73 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b  case SHARED_LOCK
56e0: 3a 20 72 65 74 75 72 6e 20 22 53 48 41 52 45 44  : return "SHARED
56f0: 22 3b 0a 20 20 20 20 63 61 73 65 20 52 45 53 45  ";.    case RESE
5700: 52 56 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72  RVED_LOCK: retur
5710: 6e 20 22 52 45 53 45 52 56 45 44 22 3b 0a 20 20  n "RESERVED";.  
5720: 20 20 63 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c    case PENDING_L
5730: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 50 45 4e  OCK: return "PEN
5740: 44 49 4e 47 22 3b 0a 20 20 20 20 63 61 73 65 20  DING";.    case 
5750: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20  EXCLUSIVE_LOCK: 
5760: 72 65 74 75 72 6e 20 22 45 58 43 4c 55 53 49 56  return "EXCLUSIV
5770: 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  E";.  }.  return
5780: 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64   "ERROR";.}.#end
5790: 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
57a0: 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a  E_LOCK_TRACE./*.
57b0: 2a 2a 20 50 72 69 6e 74 20 6f 75 74 20 69 6e 66  ** Print out inf
57c0: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61  ormation about a
57d0: 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61  ll locking opera
57e0: 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tions..**.** Thi
57f0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
5800: 64 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f  d for troublesho
5810: 6f 74 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d  oting locks on m
5820: 75 6c 74 69 74 68 72 65 61 64 65 64 0a 2a 2a 20  ultithreaded.** 
5830: 70 6c 61 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62  platforms.  Enab
5840: 6c 65 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20  le by compiling 
5850: 77 69 74 68 20 74 68 65 20 2d 44 53 51 4c 49 54  with the -DSQLIT
5860: 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20  E_LOCK_TRACE.** 
5870: 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74  command-line opt
5880: 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69  ion on the compi
5890: 6c 65 72 2e 20 20 54 68 69 73 20 63 6f 64 65 20  ler.  This code 
58a0: 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74  is normally.** t
58b0: 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74  urned off..*/.st
58c0: 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61  atic int lockTra
58d0: 63 65 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f  ce(int fd, int o
58e0: 70 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  p, struct flock 
58f0: 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70  *p){.  char *zOp
5900: 4e 61 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20  Name, *zType;.  
5910: 69 6e 74 20 73 3b 0a 20 20 69 6e 74 20 73 61 76  int s;.  int sav
5920: 65 64 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f  edErrno;.  if( o
5930: 70 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20  p==F_GETLK ){.  
5940: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54    zOpName = "GET
5950: 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  LK";.  }else if(
5960: 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a   op==F_SETLK ){.
5970: 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53      zOpName = "S
5980: 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ETLK";.  }else{.
5990: 20 20 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28      s = osFcntl(
59a0: 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 20 20  fd, op, p);.    
59b0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
59c0: 74 66 28 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77  tf("fcntl unknow
59d0: 6e 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 66  n %d %d %d\n", f
59e0: 64 2c 20 6f 70 2c 20 73 29 3b 0a 20 20 20 20 72  d, op, s);.    r
59f0: 65 74 75 72 6e 20 73 3b 0a 20 20 7d 0a 20 20 69  eturn s;.  }.  i
5a00: 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f  f( p->l_type==F_
5a10: 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79  RDLCK ){.    zTy
5a20: 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20  pe = "RDLCK";.  
5a30: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74  }else if( p->l_t
5a40: 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a  ype==F_WRLCK ){.
5a50: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c      zType = "WRL
5a60: 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  CK";.  }else if(
5a70: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e   p->l_type==F_UN
5a80: 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  LCK ){.    zType
5a90: 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65   = "UNLCK";.  }e
5aa0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
5ab0: 20 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65   0 );.  }.  asse
5ac0: 72 74 28 20 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d  rt( p->l_whence=
5ad0: 3d 53 45 45 4b 5f 53 45 54 20 29 3b 0a 20 20 73  =SEEK_SET );.  s
5ae0: 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f   = osFcntl(fd, o
5af0: 70 2c 20 70 29 3b 0a 20 20 73 61 76 65 64 45 72  p, p);.  savedEr
5b00: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 73  rno = errno;.  s
5b10: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
5b20: 66 28 22 66 63 6e 74 6c 20 25 64 20 25 64 20 25  f("fcntl %d %d %
5b30: 73 20 25 73 20 25 64 20 25 64 20 25 64 20 25 64  s %s %d %d %d %d
5b40: 5c 6e 22 2c 0a 20 20 20 20 20 74 68 72 65 61 64  \n",.     thread
5b50: 69 64 2c 20 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c  id, fd, zOpName,
5b60: 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 70 2d 3e   zType, (int)p->
5b70: 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 70 2d  l_start, (int)p-
5b80: 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20 20 28 69 6e  >l_len,.     (in
5b90: 74 29 70 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a  t)p->l_pid, s);.
5ba0: 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 26 26    if( s==(-1) &&
5bb0: 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26 20   op==F_SETLK && 
5bc0: 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44  (p->l_type==F_RD
5bd0: 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65  LCK || p->l_type
5be0: 3d 3d 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20 20  ==F_WRLCK) ){.  
5bf0: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
5c00: 32 3b 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b 0a  2;.    l2 = *p;.
5c10: 20 20 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20      osFcntl(fd, 
5c20: 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20  F_GETLK, &l2);. 
5c30: 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65     if( l2.l_type
5c40: 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20  ==F_RDLCK ){.   
5c50: 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43     zType = "RDLC
5c60: 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  K";.    }else if
5c70: 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57  ( l2.l_type==F_W
5c80: 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54  RLCK ){.      zT
5c90: 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20  ype = "WRLCK";. 
5ca0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e     }else if( l2.
5cb0: 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20  l_type==F_UNLCK 
5cc0: 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  ){.      zType =
5cd0: 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d 65   "UNLCK";.    }e
5ce0: 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
5cf0: 74 28 20 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  t( 0 );.    }.  
5d00: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
5d10: 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66 61 69 6c  intf("fcntl-fail
5d20: 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25 73 20 25  ure-reason: %s %
5d30: 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20  d %d %d\n",.    
5d40: 20 20 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 6c     zType, (int)l
5d50: 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29  2.l_start, (int)
5d60: 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c  l2.l_len, (int)l
5d70: 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a 20 20  2.l_pid);.  }.  
5d80: 65 72 72 6e 6f 20 3d 20 73 61 76 65 64 45 72 72  errno = savedErr
5d90: 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a  no;.  return s;.
5da0: 7d 0a 23 75 6e 64 65 66 20 6f 73 46 63 6e 74 6c  }.#undef osFcntl
5db0: 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 6e 74 6c  .#define osFcntl
5dc0: 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65 6e 64 69   lockTrace.#endi
5dd0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  f /* SQLITE_LOCK
5de0: 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _TRACE */../*.**
5df0: 20 52 65 74 72 79 20 66 74 72 75 6e 63 61 74 65   Retry ftruncate
5e00: 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 66 61  () calls that fa
5e10: 69 6c 20 64 75 65 20 74 6f 20 45 49 4e 54 52 0a  il due to EINTR.
5e20: 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 61 6c 6c 73 20  **.** All calls 
5e30: 74 6f 20 66 74 72 75 6e 63 61 74 65 28 29 20 77  to ftruncate() w
5e40: 69 74 68 69 6e 20 74 68 69 73 20 66 69 6c 65 20  ithin this file 
5e50: 73 68 6f 75 6c 64 20 62 65 20 6d 61 64 65 20 74  should be made t
5e60: 68 72 6f 75 67 68 0a 2a 2a 20 74 68 69 73 20 77  hrough.** this w
5e70: 72 61 70 70 65 72 2e 20 20 4f 6e 20 74 68 65 20  rapper.  On the 
5e80: 41 6e 64 72 6f 69 64 20 70 6c 61 74 66 6f 72 6d  Android platform
5e90: 2c 20 62 79 70 61 73 73 69 6e 67 20 74 68 65 20  , bypassing the 
5ea0: 6c 6f 67 69 63 20 62 65 6c 6f 77 0a 2a 2a 20 63  logic below.** c
5eb0: 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 63  ould lead to a c
5ec0: 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 2e  orrupt database.
5ed0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
5ee0: 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28  obust_ftruncate(
5ef0: 69 6e 74 20 68 2c 20 73 71 6c 69 74 65 33 5f 69  int h, sqlite3_i
5f00: 6e 74 36 34 20 73 7a 29 7b 0a 20 20 69 6e 74 20  nt64 sz){.  int 
5f10: 72 63 3b 0a 23 69 66 64 65 66 20 5f 5f 41 4e 44  rc;.#ifdef __AND
5f20: 52 4f 49 44 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 41  ROID__.  /* On A
5f30: 6e 64 72 6f 69 64 2c 20 66 74 72 75 6e 63 61 74  ndroid, ftruncat
5f40: 65 28 29 20 61 6c 77 61 79 73 20 75 73 65 73 20  e() always uses 
5f50: 33 32 2d 62 69 74 20 6f 66 66 73 65 74 73 2c 20  32-bit offsets, 
5f60: 65 76 65 6e 20 69 66 20 0a 20 20 2a 2a 20 5f 46  even if .  ** _F
5f70: 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54 53 3d  ILE_OFFSET_BITS=
5f80: 36 34 20 69 73 20 64 65 66 69 6e 65 64 2e 20 54  64 is defined. T
5f90: 68 69 73 20 6d 65 61 6e 73 20 69 74 20 69 73 20  his means it is 
5fa0: 75 6e 73 61 66 65 20 74 6f 20 61 74 74 65 6d 70  unsafe to attemp
5fb0: 74 20 74 6f 0a 20 20 2a 2a 20 74 72 75 6e 63 61  t to.  ** trunca
5fc0: 74 65 20 61 20 66 69 6c 65 20 74 6f 20 61 6e 79  te a file to any
5fd0: 20 73 69 7a 65 20 6c 61 72 67 65 72 20 74 68 61   size larger tha
5fe0: 6e 20 32 47 69 42 2e 20 53 69 6c 65 6e 74 6c 79  n 2GiB. Silently
5ff0: 20 69 67 6e 6f 72 65 20 61 6e 79 0a 20 20 2a 2a   ignore any.  **
6000: 20 73 75 63 68 20 61 74 74 65 6d 70 74 73 2e 20   such attempts. 
6010: 20 2a 2f 0a 20 20 69 66 28 20 73 7a 3e 28 73 71   */.  if( sz>(sq
6020: 6c 69 74 65 33 5f 69 6e 74 36 34 29 30 78 37 46  lite3_int64)0x7F
6030: 46 46 46 46 46 46 20 29 7b 0a 20 20 20 20 72 63  FFFFFF ){.    rc
6040: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
6050: 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 64  }else.#endif.  d
6060: 6f 7b 20 72 63 20 3d 20 6f 73 46 74 72 75 6e 63  o{ rc = osFtrunc
6070: 61 74 65 28 68 2c 73 7a 29 3b 20 7d 77 68 69 6c  ate(h,sz); }whil
6080: 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f  e( rc<0 && errno
6090: 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74  ==EINTR );.  ret
60a0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
60b0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 74 72   This routine tr
60c0: 61 6e 73 6c 61 74 65 73 20 61 20 73 74 61 6e 64  anslates a stand
60d0: 61 72 64 20 50 4f 53 49 58 20 65 72 72 6e 6f 20  ard POSIX errno 
60e0: 63 6f 64 65 20 69 6e 74 6f 20 73 6f 6d 65 74 68  code into someth
60f0: 69 6e 67 0a 2a 2a 20 75 73 65 66 75 6c 20 74 6f  ing.** useful to
6100: 20 74 68 65 20 63 6c 69 65 6e 74 73 20 6f 66 20   the clients of 
6110: 74 68 65 20 73 71 6c 69 74 65 33 20 66 75 6e 63  the sqlite3 func
6120: 74 69 6f 6e 73 2e 20 20 53 70 65 63 69 66 69 63  tions.  Specific
6130: 61 6c 6c 79 2c 20 69 74 20 69 73 0a 2a 2a 20 69  ally, it is.** i
6140: 6e 74 65 6e 64 65 64 20 74 6f 20 74 72 61 6e 73  ntended to trans
6150: 6c 61 74 65 20 61 20 76 61 72 69 65 74 79 20 6f  late a variety o
6160: 66 20 22 74 72 79 20 61 67 61 69 6e 22 20 65 72  f "try again" er
6170: 72 6f 72 73 20 69 6e 74 6f 20 53 51 4c 49 54 45  rors into SQLITE
6180: 5f 42 55 53 59 0a 2a 2a 20 61 6e 64 20 61 20 76  _BUSY.** and a v
6190: 61 72 69 65 74 79 20 6f 66 20 22 70 6c 65 61 73  ariety of "pleas
61a0: 65 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  e close the file
61b0: 20 64 65 73 63 72 69 70 74 6f 72 20 4e 4f 57 22   descriptor NOW"
61c0: 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 0a 2a 2a   errors into .**
61d0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 2a 2a   SQLITE_IOERR.**
61e0: 20 0a 2a 2a 20 45 72 72 6f 72 73 20 64 75 72 69   .** Errors duri
61f0: 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ng initializatio
6200: 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f 72 20 66  n of locks, or f
6210: 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ile system suppo
6220: 72 74 20 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a 2a  rt for locks,.**
6230: 20 73 68 6f 75 6c 64 20 68 61 6e 64 6c 65 20 45   should handle E
6240: 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55 50 2c 20  NOLCK, ENOTSUP, 
6250: 45 4f 50 4e 4f 54 53 55 50 50 20 73 65 70 61 72  EOPNOTSUPP separ
6260: 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ately..*/.static
6270: 20 69 6e 74 20 73 71 6c 69 74 65 45 72 72 6f 72   int sqliteError
6280: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 69  FromPosixError(i
6290: 6e 74 20 70 6f 73 69 78 45 72 72 6f 72 2c 20 69  nt posixError, i
62a0: 6e 74 20 73 71 6c 69 74 65 49 4f 45 72 72 29 20  nt sqliteIOErr) 
62b0: 7b 0a 20 20 61 73 73 65 72 74 28 20 28 73 71 6c  {.  assert( (sql
62c0: 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49  iteIOErr == SQLI
62d0: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c  TE_IOERR_LOCK) |
62e0: 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 73 71  | .          (sq
62f0: 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c  liteIOErr == SQL
6300: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
6310: 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  ) || .          
6320: 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20  (sqliteIOErr == 
6330: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
6340: 4f 43 4b 29 20 7c 7c 0a 20 20 20 20 20 20 20 20  OCK) ||.        
6350: 20 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d    (sqliteIOErr =
6360: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  = SQLITE_IOERR_C
6370: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
6380: 29 20 29 3b 0a 20 20 73 77 69 74 63 68 20 28 70  ) );.  switch (p
6390: 6f 73 69 78 45 72 72 6f 72 29 20 7b 0a 20 20 63  osixError) {.  c
63a0: 61 73 65 20 45 41 43 43 45 53 3a 20 0a 20 20 63  ase EACCES: .  c
63b0: 61 73 65 20 45 41 47 41 49 4e 3a 0a 20 20 63 61  ase EAGAIN:.  ca
63c0: 73 65 20 45 54 49 4d 45 44 4f 55 54 3a 0a 20 20  se ETIMEDOUT:.  
63d0: 63 61 73 65 20 45 42 55 53 59 3a 0a 20 20 63 61  case EBUSY:.  ca
63e0: 73 65 20 45 49 4e 54 52 3a 0a 20 20 63 61 73 65  se EINTR:.  case
63f0: 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20 20 20 20 2f   ENOLCK:  .    /
6400: 2a 20 72 61 6e 64 6f 6d 20 4e 46 53 20 72 65 74  * random NFS ret
6410: 72 79 20 65 72 72 6f 72 2c 20 75 6e 6c 65 73 73  ry error, unless
6420: 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73   during file sys
6430: 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20  tem support .   
6440: 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f    * introspectio
6450: 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74 20 61  n, in which it a
6460: 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68  ctually means wh
6470: 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 20 20  at it says */.  
6480: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6490: 42 55 53 59 3b 0a 20 20 20 20 0a 20 20 63 61 73  BUSY;.    .  cas
64a0: 65 20 45 50 45 52 4d 3a 20 0a 20 20 20 20 72 65  e EPERM: .    re
64b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
64c0: 3b 0a 20 20 20 20 0a 20 20 64 65 66 61 75 6c 74  ;.    .  default
64d0: 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  : .    return sq
64e0: 6c 69 74 65 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d  liteIOErr;.  }.}
64f0: 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
6500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6540: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
6550: 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 55 6e 69 71  ***** Begin Uniq
6560: 75 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69  ue File ID Utili
6570: 74 79 20 55 73 65 64 20 42 79 20 56 78 57 6f 72  ty Used By VxWor
6580: 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ks *************
6590: 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74  **.**.** On most
65a0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69   versions of uni
65b0: 78 2c 20 77 65 20 63 61 6e 20 67 65 74 20 61 20  x, we can get a 
65c0: 75 6e 69 71 75 65 20 49 44 20 66 6f 72 20 61 20  unique ID for a 
65d0: 66 69 6c 65 20 62 79 20 63 6f 6e 63 61 74 65 6e  file by concaten
65e0: 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20 64 65 76  ating.** the dev
65f0: 69 63 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74  ice number and t
6600: 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e  he inode number.
6610: 20 20 42 75 74 20 74 68 69 73 20 64 6f 65 73 20    But this does 
6620: 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f  not work on VxWo
6630: 72 6b 73 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72  rks..** On VxWor
6640: 6b 73 2c 20 61 20 75 6e 69 71 75 65 20 66 69 6c  ks, a unique fil
6650: 65 20 69 64 20 6d 75 73 74 20 62 65 20 62 61 73  e id must be bas
6660: 65 64 20 6f 6e 20 74 68 65 20 63 61 6e 6f 6e 69  ed on the canoni
6670: 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a  cal filename..**
6680: 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f  .** A pointer to
6690: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
66a0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
66b0: 72 75 63 74 75 72 65 20 63 61 6e 20 62 65 20 75  ructure can be u
66c0: 73 65 64 20 61 73 20 61 0a 2a 2a 20 75 6e 69 71  sed as a.** uniq
66d0: 75 65 20 66 69 6c 65 20 49 44 20 69 6e 20 56 78  ue file ID in Vx
66e0: 57 6f 72 6b 73 2e 20 20 45 61 63 68 20 69 6e 73  Works.  Each ins
66f0: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
6700: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
6710: 0a 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20 74 68  .** a copy of th
6720: 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65  e canonical file
6730: 6e 61 6d 65 2e 20 20 54 68 65 72 65 20 69 73 20  name.  There is 
6740: 61 6c 73 6f 20 61 20 72 65 66 65 72 65 6e 63 65  also a reference
6750: 20 63 6f 75 6e 74 2e 20 20 0a 2a 2a 20 54 68 65   count.  .** The
6760: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 72 65   structure is re
6770: 63 6c 61 69 6d 65 64 20 77 68 65 6e 20 74 68 65  claimed when the
6780: 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74   number of point
6790: 65 72 73 20 74 6f 20 69 74 20 64 72 6f 70 73 20  ers to it drops 
67a0: 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a  to.** zero..**.*
67b0: 2a 20 54 68 65 72 65 20 61 72 65 20 6e 65 76 65  * There are neve
67c0: 72 20 76 65 72 79 20 6d 61 6e 79 20 66 69 6c 65  r very many file
67d0: 73 20 6f 70 65 6e 20 61 74 20 6f 6e 65 20 74 69  s open at one ti
67e0: 6d 65 20 61 6e 64 20 6c 6f 6f 6b 75 70 73 20 61  me and lookups a
67f0: 72 65 20 6e 6f 74 0a 2a 2a 20 61 20 70 65 72 66  re not.** a perf
6800: 6f 72 6d 61 6e 63 65 2d 63 72 69 74 69 63 61 6c  ormance-critical
6810: 20 70 61 74 68 2c 20 73 6f 20 69 74 20 69 73 20   path, so it is 
6820: 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20 70 75  sufficient to pu
6830: 74 20 74 68 65 73 65 0a 2a 2a 20 73 74 72 75 63  t these.** struc
6840: 74 75 72 65 73 20 6f 6e 20 61 20 6c 69 6e 6b 65  tures on a linke
6850: 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63  d list..*/.struc
6860: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
6870: 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  {.  struct vxwor
6880: 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 78 74 3b  ksFileId *pNext;
6890: 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 61 20 6c    /* Next in a l
68a0: 69 73 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20  ist of them all 
68b0: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
68c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68d0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
68e0: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
68f0: 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  is one */.  int 
6900: 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  nName;          
6910: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
6920: 67 74 68 20 6f 66 20 74 68 65 20 7a 43 61 6e 6f  gth of the zCano
6930: 6e 69 63 61 6c 4e 61 6d 65 5b 5d 20 73 74 72 69  nicalName[] stri
6940: 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43  ng */.  char *zC
6950: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 3b 20 20 20  anonicalName;   
6960: 20 20 20 20 20 20 2f 2a 20 43 61 6e 6f 6e 69 63        /* Canonic
6970: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d  al filename */.}
6980: 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  ;..#if OS_VXWORK
6990: 53 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69  S./* .** All uni
69a0: 71 75 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72  que filenames ar
69b0: 65 20 68 65 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b  e held on a link
69c0: 65 64 20 6c 69 73 74 20 68 65 61 64 65 64 20 62  ed list headed b
69d0: 79 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 62  y this.** variab
69e0: 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  le:.*/.static st
69f0: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
6a00: 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6c 65 4c  Id *vxworksFileL
6a10: 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ist = 0;../*.** 
6a20: 53 69 6d 70 6c 69 66 79 20 61 20 66 69 6c 65 6e  Simplify a filen
6a30: 61 6d 65 20 69 6e 74 6f 20 69 74 73 20 63 61 6e  ame into its can
6a40: 6f 6e 69 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62  onical form.** b
6a50: 79 20 6d 61 6b 69 6e 67 20 74 68 65 20 66 6f 6c  y making the fol
6a60: 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73 3a 0a  lowing changes:.
6a70: 2a 2a 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76 69 6e  **.**  * removin
6a80: 67 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 61  g any trailing a
6a90: 6e 64 20 64 75 70 6c 69 63 61 74 65 20 2f 0a 2a  nd duplicate /.*
6aa0: 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 2e 2f  *  * convert /./
6ab0: 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20   into just /.** 
6ac0: 20 2a 20 63 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e   * convert /A/..
6ad0: 2f 20 77 68 65 72 65 20 41 20 69 73 20 61 6e 79  / where A is any
6ae0: 20 73 69 6d 70 6c 65 20 6e 61 6d 65 20 69 6e 74   simple name int
6af0: 6f 20 6a 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43  o just /.**.** C
6b00: 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
6b10: 69 6e 2d 70 6c 61 63 65 2e 20 20 52 65 74 75 72  in-place.  Retur
6b20: 6e 20 74 68 65 20 6e 65 77 20 6e 61 6d 65 20 6c  n the new name l
6b30: 65 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ength..**.** The
6b40: 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61   original filena
6b50: 6d 65 20 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d  me is in z[0..n-
6b60: 31 5d 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  1].  Return the 
6b70: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 68 61  number of.** cha
6b80: 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 73  racters in the s
6b90: 69 6d 70 6c 69 66 69 65 64 20 6e 61 6d 65 2e 0a  implified name..
6ba0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 78  */.static int vx
6bb0: 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d  worksSimplifyNam
6bc0: 65 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  e(char *z, int n
6bd0: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
6be0: 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a   while( n>1 && z
6bf0: 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d  [n-1]=='/' ){ n-
6c00: 2d 3b 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  -; }.  for(i=j=0
6c10: 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
6c20: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29   if( z[i]=='/' )
6c30: 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b  {.      if( z[i+
6c40: 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e  1]=='/' ) contin
6c50: 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b  ue;.      if( z[
6c60: 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 32  i+1]=='.' && i+2
6c70: 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f  <n && z[i+2]=='/
6c80: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2b  ' ){.        i +
6c90: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  = 1;.        con
6ca0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
6cb0: 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d       if( z[i+1]=
6cc0: 3d 27 2e 27 20 26 26 20 69 2b 33 3c 6e 20 26 26  ='.' && i+3<n &&
6cd0: 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20   z[i+2]=='.' && 
6ce0: 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20  z[i+3]=='/' ){. 
6cf0: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e         while( j>
6d00: 30 20 26 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27  0 && z[j-1]!='/'
6d10: 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20   ){ j--; }.     
6d20: 20 20 20 69 66 28 20 6a 3e 30 20 29 7b 20 6a 2d     if( j>0 ){ j-
6d30: 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 20 2b  -; }.        i +
6d40: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  = 2;.        con
6d50: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
6d60: 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20     }.    z[j++] 
6d70: 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b  = z[i];.  }.  z[
6d80: 6a 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  j] = 0;.  return
6d90: 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e   j;.}../*.** Fin
6da0: 64 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20  d a unique file 
6db0: 49 44 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  ID for the given
6dc0: 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 6e 61   absolute pathna
6dd0: 6d 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61  me.  Return.** a
6de0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
6df0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62  vxworksFileId ob
6e00: 6a 65 63 74 2e 20 20 54 68 69 73 20 70 6f 69 6e  ject.  This poin
6e10: 74 65 72 20 69 73 20 74 68 65 20 75 6e 69 71 75  ter is the uniqu
6e20: 65 0a 2a 2a 20 66 69 6c 65 20 49 44 2e 0a 2a 2a  e.** file ID..**
6e30: 0a 2a 2a 20 54 68 65 20 6e 52 65 66 20 66 69 65  .** The nRef fie
6e40: 6c 64 20 6f 66 20 74 68 65 20 76 78 77 6f 72 6b  ld of the vxwork
6e50: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69  sFileId object i
6e60: 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 65  s incremented be
6e70: 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65  fore.** the obje
6e80: 63 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ct is returned. 
6e90: 20 41 20 6e 65 77 20 76 78 77 6f 72 6b 73 46 69   A new vxworksFi
6ea0: 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20 63  leId object is c
6eb0: 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 61 64  reated.** and ad
6ec0: 64 65 64 20 74 6f 20 74 68 65 20 67 6c 6f 62 61  ded to the globa
6ed0: 6c 20 6c 69 73 74 20 69 66 20 6e 65 63 65 73 73  l list if necess
6ee0: 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ary..**.** If a 
6ef0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
6f00: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
6f10: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
6f20: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 76 78  static struct vx
6f30: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77  worksFileId *vxw
6f40: 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 63  orksFindFileId(c
6f50: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 62 73 6f  onst char *zAbso
6f60: 6c 75 74 65 4e 61 6d 65 29 7b 0a 20 20 73 74 72  luteName){.  str
6f70: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
6f80: 64 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  d *pNew;        
6f90: 20 2f 2a 20 73 65 61 72 63 68 20 6b 65 79 20 61   /* search key a
6fa0: 6e 64 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a  nd new file ID *
6fb0: 2f 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  /.  struct vxwor
6fc0: 6b 73 46 69 6c 65 49 64 20 2a 70 43 61 6e 64 69  ksFileId *pCandi
6fd0: 64 61 74 65 3b 20 20 20 2f 2a 20 46 6f 72 20 6c  date;   /* For l
6fe0: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 69 73  ooping over exis
6ff0: 74 69 6e 67 20 66 69 6c 65 20 49 44 73 20 2a 2f  ting file IDs */
7000: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
7010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7020: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
7030: 20 6f 66 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d   of zAbsoluteNam
7040: 65 20 73 74 72 69 6e 67 20 2a 2f 0a 0a 20 20 61  e string */..  a
7050: 73 73 65 72 74 28 20 7a 41 62 73 6f 6c 75 74 65  ssert( zAbsolute
7060: 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a  Name[0]=='/' );.
7070: 20 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65    n = (int)strle
7080: 6e 28 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29  n(zAbsoluteName)
7090: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
70a0: 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a  e3_malloc64( siz
70b0: 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20 28 6e 2b  eof(*pNew) + (n+
70c0: 31 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  1) );.  if( pNew
70d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
70e0: 20 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63    pNew->zCanonic
70f0: 61 6c 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  alName = (char*)
7100: 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63  &pNew[1];.  memc
7110: 70 79 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69  py(pNew->zCanoni
7120: 63 61 6c 4e 61 6d 65 2c 20 7a 41 62 73 6f 6c 75  calName, zAbsolu
7130: 74 65 4e 61 6d 65 2c 20 6e 2b 31 29 3b 0a 20 20  teName, n+1);.  
7140: 6e 20 3d 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c  n = vxworksSimpl
7150: 69 66 79 4e 61 6d 65 28 70 4e 65 77 2d 3e 7a 43  ifyName(pNew->zC
7160: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29  anonicalName, n)
7170: 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66  ;..  /* Search f
7180: 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65  or an existing e
7190: 6e 74 72 79 20 74 68 61 74 20 6d 61 74 63 68 69  ntry that matchi
71a0: 6e 67 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c  ng the canonical
71b0: 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 49 66 20 66   name..  ** If f
71c0: 6f 75 6e 64 2c 20 69 6e 63 72 65 6d 65 6e 74 20  ound, increment 
71d0: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
71e0: 75 6e 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61  unt and return a
71f0: 20 70 6f 69 6e 74 65 72 20 74 6f 0a 20 20 2a 2a   pointer to.  **
7200: 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 66 69   the existing fi
7210: 6c 65 20 49 44 2e 0a 20 20 2a 2f 0a 20 20 75 6e  le ID..  */.  un
7220: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
7230: 20 20 66 6f 72 28 70 43 61 6e 64 69 64 61 74 65    for(pCandidate
7240: 3d 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74  =vxworksFileList
7250: 3b 20 70 43 61 6e 64 69 64 61 74 65 3b 20 70 43  ; pCandidate; pC
7260: 61 6e 64 69 64 61 74 65 3d 70 43 61 6e 64 69 64  andidate=pCandid
7270: 61 74 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ate->pNext){.   
7280: 20 69 66 28 20 70 43 61 6e 64 69 64 61 74 65 2d   if( pCandidate-
7290: 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a 20 20 20 20 20  >nName==n .     
72a0: 26 26 20 6d 65 6d 63 6d 70 28 70 43 61 6e 64 69  && memcmp(pCandi
72b0: 64 61 74 65 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  date->zCanonical
72c0: 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 43 61 6e  Name, pNew->zCan
72d0: 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3d 3d  onicalName, n)==
72e0: 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20  0.    ){.       
72f0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
7300: 77 29 3b 0a 20 20 20 20 20 20 20 70 43 61 6e 64  w);.       pCand
7310: 69 64 61 74 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  idate->nRef++;. 
7320: 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d        unixLeaveM
7330: 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 20 72  utex();.       r
7340: 65 74 75 72 6e 20 70 43 61 6e 64 69 64 61 74 65  eturn pCandidate
7350: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
7360: 2a 20 4e 6f 20 6d 61 74 63 68 20 77 61 73 20 66  * No match was f
7370: 6f 75 6e 64 2e 20 20 57 65 20 77 69 6c 6c 20 6d  ound.  We will m
7380: 61 6b 65 20 61 20 6e 65 77 20 66 69 6c 65 20 49  ake a new file I
7390: 44 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e 6e 52 65  D */.  pNew->nRe
73a0: 66 20 3d 20 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e  f = 1;.  pNew->n
73b0: 4e 61 6d 65 20 3d 20 6e 3b 0a 20 20 70 4e 65 77  Name = n;.  pNew
73c0: 2d 3e 70 4e 65 78 74 20 3d 20 76 78 77 6f 72 6b  ->pNext = vxwork
73d0: 73 46 69 6c 65 4c 69 73 74 3b 0a 20 20 76 78 77  sFileList;.  vxw
73e0: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 70  orksFileList = p
73f0: 4e 65 77 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65  New;.  unixLeave
7400: 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72  Mutex();.  retur
7410: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
7420: 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Decrement the r
7430: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f  eference count o
7440: 6e 20 61 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  n a vxworksFileI
7450: 64 20 6f 62 6a 65 63 74 2e 20 20 46 72 65 65 0a  d object.  Free.
7460: 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74 20 77 68  ** the object wh
7470: 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  en the reference
7480: 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a   count reaches z
7490: 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ero..*/.static v
74a0: 6f 69 64 20 76 78 77 6f 72 6b 73 52 65 6c 65 61  oid vxworksRelea
74b0: 73 65 46 69 6c 65 49 64 28 73 74 72 75 63 74 20  seFileId(struct 
74c0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
74d0: 49 64 29 7b 0a 20 20 75 6e 69 78 45 6e 74 65 72  Id){.  unixEnter
74e0: 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72  Mutex();.  asser
74f0: 74 28 20 70 49 64 2d 3e 6e 52 65 66 3e 30 20 29  t( pId->nRef>0 )
7500: 3b 0a 20 20 70 49 64 2d 3e 6e 52 65 66 2d 2d 3b  ;.  pId->nRef--;
7510: 0a 20 20 69 66 28 20 70 49 64 2d 3e 6e 52 65 66  .  if( pId->nRef
7520: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ==0 ){.    struc
7530: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
7540: 2a 2a 70 70 3b 0a 20 20 20 20 66 6f 72 28 70 70  **pp;.    for(pp
7550: 3d 26 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73  =&vxworksFileLis
7560: 74 3b 20 2a 70 70 20 26 26 20 2a 70 70 21 3d 70  t; *pp && *pp!=p
7570: 49 64 3b 20 70 70 20 3d 20 26 28 28 2a 70 70 29  Id; pp = &((*pp)
7580: 2d 3e 70 4e 65 78 74 29 29 7b 7d 0a 20 20 20 20  ->pNext)){}.    
7590: 61 73 73 65 72 74 28 20 2a 70 70 3d 3d 70 49 64  assert( *pp==pId
75a0: 20 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 49   );.    *pp = pI
75b0: 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71  d->pNext;.    sq
75c0: 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 29 3b  lite3_free(pId);
75d0: 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65  .  }.  unixLeave
75e0: 4d 75 74 65 78 28 29 3b 0a 7d 0a 23 65 6e 64 69  Mutex();.}.#endi
75f0: 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20  f /* OS_VXWORKS 
7600: 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */./************
7610: 2a 2a 2a 20 45 6e 64 20 6f 66 20 55 6e 69 71 75  *** End of Uniqu
7620: 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74  e File ID Utilit
7630: 79 20 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b  y Used By VxWork
7640: 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
7650: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
7660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
76a0: 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */.../**********
76b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
76c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
76d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
76e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
76f0: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
7700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7710: 20 50 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20   Posix Advisory 
7720: 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
7730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7740: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58  ****.**.** POSIX
7750: 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20   advisory locks 
7760: 61 72 65 20 62 72 6f 6b 65 6e 20 62 79 20 64 65  are broken by de
7770: 73 69 67 6e 2e 20 20 41 4e 53 49 20 53 54 44 20  sign.  ANSI STD 
7780: 31 30 30 33 2e 31 20 28 31 39 39 36 29 0a 2a 2a  1003.1 (1996).**
7790: 20 73 65 63 74 69 6f 6e 20 36 2e 35 2e 32 2e 32   section 6.5.2.2
77a0: 20 6c 69 6e 65 73 20 34 38 33 20 74 68 72 6f 75   lines 483 throu
77b0: 67 68 20 34 39 30 20 73 70 65 63 69 66 79 20 74  gh 490 specify t
77c0: 68 61 74 20 77 68 65 6e 20 61 20 70 72 6f 63 65  hat when a proce
77d0: 73 73 0a 2a 2a 20 73 65 74 73 20 6f 72 20 63 6c  ss.** sets or cl
77e0: 65 61 72 73 20 61 20 6c 6f 63 6b 2c 20 74 68 61  ears a lock, tha
77f0: 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 76 65 72  t operation over
7800: 72 69 64 65 73 20 61 6e 79 20 70 72 69 6f 72 20  rides any prior 
7810: 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a 20 62 79 20  locks set.** by 
7820: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
7830: 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 65  .  It does not e
7840: 78 70 6c 69 63 69 74 6c 79 20 73 61 79 20 73 6f  xplicitly say so
7850: 2c 20 62 75 74 20 74 68 69 73 20 69 6d 70 6c 69  , but this impli
7860: 65 73 0a 2a 2a 20 74 68 61 74 20 69 74 20 6f 76  es.** that it ov
7870: 65 72 72 69 64 65 73 20 6c 6f 63 6b 73 20 73 65  errides locks se
7880: 74 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 72  t by the same pr
7890: 6f 63 65 73 73 20 75 73 69 6e 67 20 61 20 64 69  ocess using a di
78a0: 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20  fferent.** file 
78b0: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43 6f 6e  descriptor.  Con
78c0: 73 69 64 65 72 20 74 68 69 73 20 74 65 73 74 20  sider this test 
78d0: 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  case:.**.**     
78e0: 20 20 69 6e 74 20 66 64 31 20 3d 20 6f 70 65 6e    int fd1 = open
78f0: 28 22 2e 2f 66 69 6c 65 31 22 2c 20 4f 5f 52 44  ("./file1", O_RD
7900: 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34  WR|O_CREAT, 0644
7910: 29 3b 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20  );.**       int 
7920: 66 64 32 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69  fd2 = open("./fi
7930: 6c 65 32 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43  le2", O_RDWR|O_C
7940: 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a  REAT, 0644);.**.
7950: 2a 2a 20 53 75 70 70 6f 73 65 20 2e 2f 66 69 6c  ** Suppose ./fil
7960: 65 31 20 61 6e 64 20 2e 2f 66 69 6c 65 32 20 61  e1 and ./file2 a
7970: 72 65 20 72 65 61 6c 6c 79 20 74 68 65 20 73 61  re really the sa
7980: 6d 65 20 66 69 6c 65 20 28 62 65 63 61 75 73 65  me file (because
7990: 0a 2a 2a 20 6f 6e 65 20 69 73 20 61 20 68 61 72  .** one is a har
79a0: 64 20 6f 72 20 73 79 6d 62 6f 6c 69 63 20 6c 69  d or symbolic li
79b0: 6e 6b 20 74 6f 20 74 68 65 20 6f 74 68 65 72 29  nk to the other)
79c0: 20 74 68 65 6e 20 69 66 20 79 6f 75 20 73 65 74   then if you set
79d0: 0a 2a 2a 20 61 6e 20 65 78 63 6c 75 73 69 76 65  .** an exclusive
79e0: 20 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c 20 74 68   lock on fd1, th
79f0: 65 6e 20 74 72 79 20 74 6f 20 67 65 74 20 61 6e  en try to get an
7a00: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a   exclusive lock.
7a10: 2a 2a 20 6f 6e 20 66 64 32 2c 20 69 74 20 77 6f  ** on fd2, it wo
7a20: 72 6b 73 2e 20 20 49 20 77 6f 75 6c 64 20 68 61  rks.  I would ha
7a30: 76 65 20 65 78 70 65 63 74 65 64 20 74 68 65 20  ve expected the 
7a40: 73 65 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a  second lock to.*
7a50: 2a 20 66 61 69 6c 20 73 69 6e 63 65 20 74 68 65  * fail since the
7a60: 72 65 20 77 61 73 20 61 6c 72 65 61 64 79 20 61  re was already a
7a70: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
7a80: 65 20 64 75 65 20 74 6f 20 66 64 31 2e 0a 2a 2a  e due to fd1..**
7a90: 20 42 75 74 20 6e 6f 74 20 73 6f 2e 20 20 53 69   But not so.  Si
7aa0: 6e 63 65 20 62 6f 74 68 20 6c 6f 63 6b 73 20 63  nce both locks c
7ab0: 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 73 61 6d  ame from the sam
7ac0: 65 20 70 72 6f 63 65 73 73 2c 20 74 68 65 0a 2a  e process, the.*
7ad0: 2a 20 73 65 63 6f 6e 64 20 6f 76 65 72 72 69 64  * second overrid
7ae0: 65 73 20 74 68 65 20 66 69 72 73 74 2c 20 65 76  es the first, ev
7af0: 65 6e 20 74 68 6f 75 67 68 20 74 68 65 79 20 77  en though they w
7b00: 65 72 65 20 6f 6e 20 64 69 66 66 65 72 65 6e 74  ere on different
7b10: 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70  .** file descrip
7b20: 74 6f 72 73 20 6f 70 65 6e 65 64 20 6f 6e 20 64  tors opened on d
7b30: 69 66 66 65 72 65 6e 74 20 66 69 6c 65 20 6e 61  ifferent file na
7b40: 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  mes..**.** This 
7b50: 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 63 61  means that we ca
7b60: 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49 58 20 6c  nnot use POSIX l
7b70: 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68 72 6f 6e  ocks to synchron
7b80: 69 7a 65 20 66 69 6c 65 20 61 63 63 65 73 73 0a  ize file access.
7b90: 2a 2a 20 61 6d 6f 6e 67 20 63 6f 6d 70 65 74 69  ** among competi
7ba0: 6e 67 20 74 68 72 65 61 64 73 20 6f 66 20 74 68  ng threads of th
7bb0: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20  e same process. 
7bc0: 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 77 69 6c   POSIX locks wil
7bd0: 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20 74  l work fine.** t
7be0: 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 61 63  o synchronize ac
7bf0: 63 65 73 73 20 66 6f 72 20 74 68 72 65 61 64 73  cess for threads
7c00: 20 69 6e 20 73 65 70 61 72 61 74 65 20 70 72 6f   in separate pro
7c10: 63 65 73 73 65 73 2c 20 62 75 74 20 6e 6f 74 0a  cesses, but not.
7c20: 2a 2a 20 74 68 72 65 61 64 73 20 77 69 74 68 69  ** threads withi
7c30: 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  n the same proce
7c40: 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72  ss..**.** To wor
7c50: 6b 20 61 72 6f 75 6e 64 20 74 68 65 20 70 72 6f  k around the pro
7c60: 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20 68 61 73  blem, SQLite has
7c70: 20 74 6f 20 6d 61 6e 61 67 65 20 66 69 6c 65 20   to manage file 
7c80: 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61 6c 6c 79  locks internally
7c90: 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77 6e 2e 20  .** on its own. 
7ca0: 20 57 68 65 6e 65 76 65 72 20 61 20 6e 65 77 20   Whenever a new 
7cb0: 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
7cc0: 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20 66  ed, we have to f
7cd0: 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70 65 63 69  ind the.** speci
7ce0: 66 69 63 20 69 6e 6f 64 65 20 6f 66 20 74 68 65  fic inode of the
7cf0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
7d00: 74 68 65 20 69 6e 6f 64 65 20 69 73 20 64 65 74  the inode is det
7d10: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 0a 2a  ermined by the.*
7d20: 2a 20 73 74 5f 64 65 76 20 61 6e 64 20 73 74 5f  * st_dev and st_
7d30: 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68  ino fields of th
7d40: 65 20 73 74 61 74 20 73 74 72 75 63 74 75 72 65  e stat structure
7d50: 20 74 68 61 74 20 66 73 74 61 74 28 29 20 66 69   that fstat() fi
7d60: 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e 64 20 63  lls in).** and c
7d70: 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b 73 20 61  heck for locks a
7d80: 6c 72 65 61 64 79 20 65 78 69 73 74 69 6e 67 20  lready existing 
7d90: 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65 2e 20 20  on that inode.  
7da0: 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72 65 0a 2a  When locks are.*
7db0: 2a 20 63 72 65 61 74 65 64 20 6f 72 20 72 65 6d  * created or rem
7dc0: 6f 76 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f  oved, we have to
7dd0: 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20 6f 77 6e   look at our own
7de0: 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64   internal record
7df0: 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73   of the.** locks
7e00: 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68   to see if anoth
7e10: 65 72 20 74 68 72 65 61 64 20 68 61 73 20 70 72  er thread has pr
7e20: 65 76 69 6f 75 73 6c 79 20 73 65 74 20 61 20 6c  eviously set a l
7e30: 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73 61 6d 65  ock on that same
7e40: 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a  .** inode..**.**
7e50: 20 28 41 73 69 64 65 3a 20 54 68 65 20 75 73 65   (Aside: The use
7e60: 20 6f 66 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72   of inode number
7e70: 73 20 61 73 20 75 6e 69 71 75 65 20 49 44 73 20  s as unique IDs 
7e80: 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e  does not work on
7e90: 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 46 6f 72   VxWorks..** For
7ea0: 20 56 78 57 6f 72 6b 73 2c 20 77 65 20 68 61 76   VxWorks, we hav
7eb0: 65 20 74 6f 20 75 73 65 20 74 68 65 20 61 6c 74  e to use the alt
7ec0: 65 72 6e 61 74 69 76 65 20 75 6e 69 71 75 65 20  ernative unique 
7ed0: 49 44 20 73 79 73 74 65 6d 20 62 61 73 65 64 20  ID system based 
7ee0: 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e 69 63 61 6c 20  on.** canonical 
7ef0: 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6d 70  filename and imp
7f00: 6c 65 6d 65 6e 74 65 64 20 69 6e 20 74 68 65 20  lemented in the 
7f10: 70 72 65 76 69 6f 75 73 20 64 69 76 69 73 69 6f  previous divisio
7f20: 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71  n.).**.** The sq
7f30: 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63  lite3_file struc
7f40: 74 75 72 65 20 66 6f 72 20 50 4f 53 49 58 20 69  ture for POSIX i
7f50: 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6a 75 73 74  s no longer just
7f60: 20 61 6e 20 69 6e 74 65 67 65 72 20 66 69 6c 65   an integer file
7f70: 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 2e 20  .** descriptor. 
7f80: 20 49 74 20 69 73 20 6e 6f 77 20 61 20 73 74 72   It is now a str
7f90: 75 63 74 75 72 65 20 74 68 61 74 20 68 6f 6c 64  ucture that hold
7fa0: 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 66 69  s the integer fi
7fb0: 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72  le.** descriptor
7fc0: 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74   and a pointer t
7fd0: 6f 20 61 20 73 74 72 75 63 74 75 72 65 20 74 68  o a structure th
7fe0: 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
7ff0: 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63   internal.** loc
8000: 6b 73 20 6f 6e 20 74 68 65 20 63 6f 72 72 65 73  ks on the corres
8010: 70 6f 6e 64 69 6e 67 20 69 6e 6f 64 65 2e 20 20  ponding inode.  
8020: 54 68 65 72 65 20 69 73 20 6f 6e 65 20 6c 6f 63  There is one loc
8030: 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 0a 2a  king structure.*
8040: 2a 20 70 65 72 20 69 6e 6f 64 65 2c 20 73 6f 20  * per inode, so 
8050: 69 66 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64  if the same inod
8060: 65 20 69 73 20 6f 70 65 6e 65 64 20 74 77 69 63  e is opened twic
8070: 65 2c 20 62 6f 74 68 20 75 6e 69 78 46 69 6c 65  e, both unixFile
8080: 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 70   structures.** p
8090: 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 61 6d 65  oint to the same
80a0: 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75   locking structu
80b0: 72 65 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  re.  The locking
80c0: 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73   structure keeps
80d0: 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20  .** a reference 
80e0: 63 6f 75 6e 74 20 28 73 6f 20 77 65 20 77 69 6c  count (so we wil
80f0: 6c 20 6b 6e 6f 77 20 77 68 65 6e 20 74 6f 20 64  l know when to d
8100: 65 6c 65 74 65 20 69 74 29 20 61 6e 64 20 61 20  elete it) and a 
8110: 22 63 6e 74 22 0a 2a 2a 20 66 69 65 6c 64 20 74  "cnt".** field t
8120: 68 61 74 20 74 65 6c 6c 73 20 75 73 20 69 74 73  hat tells us its
8130: 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73   internal lock s
8140: 74 61 74 75 73 2e 20 20 63 6e 74 3d 3d 30 20 6d  tatus.  cnt==0 m
8150: 65 61 6e 73 20 74 68 65 0a 2a 2a 20 66 69 6c 65  eans the.** file
8160: 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 63   is unlocked.  c
8170: 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73 20 74 68 65  nt==-1 means the
8180: 20 66 69 6c 65 20 68 61 73 20 61 6e 20 65 78 63   file has an exc
8190: 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a 2a 20  lusive lock..** 
81a0: 63 6e 74 3e 30 20 6d 65 61 6e 73 20 74 68 65 72  cnt>0 means ther
81b0: 65 20 61 72 65 20 63 6e 74 20 73 68 61 72 65 64  e are cnt shared
81c0: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66 69   locks on the fi
81d0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 61 74  le..**.** Any at
81e0: 74 65 6d 70 74 20 74 6f 20 6c 6f 63 6b 20 6f 72  tempt to lock or
81f0: 20 75 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 66   unlock a file f
8200: 69 72 73 74 20 63 68 65 63 6b 73 20 74 68 65 20  irst checks the 
8210: 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 75 63  locking.** struc
8220: 74 75 72 65 2e 20 20 54 68 65 20 66 63 6e 74 6c  ture.  The fcntl
8230: 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 69  () system call i
8240: 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 74  s only invoked t
8250: 6f 20 73 65 74 20 61 20 0a 2a 2a 20 50 4f 53 49  o set a .** POSI
8260: 58 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 69 6e  X lock if the in
8270: 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 72 75  ternal lock stru
8280: 63 74 75 72 65 20 74 72 61 6e 73 69 74 69 6f 6e  cture transition
8290: 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 61 20 6c  s between.** a l
82a0: 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20 75 6e 6c  ocked and an unl
82b0: 6f 63 6b 65 64 20 73 74 61 74 65 2e 0a 2a 2a 0a  ocked state..**.
82c0: 2a 2a 20 42 75 74 20 77 61 69 74 3a 20 20 74 68  ** But wait:  th
82d0: 65 72 65 20 61 72 65 20 79 65 74 20 6d 6f 72 65  ere are yet more
82e0: 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 50   problems with P
82f0: 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f  OSIX advisory lo
8300: 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f  cks..**.** If yo
8310: 75 20 63 6c 6f 73 65 20 61 20 66 69 6c 65 20 64  u close a file d
8320: 65 73 63 72 69 70 74 6f 72 20 74 68 61 74 20 70  escriptor that p
8330: 6f 69 6e 74 73 20 74 6f 20 61 20 66 69 6c 65 20  oints to a file 
8340: 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 73 2c 0a  that has locks,.
8350: 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20  ** all locks on 
8360: 74 68 61 74 20 66 69 6c 65 20 74 68 61 74 20 61  that file that a
8370: 72 65 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20  re owned by the 
8380: 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20  current process 
8390: 61 72 65 0a 2a 2a 20 72 65 6c 65 61 73 65 64 2e  are.** released.
83a0: 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64    To work around
83b0: 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 2c 20 65   this problem, e
83c0: 61 63 68 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ach unixInodeInf
83d0: 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 6d 61 69 6e  o object.** main
83e0: 74 61 69 6e 73 20 61 20 63 6f 75 6e 74 20 6f 66  tains a count of
83f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
8400: 65 6e 64 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20  ending locks on 
8410: 74 68 61 20 69 6e 6f 64 65 2e 0a 2a 2a 20 57 68  tha inode..** Wh
8420: 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  en an attempt is
8430: 20 6d 61 64 65 20 74 6f 20 63 6c 6f 73 65 20 61   made to close a
8440: 6e 20 75 6e 69 78 46 69 6c 65 2c 20 69 66 20 74  n unixFile, if t
8450: 68 65 72 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65  here are.** othe
8460: 72 20 75 6e 69 78 46 69 6c 65 20 6f 70 65 6e 20  r unixFile open 
8470: 6f 6e 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64  on the same inod
8480: 65 20 74 68 61 74 20 61 72 65 20 68 6f 6c 64 69  e that are holdi
8490: 6e 67 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63 61  ng locks, the ca
84a0: 6c 6c 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65 28 29  ll.** to close()
84b0: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
84c0: 70 74 6f 72 20 69 73 20 64 65 66 65 72 72 65 64  ptor is deferred
84d0: 20 75 6e 74 69 6c 20 61 6c 6c 20 6f 66 20 74 68   until all of th
84e0: 65 20 6c 6f 63 6b 73 20 63 6c 65 61 72 2e 0a 2a  e locks clear..*
84f0: 2a 20 54 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  * The unixInodeI
8500: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 6b 65  nfo structure ke
8510: 65 70 73 20 61 20 6c 69 73 74 20 6f 66 20 66 69  eps a list of fi
8520: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 74  le descriptors t
8530: 68 61 74 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 62  hat need to.** b
8540: 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 74 68 61  e closed and tha
8550: 74 20 6c 69 73 74 20 69 73 20 77 61 6c 6b 65 64  t list is walked
8560: 20 28 61 6e 64 20 63 6c 65 61 72 65 64 29 20 77   (and cleared) w
8570: 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63  hen the last loc
8580: 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a  k.** clears..**.
8590: 2a 2a 20 59 65 74 20 61 6e 6f 74 68 65 72 20 70  ** Yet another p
85a0: 72 6f 62 6c 65 6d 3a 20 20 4c 69 6e 75 78 54 68  roblem:  LinuxTh
85b0: 72 65 61 64 73 20 64 6f 20 6e 6f 74 20 70 6c 61  reads do not pla
85c0: 79 20 77 65 6c 6c 20 77 69 74 68 20 70 6f 73 69  y well with posi
85d0: 78 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d  x locks..**.** M
85e0: 61 6e 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f  any older versio
85f0: 6e 73 20 6f 66 20 6c 69 6e 75 78 20 75 73 65 20  ns of linux use 
8600: 74 68 65 20 4c 69 6e 75 78 54 68 72 65 61 64 73  the LinuxThreads
8610: 20 6c 69 62 72 61 72 79 20 77 68 69 63 68 20 69   library which i
8620: 73 0a 2a 2a 20 6e 6f 74 20 70 6f 73 69 78 20 63  s.** not posix c
8630: 6f 6d 70 6c 69 61 6e 74 2e 20 20 55 6e 64 65 72  ompliant.  Under
8640: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2c 20 61   LinuxThreads, a
8650: 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79   lock created by
8660: 20 74 68 72 65 61 64 0a 2a 2a 20 41 20 63 61 6e   thread.** A can
8670: 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20  not be modified 
8680: 6f 72 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79  or overridden by
8690: 20 61 20 64 69 66 66 65 72 65 6e 74 20 74 68 72   a different thr
86a0: 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 6c 79 20 74  ead B..** Only t
86b0: 68 72 65 61 64 20 41 20 63 61 6e 20 6d 6f 64 69  hread A can modi
86c0: 66 79 20 74 68 65 20 6c 6f 63 6b 2e 20 20 4c 6f  fy the lock.  Lo
86d0: 63 6b 69 6e 67 20 62 65 68 61 76 69 6f 72 20 69  cking behavior i
86e0: 73 20 63 6f 72 72 65 63 74 0a 2a 2a 20 69 66 20  s correct.** if 
86f0: 74 68 65 20 61 70 70 6c 69 61 74 69 6f 6e 20 75  the appliation u
8700: 73 65 73 20 74 68 65 20 6e 65 77 65 72 20 4e 61  ses the newer Na
8710: 74 69 76 65 20 50 6f 73 69 78 20 54 68 72 65 61  tive Posix Threa
8720: 64 20 4c 69 62 72 61 72 79 20 28 4e 50 54 4c 29  d Library (NPTL)
8730: 0a 2a 2a 20 6f 6e 20 6c 69 6e 75 78 20 2d 20 77  .** on linux - w
8740: 69 74 68 20 4e 50 54 4c 20 61 20 6c 6f 63 6b 20  ith NPTL a lock 
8750: 63 72 65 61 74 65 64 20 62 79 20 74 68 72 65 61  created by threa
8760: 64 20 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65  d A can override
8770: 20 6c 6f 63 6b 73 0a 2a 2a 20 69 6e 20 74 68 72   locks.** in thr
8780: 65 61 64 20 42 2e 20 20 42 75 74 20 74 68 65 72  ead B.  But ther
8790: 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b  e is no way to k
87a0: 6e 6f 77 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  now at compile-t
87b0: 69 6d 65 20 77 68 69 63 68 0a 2a 2a 20 74 68 72  ime which.** thr
87c0: 65 61 64 69 6e 67 20 6c 69 62 72 61 72 79 20 69  eading library i
87d0: 73 20 62 65 69 6e 67 20 75 73 65 64 2e 20 20 53  s being used.  S
87e0: 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61  o there is no wa
87f0: 79 20 74 6f 20 6b 6e 6f 77 20 61 74 0a 2a 2a 20  y to know at.** 
8800: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65  compile-time whe
8810: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65  ther or not thre
8820: 61 64 20 41 20 63 61 6e 20 6f 76 65 72 72 69 64  ad A can overrid
8830: 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 72 65 61  e locks on threa
8840: 64 20 42 2e 0a 2a 2a 20 4f 6e 65 20 68 61 73 20  d B..** One has 
8850: 74 6f 20 64 6f 20 61 20 72 75 6e 2d 74 69 6d 65  to do a run-time
8860: 20 63 68 65 63 6b 20 74 6f 20 64 69 73 63 6f 76   check to discov
8870: 65 72 20 74 68 65 20 62 65 68 61 76 69 6f 72 20  er the behavior 
8880: 6f 66 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  of the.** curren
8890: 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  t process..**.**
88a0: 20 53 51 4c 69 74 65 20 75 73 65 64 20 74 6f 20   SQLite used to 
88b0: 73 75 70 70 6f 72 74 20 4c 69 6e 75 78 54 68 72  support LinuxThr
88c0: 65 61 64 73 2e 20 20 42 75 74 20 73 75 70 70 6f  eads.  But suppo
88d0: 72 74 20 66 6f 72 20 4c 69 6e 75 78 54 68 72 65  rt for LinuxThre
88e0: 61 64 73 0a 2a 2a 20 77 61 73 20 64 72 6f 70 70  ads.** was dropp
88f0: 65 64 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74  ed beginning wit
8900: 68 20 76 65 72 73 69 6f 6e 20 33 2e 37 2e 30 2e  h version 3.7.0.
8910: 20 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 73 74    SQLite will st
8920: 69 6c 6c 20 77 6f 72 6b 20 77 69 74 68 0a 2a 2a  ill work with.**
8930: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 70 72   LinuxThreads pr
8940: 6f 76 69 64 65 64 20 74 68 61 74 20 28 31 29 20  ovided that (1) 
8950: 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 6f 72 65  there is no more
8960: 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6e 6e 65 63   than one connec
8970: 74 69 6f 6e 20 0a 2a 2a 20 70 65 72 20 64 61 74  tion .** per dat
8980: 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68  abase file in th
8990: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 61  e same process a
89a0: 6e 64 20 28 32 29 20 64 61 74 61 62 61 73 65 20  nd (2) database 
89b0: 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 64  connections.** d
89c0: 6f 20 6e 6f 74 20 6d 6f 76 65 20 61 63 72 6f 73  o not move acros
89d0: 73 20 74 68 72 65 61 64 73 2e 0a 2a 2f 0a 0a 2f  s threads..*/../
89e0: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
89f0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
8a00: 67 20 73 74 72 75 63 74 75 72 65 20 73 65 72 76  g structure serv
8a10: 65 73 20 61 73 20 74 68 65 20 6b 65 79 20 75 73  es as the key us
8a20: 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20  ed.** to locate 
8a30: 61 20 70 61 72 74 69 63 75 6c 61 72 20 75 6e 69  a particular uni
8a40: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
8a50: 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69  t..*/.struct uni
8a60: 78 46 69 6c 65 49 64 20 7b 0a 20 20 64 65 76 5f  xFileId {.  dev_
8a70: 74 20 64 65 76 3b 20 20 20 20 20 20 20 20 20 20  t dev;          
8a80: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63          /* Devic
8a90: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 69 66 20  e number */.#if 
8aa0: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72  OS_VXWORKS.  str
8ab0: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
8ac0: 64 20 2a 70 49 64 3b 20 20 2f 2a 20 55 6e 69 71  d *pId;  /* Uniq
8ad0: 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72 20 76  ue file ID for v
8ae0: 78 77 6f 72 6b 73 2e 20 2a 2f 0a 23 65 6c 73 65  xworks. */.#else
8af0: 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20  .  ino_t ino;   
8b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8b10: 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a  * Inode number *
8b20: 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
8b30: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
8b40: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
8b50: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c  structure is all
8b60: 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20  ocated for each 
8b70: 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20  open.** inode.  
8b80: 4f 72 2c 20 6f 6e 20 4c 69 6e 75 78 54 68 72 65  Or, on LinuxThre
8b90: 61 64 73 2c 20 74 68 65 72 65 20 69 73 20 6f 6e  ads, there is on
8ba0: 65 20 6f 66 20 74 68 65 73 65 20 73 74 72 75 63  e of these struc
8bb0: 74 75 72 65 73 20 66 6f 72 0a 2a 2a 20 65 61 63  tures for.** eac
8bc0: 68 20 69 6e 6f 64 65 20 6f 70 65 6e 65 64 20 62  h inode opened b
8bd0: 79 20 65 61 63 68 20 74 68 72 65 61 64 2e 0a 2a  y each thread..*
8be0: 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e  *.** A single in
8bf0: 6f 64 65 20 63 61 6e 20 68 61 76 65 20 6d 75 6c  ode can have mul
8c00: 74 69 70 6c 65 20 66 69 6c 65 20 64 65 73 63 72  tiple file descr
8c10: 69 70 74 6f 72 73 2c 20 73 6f 20 65 61 63 68 20  iptors, so each 
8c20: 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75  unixFile.** stru
8c30: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61  cture contains a
8c40: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69   pointer to an i
8c50: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
8c60: 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 69 73 0a  object and this.
8c70: 2a 2a 20 6f 62 6a 65 63 74 20 6b 65 65 70 73 20  ** object keeps 
8c80: 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e  a count of the n
8c90: 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 46 69 6c  umber of unixFil
8ca0: 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74  e pointing to it
8cb0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78  ..*/.struct unix
8cc0: 49 6e 6f 64 65 49 6e 66 6f 20 7b 0a 20 20 73 74  InodeInfo {.  st
8cd0: 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20  ruct unixFileId 
8ce0: 66 69 6c 65 49 64 3b 20 20 20 20 20 20 20 2f 2a  fileId;       /*
8cf0: 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20   The lookup key 
8d00: 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 61 72 65 64  */.  int nShared
8d10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8d20: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8d30: 66 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 68  f SHARED locks h
8d40: 65 6c 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  eld */.  unsigne
8d50: 64 20 63 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b  d char eFileLock
8d60: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  ;        /* One 
8d70: 6f 66 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20  of SHARED_LOCK, 
8d80: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74  RESERVED_LOCK et
8d90: 63 2e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  c. */.  unsigned
8da0: 20 63 68 61 72 20 62 50 72 6f 63 65 73 73 4c 6f   char bProcessLo
8db0: 63 6b 3b 20 20 20 20 20 2f 2a 20 41 6e 20 65 78  ck;     /* An ex
8dc0: 63 6c 75 73 69 76 65 20 70 72 6f 63 65 73 73 20  clusive process 
8dd0: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 2a 2f 0a  lock is held */.
8de0: 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
8df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e00: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
8e10: 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69 73 20  ointers to this 
8e20: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 75  structure */.  u
8e30: 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
8e40: 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f  Node;          /
8e50: 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * Shared memory 
8e60: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
8e70: 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20  this inode */.  
8e80: 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20 20 20 20  int nLock;      
8e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ea0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74  /* Number of out
8eb0: 73 74 61 6e 64 69 6e 67 20 66 69 6c 65 20 6c 6f  standing file lo
8ec0: 63 6b 73 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75  cks */.  UnixUnu
8ed0: 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20  sedFd *pUnused; 
8ee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73           /* Unus
8ef0: 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
8f00: 6f 72 73 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a  ors to close */.
8f10: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
8f20: 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20  *pNext;         
8f30: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c    /* List of all
8f40: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
8f50: 62 6a 65 63 74 73 20 2a 2f 0a 20 20 75 6e 69 78  bjects */.  unix
8f60: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 50 72 65 76  InodeInfo *pPrev
8f70: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20  ;           /*  
8f80: 20 20 2e 2e 2e 2e 20 64 6f 75 62 6c 79 20 6c 69    .... doubly li
8f90: 6e 6b 65 64 20 2a 2f 0a 23 69 66 20 53 51 4c 49  nked */.#if SQLI
8fa0: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
8fb0: 47 5f 53 54 59 4c 45 0a 20 20 75 6e 73 69 67 6e  G_STYLE.  unsign
8fc0: 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61  ed long long sha
8fd0: 72 65 64 42 79 74 65 3b 20 20 2f 2a 20 66 6f 72  redByte;  /* for
8fe0: 20 41 46 50 20 73 69 6d 75 6c 61 74 65 64 20 73   AFP simulated s
8ff0: 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a 23 65  hared lock */.#e
9000: 6e 64 69 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f  ndif.#if OS_VXWO
9010: 52 4b 53 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65  RKS.  sem_t *pSe
9020: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
9030: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20 50        /* Named P
9040: 4f 53 49 58 20 73 65 6d 61 70 68 6f 72 65 20 2a  OSIX semaphore *
9050: 2f 0a 20 20 63 68 61 72 20 61 53 65 6d 4e 61 6d  /.  char aSemNam
9060: 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32  e[MAX_PATHNAME+2
9070: 5d 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  ];  /* Name of t
9080: 68 61 74 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f  hat semaphore */
9090: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
90a0: 2a 20 41 20 6c 69 73 74 73 20 6f 66 20 61 6c 6c  * A lists of all
90b0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
90c0: 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  bjects..*/.stati
90d0: 63 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  c unixInodeInfo 
90e0: 2a 69 6e 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a  *inodeList = 0;.
90f0: 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ./*.**.** This f
9100: 75 6e 63 74 69 6f 6e 20 2d 20 75 6e 69 78 4c 6f  unction - unixLo
9110: 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 29 2c 20  gErrorAtLine(), 
9120: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c  is only ever cal
9130: 6c 65 64 20 76 69 61 20 74 68 65 20 6d 61 63 72  led via the macr
9140: 6f 0a 2a 2a 20 75 6e 69 78 4c 6f 67 45 72 72 6f  o.** unixLogErro
9150: 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  r()..**.** It is
9160: 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72 20 61   invoked after a
9170: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69  n error occurs i
9180: 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e  n an OS function
9190: 20 61 6e 64 20 65 72 72 6e 6f 20 68 61 73 20 62   and errno has b
91a0: 65 65 6e 0a 2a 2a 20 73 65 74 2e 20 49 74 20 6c  een.** set. It l
91b0: 6f 67 73 20 61 20 6d 65 73 73 61 67 65 20 75 73  ogs a message us
91c0: 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  ing sqlite3_log(
91d0: 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  ) containing the
91e0: 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
91f0: 66 0a 2a 2a 20 65 72 72 6e 6f 20 61 6e 64 2c 20  f.** errno and, 
9200: 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65  if possible, the
9210: 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20   human-readable 
9220: 65 71 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20  equivalent from 
9230: 73 74 72 65 72 72 6f 72 28 29 20 6f 72 0a 2a 2a  strerror() or.**
9240: 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a 2a   strerror_r()..*
9250: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61  *.** The first a
9260: 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
9270: 6f 20 74 68 65 20 6d 61 63 72 6f 20 73 68 6f 75  o the macro shou
9280: 6c 64 20 62 65 20 74 68 65 20 65 72 72 6f 72 20  ld be the error 
9290: 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c  code that.** wil
92a0: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f  l be returned to
92b0: 20 53 51 4c 69 74 65 20 28 65 2e 67 2e 20 53 51   SQLite (e.g. SQ
92c0: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
92d0: 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  E, SQLITE_CANTOP
92e0: 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20 74 77 6f  EN). .** The two
92f0: 20 73 75 62 73 65 71 75 65 6e 74 20 61 72 67 75   subsequent argu
9300: 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20  ments should be 
9310: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
9320: 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  OS function that
9330: 0a 2a 2a 20 66 61 69 6c 65 64 20 28 65 2e 67 2e  .** failed (e.g.
9340: 20 22 75 6e 6c 69 6e 6b 22 2c 20 22 6f 70 65 6e   "unlink", "open
9350: 22 29 20 61 6e 64 20 74 68 65 20 61 73 73 6f 63  ") and the assoc
9360: 69 61 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65  iated file-syste
9370: 6d 20 70 61 74 68 2c 0a 2a 2a 20 69 66 20 61 6e  m path,.** if an
9380: 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 75 6e  y..*/.#define un
9390: 69 78 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63  ixLogError(a,b,c
93a0: 29 20 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72  )     unixLogErr
93b0: 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 5f  orAtLine(a,b,c,_
93c0: 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20  _LINE__).static 
93d0: 69 6e 74 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  int unixLogError
93e0: 41 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65 72  AtLine(.  int er
93f0: 72 63 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20  rcode,          
9400: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
9410: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a  ite error code *
9420: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
9430: 7a 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20  zFunc,          
9440: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f      /* Name of O
9450: 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  S function that 
9460: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  failed */.  cons
9470: 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
9480: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
9490: 69 6c 65 20 70 61 74 68 20 61 73 73 6f 63 69 61  ile path associa
94a0: 74 65 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a  ted with error *
94b0: 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20  /.  int iLine   
94c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94d0: 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69      /* Source li
94e0: 6e 65 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20  ne number where 
94f0: 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a  error occurred *
9500: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72  /.){.  char *zEr
9510: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
9520: 20 20 20 20 20 20 20 2f 2a 20 4d 65 73 73 61 67         /* Messag
9530: 65 20 66 72 6f 6d 20 73 74 72 65 72 72 6f 72 28  e from strerror(
9540: 29 20 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 20  ) or equivalent 
9550: 2a 2f 0a 20 20 69 6e 74 20 69 45 72 72 6e 6f 20  */.  int iErrno 
9560: 3d 20 65 72 72 6e 6f 3b 20 20 20 20 20 20 20 20  = errno;        
9570: 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 73 79       /* Saved sy
9580: 73 63 61 6c 6c 20 65 72 72 6f 72 20 6e 75 6d 62  scall error numb
9590: 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74  er */..  /* If t
95a0: 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 68 72  his is not a thr
95b0: 65 61 64 73 61 66 65 20 62 75 69 6c 64 20 28 53  eadsafe build (S
95c0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
95d0: 3d 3d 30 29 2c 20 74 68 65 6e 20 75 73 65 0a 20  ==0), then use. 
95e0: 20 2a 2a 20 74 68 65 20 73 74 72 65 72 72 6f 72   ** the strerror
95f0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 6f  () function to o
9600: 62 74 61 69 6e 20 74 68 65 20 68 75 6d 61 6e 2d  btain the human-
9610: 72 65 61 64 61 62 6c 65 20 65 72 72 6f 72 20 6d  readable error m
9620: 65 73 73 61 67 65 0a 20 20 2a 2a 20 65 71 75 69  essage.  ** equi
9630: 76 61 6c 65 6e 74 20 74 6f 20 65 72 72 6e 6f 2e  valent to errno.
9640: 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20   Otherwise, use 
9650: 73 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a 20 20  strerror_r()..  
9660: 2a 2f 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  */ .#if SQLITE_T
9670: 48 52 45 41 44 53 41 46 45 20 26 26 20 64 65 66  HREADSAFE && def
9680: 69 6e 65 64 28 48 41 56 45 5f 53 54 52 45 52 52  ined(HAVE_STRERR
9690: 4f 52 5f 52 29 0a 20 20 63 68 61 72 20 61 45 72  OR_R).  char aEr
96a0: 72 5b 38 30 5d 3b 0a 20 20 6d 65 6d 73 65 74 28  r[80];.  memset(
96b0: 61 45 72 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  aErr, 0, sizeof(
96c0: 61 45 72 72 29 29 3b 0a 20 20 7a 45 72 72 20 3d  aErr));.  zErr =
96d0: 20 61 45 72 72 3b 0a 0a 20 20 2f 2a 20 49 66 20   aErr;..  /* If 
96e0: 53 54 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f  STRERROR_R_CHAR_
96f0: 50 20 28 73 65 74 20 62 79 20 61 75 74 6f 63 6f  P (set by autoco
9700: 6e 66 20 73 63 72 69 70 74 73 29 20 6f 72 20 5f  nf scripts) or _
9710: 5f 55 53 45 5f 47 4e 55 20 69 73 20 64 65 66 69  _USE_GNU is defi
9720: 6e 65 64 2c 0a 20 20 2a 2a 20 61 73 73 75 6d 65  ned,.  ** assume
9730: 20 74 68 61 74 20 74 68 65 20 73 79 73 74 65 6d   that the system
9740: 20 70 72 6f 76 69 64 65 73 20 74 68 65 20 47 4e   provides the GN
9750: 55 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 74 72  U version of str
9760: 65 72 72 6f 72 5f 72 28 29 20 74 68 61 74 0a 20  error_r() that. 
9770: 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 70 6f   ** returns a po
9780: 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66 65  inter to a buffe
9790: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  r containing the
97a0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20   error message. 
97b0: 54 68 61 74 20 70 6f 69 6e 74 65 72 20 0a 20 20  That pointer .  
97c0: 2a 2a 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20  ** may point to 
97d0: 61 45 72 72 5b 5d 2c 20 6f 72 20 69 74 20 6d 61  aErr[], or it ma
97e0: 79 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20  y point to some 
97f0: 73 74 61 74 69 63 20 73 74 6f 72 61 67 65 20 73  static storage s
9800: 6f 6d 65 77 68 65 72 65 2e 20 0a 20 20 2a 2a 20  omewhere. .  ** 
9810: 4f 74 68 65 72 77 69 73 65 2c 20 61 73 73 75 6d  Otherwise, assum
9820: 65 20 74 68 61 74 20 74 68 65 20 73 79 73 74 65  e that the syste
9830: 6d 20 70 72 6f 76 69 64 65 73 20 74 68 65 20 50  m provides the P
9840: 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 6f 66 20  OSIX version of 
9850: 0a 20 20 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72  .  ** strerror_r
9860: 28 29 2c 20 77 68 69 63 68 20 61 6c 77 61 79 73  (), which always
9870: 20 77 72 69 74 65 73 20 61 6e 20 65 72 72 6f 72   writes an error
9880: 20 6d 65 73 73 61 67 65 20 69 6e 74 6f 20 61 45   message into aE
9890: 72 72 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rr[]..  **.  ** 
98a0: 49 66 20 74 68 65 20 63 6f 64 65 20 69 6e 63 6f  If the code inco
98b0: 72 72 65 63 74 6c 79 20 61 73 73 75 6d 65 73 20  rrectly assumes 
98c0: 74 68 61 74 20 69 74 20 69 73 20 74 68 65 20 50  that it is the P
98d0: 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 74 68 61  OSIX version tha
98e0: 74 20 69 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61  t is.  ** availa
98f0: 62 6c 65 2c 20 74 68 65 20 65 72 72 6f 72 20 6d  ble, the error m
9900: 65 73 73 61 67 65 20 77 69 6c 6c 20 6f 66 74 65  essage will ofte
9910: 6e 20 62 65 20 61 6e 20 65 6d 70 74 79 20 73 74  n be an empty st
9920: 72 69 6e 67 2e 20 4e 6f 74 20 61 0a 20 20 2a 2a  ring. Not a.  **
9930: 20 68 75 67 65 20 70 72 6f 62 6c 65 6d 2e 20 49   huge problem. I
9940: 6e 63 6f 72 72 65 63 74 6c 79 20 63 6f 6e 63 6c  ncorrectly concl
9950: 75 64 69 6e 67 20 74 68 61 74 20 74 68 65 20 47  uding that the G
9960: 4e 55 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76  NU version is av
9970: 61 69 6c 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f  ailable .  ** co
9980: 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 73 65  uld lead to a se
9990: 67 66 61 75 6c 74 20 74 68 6f 75 67 68 2e 0a 20  gfault though.. 
99a0: 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
99b0: 53 54 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f  STRERROR_R_CHAR_
99c0: 50 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f  P) || defined(__
99d0: 55 53 45 5f 47 4e 55 29 0a 20 20 7a 45 72 72 20  USE_GNU).  zErr 
99e0: 3d 20 0a 23 20 65 6e 64 69 66 0a 20 20 73 74 72  = .# endif.  str
99f0: 65 72 72 6f 72 5f 72 28 69 45 72 72 6e 6f 2c 20  error_r(iErrno, 
9a00: 61 45 72 72 2c 20 73 69 7a 65 6f 66 28 61 45 72  aErr, sizeof(aEr
9a10: 72 29 2d 31 29 3b 0a 0a 23 65 6c 69 66 20 53 51  r)-1);..#elif SQ
9a20: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
9a30: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 74    /* This is a t
9a40: 68 72 65 61 64 73 61 66 65 20 62 75 69 6c 64 2c  hreadsafe build,
9a50: 20 62 75 74 20 73 74 72 65 72 72 6f 72 5f 72 28   but strerror_r(
9a60: 29 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  ) is not availab
9a70: 6c 65 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20  le. */.  zErr = 
9a80: 22 22 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4e  "";.#else.  /* N
9a90: 6f 6e 2d 74 68 72 65 61 64 73 61 66 65 20 62 75  on-threadsafe bu
9aa0: 69 6c 64 2c 20 75 73 65 20 73 74 72 65 72 72 6f  ild, use strerro
9ab0: 72 28 29 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d  r(). */.  zErr =
9ac0: 20 73 74 72 65 72 72 6f 72 28 69 45 72 72 6e 6f   strerror(iErrno
9ad0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  );.#endif..  if(
9ae0: 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50 61 74   zPath==0 ) zPat
9af0: 68 20 3d 20 22 22 3b 0a 20 20 73 71 6c 69 74 65  h = "";.  sqlite
9b00: 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20  3_log(errcode,. 
9b10: 20 20 20 20 20 22 6f 73 5f 75 6e 69 78 2e 63 3a       "os_unix.c:
9b20: 25 64 3a 20 28 25 64 29 20 25 73 28 25 73 29 20  %d: (%d) %s(%s) 
9b30: 2d 20 25 73 22 2c 0a 20 20 20 20 20 20 69 4c 69  - %s",.      iLi
9b40: 6e 65 2c 20 69 45 72 72 6e 6f 2c 20 7a 46 75 6e  ne, iErrno, zFun
9b50: 63 2c 20 7a 50 61 74 68 2c 20 7a 45 72 72 0a 20  c, zPath, zErr. 
9b60: 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65 72   );..  return er
9b70: 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rcode;.}../*.** 
9b80: 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73  Close a file des
9b90: 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57  criptor..**.** W
9ba0: 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 63 6c  e assume that cl
9bb0: 6f 73 65 28 29 20 61 6c 6d 6f 73 74 20 61 6c 77  ose() almost alw
9bc0: 61 79 73 20 77 6f 72 6b 73 2c 20 73 69 6e 63 65  ays works, since
9bd0: 20 69 74 20 69 73 20 6f 6e 6c 79 20 69 6e 20 61   it is only in a
9be0: 0a 2a 2a 20 76 65 72 79 20 73 69 63 6b 20 61 70  .** very sick ap
9bf0: 70 6c 69 63 61 74 69 6f 6e 20 6f 72 20 6f 6e 20  plication or on 
9c00: 61 20 76 65 72 79 20 73 69 63 6b 20 70 6c 61 74  a very sick plat
9c10: 66 6f 72 6d 20 74 68 61 74 20 69 74 20 6d 69 67  form that it mig
9c20: 68 74 20 66 61 69 6c 2e 0a 2a 2a 20 49 66 20 69  ht fail..** If i
9c30: 74 20 64 6f 65 73 20 66 61 69 6c 2c 20 73 69 6d  t does fail, sim
9c40: 70 6c 79 20 6c 65 61 6b 20 74 68 65 20 66 69 6c  ply leak the fil
9c50: 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20 62 75  e descriptor, bu
9c60: 74 20 64 6f 20 6c 6f 67 20 74 68 65 0a 2a 2a 20  t do log the.** 
9c70: 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  error..**.** Not
9c80: 65 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74  e that it is not
9c90: 20 73 61 66 65 20 74 6f 20 72 65 74 72 79 20 63   safe to retry c
9ca0: 6c 6f 73 65 28 29 20 61 66 74 65 72 20 45 49 4e  lose() after EIN
9cb0: 54 52 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20  TR since the.** 
9cc0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
9cd0: 6d 69 67 68 74 20 68 61 76 65 20 61 6c 72 65 61  might have alrea
9ce0: 64 79 20 62 65 65 6e 20 72 65 75 73 65 64 20 62  dy been reused b
9cf0: 79 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  y another thread
9d00: 2e 0a 2a 2a 20 53 6f 20 77 65 20 64 6f 6e 27 74  ..** So we don't
9d10: 20 65 76 65 6e 20 74 72 79 20 74 6f 20 72 65 63   even try to rec
9d20: 6f 76 65 72 20 66 72 6f 6d 20 61 6e 20 45 49 4e  over from an EIN
9d30: 54 52 2e 20 20 4a 75 73 74 20 6c 6f 67 20 74 68  TR.  Just log th
9d40: 65 20 65 72 72 6f 72 0a 2a 2a 20 61 6e 64 20 6d  e error.** and m
9d50: 6f 76 65 20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ove on..*/.stati
9d60: 63 20 76 6f 69 64 20 72 6f 62 75 73 74 5f 63 6c  c void robust_cl
9d70: 6f 73 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ose(unixFile *pF
9d80: 69 6c 65 2c 20 69 6e 74 20 68 2c 20 69 6e 74 20  ile, int h, int 
9d90: 6c 69 6e 65 6e 6f 29 7b 0a 20 20 69 66 28 20 6f  lineno){.  if( o
9da0: 73 43 6c 6f 73 65 28 68 29 20 29 7b 0a 20 20 20  sClose(h) ){.   
9db0: 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c   unixLogErrorAtL
9dc0: 69 6e 65 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ine(SQLITE_IOERR
9dd0: 5f 43 4c 4f 53 45 2c 20 22 63 6c 6f 73 65 22 2c  _CLOSE, "close",
9de0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9df0: 20 20 20 20 20 20 20 20 70 46 69 6c 65 20 3f 20          pFile ? 
9e00: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3a 20 30  pFile->zPath : 0
9e10: 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d 0a 7d  , lineno);.  }.}
9e20: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
9e30: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
9e40: 2e 20 20 44 6f 20 74 68 69 73 20 69 6e 20 61 20  .  Do this in a 
9e50: 73 75 62 72 6f 75 74 69 6e 65 20 61 73 20 74 68  subroutine as th
9e60: 61 74 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 61  at provides.** a
9e70: 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63   convenient plac
9e80: 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b  e to set a break
9e90: 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  point..*/.static
9ea0: 20 76 6f 69 64 20 73 74 6f 72 65 4c 61 73 74 45   void storeLastE
9eb0: 72 72 6e 6f 28 75 6e 69 78 46 69 6c 65 20 2a 70  rrno(unixFile *p
9ec0: 46 69 6c 65 2c 20 69 6e 74 20 65 72 72 6f 72 29  File, int error)
9ed0: 7b 0a 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  {.  pFile->lastE
9ee0: 72 72 6e 6f 20 3d 20 65 72 72 6f 72 3b 0a 7d 0a  rrno = error;.}.
9ef0: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c  ./*.** Close all
9f00: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
9f10: 73 20 61 63 63 75 6d 75 61 74 65 64 20 69 6e 20  s accumuated in 
9f20: 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
9f30: 6f 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e  o->pUnused list.
9f40: 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/ .static void
9f50: 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73   closePendingFds
9f60: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
9f70: 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  ){.  unixInodeIn
9f80: 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
9f90: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e  le->pInode;.  Un
9fa0: 69 78 55 6e 75 73 65 64 46 64 20 2a 70 3b 0a 20  ixUnusedFd *p;. 
9fb0: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
9fc0: 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70 49  Next;.  for(p=pI
9fd0: 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 70  node->pUnused; p
9fe0: 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  ; p=pNext){.    
9ff0: 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
a000: 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f  ;.    robust_clo
a010: 73 65 28 70 46 69 6c 65 2c 20 70 2d 3e 66 64 2c  se(pFile, p->fd,
a020: 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
a030: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
a040: 0a 20 20 7d 0a 20 20 70 49 6e 6f 64 65 2d 3e 70  .  }.  pInode->p
a050: 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f  Unused = 0;.}../
a060: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 75  *.** Release a u
a070: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72  nixInodeInfo str
a080: 75 63 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c  ucture previousl
a090: 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66  y allocated by f
a0a0: 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 0a  indInodeInfo()..
a0b0: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20  **.** The mutex 
a0c0: 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74 68  entered using th
a0d0: 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  e unixEnterMutex
a0e0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  () function must
a0f0: 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e   be held.** when
a100: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
a110: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  s called..*/.sta
a120: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
a130: 49 6e 6f 64 65 49 6e 66 6f 28 75 6e 69 78 46 69  InodeInfo(unixFi
a140: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e  le *pFile){.  un
a150: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
a160: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
a170: 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75  ode;.  assert( u
a180: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
a190: 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
a1a0: 49 6e 6f 64 65 29 20 29 7b 0a 20 20 20 20 70 49  Inode) ){.    pI
a1b0: 6e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  node->nRef--;.  
a1c0: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 52    if( pInode->nR
a1d0: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ef==0 ){.      a
a1e0: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70  ssert( pInode->p
a1f0: 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 3b 0a 20 20  ShmNode==0 );.  
a200: 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67      closePending
a210: 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  Fds(pFile);.    
a220: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 50    if( pInode->pP
a230: 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 61  rev ){.        a
a240: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70  ssert( pInode->p
a250: 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e  Prev->pNext==pIn
a260: 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ode );.        p
a270: 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e  Inode->pPrev->pN
a280: 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e  ext = pInode->pN
a290: 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ext;.      }else
a2a0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
a2b0: 28 20 69 6e 6f 64 65 4c 69 73 74 3d 3d 70 49 6e  ( inodeList==pIn
a2c0: 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ode );.        i
a2d0: 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64  nodeList = pInod
a2e0: 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  e->pNext;.      
a2f0: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f  }.      if( pIno
a300: 64 65 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20  de->pNext ){.   
a310: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
a320: 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  ode->pNext->pPre
a330: 76 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20  v==pInode );.   
a340: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65       pInode->pNe
a350: 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f  xt->pPrev = pIno
a360: 64 65 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20  de->pPrev;.     
a370: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
a380: 5f 66 72 65 65 28 70 49 6e 6f 64 65 29 3b 0a 20  _free(pInode);. 
a390: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
a3a0: 2a 20 47 69 76 65 6e 20 61 20 66 69 6c 65 20 64  * Given a file d
a3b0: 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f 63 61 74  escriptor, locat
a3c0: 65 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  e the unixInodeI
a3d0: 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a  nfo object that.
a3e0: 2a 2a 20 64 65 73 63 72 69 62 65 73 20 74 68 61  ** describes tha
a3f0: 74 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  t file descripto
a400: 72 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  r.  Create a new
a410: 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72   one if necessar
a420: 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74 75 72  y.  The.** retur
a430: 6e 20 76 61 6c 75 65 20 6d 69 67 68 74 20 62 65  n value might be
a440: 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 69   uninitialized i
a450: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
a460: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74  s..**.** The mut
a470: 65 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67  ex entered using
a480: 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75   the unixEnterMu
a490: 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d  tex() function m
a4a0: 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77  ust be held.** w
a4b0: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
a4c0: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
a4d0: 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 61 70 70  ** Return an app
a4e0: 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
a4f0: 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
a500: 6e 74 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  nt findInodeInfo
a510: 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  (.  unixFile *pF
a520: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
a530: 20 20 20 2f 2a 20 55 6e 69 78 20 66 69 6c 65 20     /* Unix file 
a540: 77 69 74 68 20 66 69 6c 65 20 64 65 73 63 20 75  with file desc u
a550: 73 65 64 20 69 6e 20 74 68 65 20 6b 65 79 20 2a  sed in the key *
a560: 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
a570: 6f 20 2a 2a 70 70 49 6e 6f 64 65 20 20 20 20 20  o **ppInode     
a580: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
a590: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
a5a0: 62 6a 65 63 74 20 68 65 72 65 20 2a 2f 0a 29 7b  bject here */.){
a5b0: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
a5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5d0: 20 20 2f 2a 20 53 79 73 74 65 6d 20 63 61 6c 6c    /* System call
a5e0: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
a5f0: 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20    int fd;       
a600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a610: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
a620: 63 72 69 70 74 6f 72 20 66 6f 72 20 70 46 69 6c  criptor for pFil
a630: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e  e */.  struct un
a640: 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b  ixFileId fileId;
a650: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20        /* Lookup 
a660: 6b 65 79 20 66 6f 72 20 74 68 65 20 75 6e 69 78  key for the unix
a670: 49 6e 6f 64 65 49 6e 66 6f 20 2a 2f 0a 20 20 73  InodeInfo */.  s
a680: 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74 62  truct stat statb
a690: 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  uf;           /*
a6a0: 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20   Low-level file 
a6b0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
a6c0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
a6d0: 70 49 6e 6f 64 65 20 3d 20 30 3b 20 20 20 20 20  pInode = 0;     
a6e0: 2f 2a 20 43 61 6e 64 69 64 61 74 65 20 75 6e 69  /* Candidate uni
a6f0: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
a700: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
a710: 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
a720: 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 6c 6f 77  );..  /* Get low
a730: 2d 6c 65 76 65 6c 20 69 6e 66 6f 72 6d 61 74 69  -level informati
a740: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c  on about the fil
a750: 65 20 74 68 61 74 20 77 65 20 63 61 6e 20 75 73  e that we can us
a760: 65 64 20 74 6f 0a 20 20 2a 2a 20 63 72 65 61 74  ed to.  ** creat
a770: 65 20 61 20 75 6e 69 71 75 65 20 6e 61 6d 65 20  e a unique name 
a780: 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a 20 20  for the file..  
a790: 2a 2f 0a 20 20 66 64 20 3d 20 70 46 69 6c 65 2d  */.  fd = pFile-
a7a0: 3e 68 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73 74  >h;.  rc = osFst
a7b0: 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29  at(fd, &statbuf)
a7c0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b  ;.  if( rc!=0 ){
a7d0: 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72  .    storeLastEr
a7e0: 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f  rno(pFile, errno
a7f0: 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 45  );.#if defined(E
a800: 4f 56 45 52 46 4c 4f 57 29 20 26 26 20 64 65 66  OVERFLOW) && def
a810: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 49 53 41  ined(SQLITE_DISA
a820: 42 4c 45 5f 4c 46 53 29 0a 20 20 20 20 69 66 28  BLE_LFS).    if(
a830: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
a840: 6f 3d 3d 45 4f 56 45 52 46 4c 4f 57 20 29 20 72  o==EOVERFLOW ) r
a850: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c  eturn SQLITE_NOL
a860: 46 53 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72  FS;.#endif.    r
a870: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
a880: 52 52 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20  RR;.  }..#ifdef 
a890: 5f 5f 41 50 50 4c 45 5f 5f 0a 20 20 2f 2a 20 4f  __APPLE__.  /* O
a8a0: 6e 20 4f 53 20 58 20 6f 6e 20 61 6e 20 6d 73 64  n OS X on an msd
a8b0: 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2c 20 74  os filesystem, t
a8c0: 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 20  he inode number 
a8d0: 69 73 20 72 65 70 6f 72 74 65 64 0a 20 20 2a 2a  is reported.  **
a8e0: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 66 6f 72   incorrectly for
a8f0: 20 7a 65 72 6f 2d 73 69 7a 65 20 66 69 6c 65 73   zero-size files
a900: 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 33  .  See ticket #3
a910: 32 36 30 2e 20 20 54 6f 20 77 6f 72 6b 0a 20 20  260.  To work.  
a920: 2a 2a 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70  ** around this p
a930: 72 6f 62 6c 65 6d 20 28 77 65 20 63 6f 6e 73 69  roblem (we consi
a940: 64 65 72 20 69 74 20 61 20 62 75 67 20 69 6e 20  der it a bug in 
a950: 4f 53 20 58 2c 20 6e 6f 74 20 53 51 4c 69 74 65  OS X, not SQLite
a960: 29 0a 20 20 2a 2a 20 77 65 20 61 6c 77 61 79 73  ).  ** we always
a970: 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 66 69   increase the fi
a980: 6c 65 20 73 69 7a 65 20 74 6f 20 31 20 62 79 20  le size to 1 by 
a990: 77 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c 65  writing a single
a9a0: 20 62 79 74 65 0a 20 20 2a 2a 20 70 72 69 6f 72   byte.  ** prior
a9b0: 20 74 6f 20 61 63 63 65 73 73 69 6e 67 20 74 68   to accessing th
a9c0: 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20  e inode number. 
a9d0: 20 54 68 65 20 6f 6e 65 20 62 79 74 65 20 77 72   The one byte wr
a9e0: 69 74 74 65 6e 20 69 73 0a 20 20 2a 2a 20 61 6e  itten is.  ** an
a9f0: 20 41 53 43 49 49 20 27 53 27 20 63 68 61 72 61   ASCII 'S' chara
aa00: 63 74 65 72 20 77 68 69 63 68 20 61 6c 73 6f 20  cter which also 
aa10: 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 74 68  happens to be th
aa20: 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20 2a  e first byte.  *
aa30: 2a 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20  * in the header 
aa40: 6f 66 20 65 76 65 72 79 20 53 51 4c 69 74 65 20  of every SQLite 
aa50: 64 61 74 61 62 61 73 65 2e 20 20 49 6e 20 74 68  database.  In th
aa60: 69 73 20 77 61 79 2c 20 69 66 20 74 68 65 72 65  is way, if there
aa70: 0a 20 20 2a 2a 20 69 73 20 61 20 72 61 63 65 20  .  ** is a race 
aa80: 63 6f 6e 64 69 74 69 6f 6e 20 73 75 63 68 20 74  condition such t
aa90: 68 61 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65  hat another thre
aaa0: 61 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 70  ad has already p
aab0: 6f 70 75 6c 61 74 65 64 0a 20 20 2a 2a 20 74 68  opulated.  ** th
aac0: 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
aad0: 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6e 6f  the database, no
aae0: 20 64 61 6d 61 67 65 20 69 73 20 64 6f 6e 65 2e   damage is done.
aaf0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 74 61 74  .  */.  if( stat
ab00: 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 26  buf.st_size==0 &
ab10: 26 20 28 70 46 69 6c 65 2d 3e 66 73 46 6c 61 67  & (pFile->fsFlag
ab20: 73 20 26 20 53 51 4c 49 54 45 5f 46 53 46 4c 41  s & SQLITE_FSFLA
ab30: 47 53 5f 49 53 5f 4d 53 44 4f 53 29 21 3d 30 20  GS_IS_MSDOS)!=0 
ab40: 29 7b 0a 20 20 20 20 64 6f 7b 20 72 63 20 3d 20  ){.    do{ rc = 
ab50: 6f 73 57 72 69 74 65 28 66 64 2c 20 22 53 22 2c  osWrite(fd, "S",
ab60: 20 31 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c   1); }while( rc<
ab70: 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
ab80: 52 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  R );.    if( rc!
ab90: 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72  =1 ){.      stor
aba0: 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
abb0: 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20  , errno);.      
abc0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
abd0: 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ERR;.    }.    r
abe0: 63 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c 20  c = osFstat(fd, 
abf0: 26 73 74 61 74 62 75 66 29 3b 0a 20 20 20 20 69  &statbuf);.    i
ac00: 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
ac10: 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
ac20: 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a  (pFile, errno);.
ac30: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
ac40: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d  ITE_IOERR;.    }
ac50: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 6d  .  }.#endif..  m
ac60: 65 6d 73 65 74 28 26 66 69 6c 65 49 64 2c 20 30  emset(&fileId, 0
ac70: 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29  , sizeof(fileId)
ac80: 29 3b 0a 20 20 66 69 6c 65 49 64 2e 64 65 76 20  );.  fileId.dev 
ac90: 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 64 65 76  = statbuf.st_dev
aca0: 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ;.#if OS_VXWORKS
acb0: 0a 20 20 66 69 6c 65 49 64 2e 70 49 64 20 3d 20  .  fileId.pId = 
acc0: 70 46 69 6c 65 2d 3e 70 49 64 3b 0a 23 65 6c 73  pFile->pId;.#els
acd0: 65 0a 20 20 66 69 6c 65 49 64 2e 69 6e 6f 20 3d  e.  fileId.ino =
ace0: 20 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b   statbuf.st_ino;
acf0: 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 6f 64 65  .#endif.  pInode
ad00: 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20   = inodeList;.  
ad10: 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26  while( pInode &&
ad20: 20 6d 65 6d 63 6d 70 28 26 66 69 6c 65 49 64 2c   memcmp(&fileId,
ad30: 20 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64   &pInode->fileId
ad40: 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29  , sizeof(fileId)
ad50: 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20  ) ){.    pInode 
ad60: 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b  = pInode->pNext;
ad70: 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 6f 64  .  }.  if( pInod
ad80: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e 6f  e==0 ){.    pIno
ad90: 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  de = sqlite3_mal
ada0: 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70  loc64( sizeof(*p
adb0: 49 6e 6f 64 65 29 20 29 3b 0a 20 20 20 20 69 66  Inode) );.    if
adc0: 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20  ( pInode==0 ){. 
add0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
ade0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
adf0: 20 20 20 20 6d 65 6d 73 65 74 28 70 49 6e 6f 64      memset(pInod
ae00: 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49  e, 0, sizeof(*pI
ae10: 6e 6f 64 65 29 29 3b 0a 20 20 20 20 6d 65 6d 63  node));.    memc
ae20: 70 79 28 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65  py(&pInode->file
ae30: 49 64 2c 20 26 66 69 6c 65 49 64 2c 20 73 69 7a  Id, &fileId, siz
ae40: 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20  eof(fileId));.  
ae50: 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 20 3d    pInode->nRef =
ae60: 20 31 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e   1;.    pInode->
ae70: 70 4e 65 78 74 20 3d 20 69 6e 6f 64 65 4c 69 73  pNext = inodeLis
ae80: 74 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70  t;.    pInode->p
ae90: 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 69 66  Prev = 0;.    if
aea0: 28 20 69 6e 6f 64 65 4c 69 73 74 20 29 20 69 6e  ( inodeList ) in
aeb0: 6f 64 65 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d  odeList->pPrev =
aec0: 20 70 49 6e 6f 64 65 3b 0a 20 20 20 20 69 6e 6f   pInode;.    ino
aed0: 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 3b  deList = pInode;
aee0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
aef0: 6e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  node->nRef++;.  
af00: 7d 0a 20 20 2a 70 70 49 6e 6f 64 65 20 3d 20 70  }.  *ppInode = p
af10: 49 6e 6f 64 65 3b 0a 20 20 72 65 74 75 72 6e 20  Inode;.  return 
af20: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
af30: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
af40: 69 66 20 70 46 69 6c 65 20 68 61 73 20 62 65 65  if pFile has bee
af50: 6e 20 72 65 6e 61 6d 65 64 20 6f 72 20 75 6e 6c  n renamed or unl
af60: 69 6e 6b 65 64 20 73 69 6e 63 65 20 69 74 20 77  inked since it w
af70: 61 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e  as first opened.
af80: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
af90: 69 6c 65 48 61 73 4d 6f 76 65 64 28 75 6e 69 78  ileHasMoved(unix
afa0: 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 23 69  File *pFile){.#i
afb0: 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 72  f OS_VXWORKS.  r
afc0: 65 74 75 72 6e 20 70 46 69 6c 65 2d 3e 70 49 6e  eturn pFile->pIn
afd0: 6f 64 65 21 3d 30 20 26 26 20 70 46 69 6c 65 2d  ode!=0 && pFile-
afe0: 3e 70 49 64 21 3d 70 46 69 6c 65 2d 3e 70 49 6e  >pId!=pFile->pIn
aff0: 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 70 49 64 3b  ode->fileId.pId;
b000: 0a 23 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20  .#else.  struct 
b010: 73 74 61 74 20 62 75 66 3b 0a 20 20 72 65 74 75  stat buf;.  retu
b020: 72 6e 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  rn pFile->pInode
b030: 21 3d 30 20 26 26 0a 20 20 20 20 20 20 28 6f 73  !=0 &&.      (os
b040: 53 74 61 74 28 70 46 69 6c 65 2d 3e 7a 50 61 74  Stat(pFile->zPat
b050: 68 2c 20 26 62 75 66 29 21 3d 30 20 7c 7c 20 62  h, &buf)!=0 || b
b060: 75 66 2e 73 74 5f 69 6e 6f 21 3d 70 46 69 6c 65  uf.st_ino!=pFile
b070: 2d 3e 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64  ->pInode->fileId
b080: 2e 69 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  .ino);.#endif.}.
b090: 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 61 20  ../*.** Check a 
b0a0: 75 6e 69 78 46 69 6c 65 20 74 68 61 74 20 69 73  unixFile that is
b0b0: 20 61 20 64 61 74 61 62 61 73 65 2e 20 20 56 65   a database.  Ve
b0c0: 72 69 66 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69  rify the followi
b0d0: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 28 31 29 20 54 68  ng:.**.** (1) Th
b0e0: 65 72 65 20 69 73 20 65 78 61 63 74 6c 79 20 6f  ere is exactly o
b0f0: 6e 65 20 68 61 72 64 20 6c 69 6e 6b 20 6f 6e 20  ne hard link on 
b100: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 28 32 29 20  the file.** (2) 
b110: 54 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  The file is not 
b120: 61 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 0a  a symbolic link.
b130: 2a 2a 20 28 33 29 20 54 68 65 20 66 69 6c 65 20  ** (3) The file 
b140: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 72 65 6e  has not been ren
b150: 61 6d 65 64 20 6f 72 20 75 6e 6c 69 6e 6b 65 64  amed or unlinked
b160: 0a 2a 2a 0a 2a 2a 20 49 73 73 75 65 20 73 71 6c  .**.** Issue sql
b170: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
b180: 57 41 52 4e 49 4e 47 2c 2e 2e 2e 29 20 6d 65 73  WARNING,...) mes
b190: 73 61 67 65 73 20 69 66 20 61 6e 79 74 68 69 6e  sages if anythin
b1a0: 67 20 69 73 20 6e 6f 74 20 72 69 67 68 74 2e 0a  g is not right..
b1b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  */.static void v
b1c0: 65 72 69 66 79 44 62 46 69 6c 65 28 75 6e 69 78  erifyDbFile(unix
b1d0: 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
b1e0: 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
b1f0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20  .  int rc;.  rc 
b200: 3d 20 6f 73 46 73 74 61 74 28 70 46 69 6c 65 2d  = osFstat(pFile-
b210: 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 69 66 28  >h, &buf);.  if(
b220: 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 71   rc!=0 ){.    sq
b230: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
b240: 5f 57 41 52 4e 49 4e 47 2c 20 22 63 61 6e 6e 6f  _WARNING, "canno
b250: 74 20 66 73 74 61 74 20 64 62 20 66 69 6c 65 20  t fstat db file 
b260: 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  %s", pFile->zPat
b270: 68 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  h);.    return;.
b280: 20 20 7d 0a 20 20 69 66 28 20 62 75 66 2e 73 74    }.  if( buf.st
b290: 5f 6e 6c 69 6e 6b 3d 3d 30 20 26 26 20 28 70 46  _nlink==0 && (pF
b2a0: 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
b2b0: 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45   UNIXFILE_DELETE
b2c0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
b2d0: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57  te3_log(SQLITE_W
b2e0: 41 52 4e 49 4e 47 2c 20 22 66 69 6c 65 20 75 6e  ARNING, "file un
b2f0: 6c 69 6e 6b 65 64 20 77 68 69 6c 65 20 6f 70 65  linked while ope
b300: 6e 3a 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a  n: %s", pFile->z
b310: 50 61 74 68 29 3b 0a 20 20 20 20 72 65 74 75 72  Path);.    retur
b320: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 62 75 66  n;.  }.  if( buf
b330: 2e 73 74 5f 6e 6c 69 6e 6b 3e 31 20 29 7b 0a 20  .st_nlink>1 ){. 
b340: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
b350: 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22  QLITE_WARNING, "
b360: 6d 75 6c 74 69 70 6c 65 20 6c 69 6e 6b 73 20 74  multiple links t
b370: 6f 20 66 69 6c 65 3a 20 25 73 22 2c 20 70 46 69  o file: %s", pFi
b380: 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
b390: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
b3a0: 28 20 66 69 6c 65 48 61 73 4d 6f 76 65 64 28 70  ( fileHasMoved(p
b3b0: 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 73 71 6c  File) ){.    sql
b3c0: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
b3d0: 57 41 52 4e 49 4e 47 2c 20 22 66 69 6c 65 20 72  WARNING, "file r
b3e0: 65 6e 61 6d 65 64 20 77 68 69 6c 65 20 6f 70 65  enamed while ope
b3f0: 6e 3a 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a  n: %s", pFile->z
b400: 50 61 74 68 29 3b 0a 20 20 20 20 72 65 74 75 72  Path);.    retur
b410: 6e 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  n;.  }.}.../*.**
b420: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
b430: 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
b440: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
b450: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
b460: 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
b470: 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
b480: 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
b490: 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
b4a0: 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
b4b0: 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
b4c0: 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
b4d0: 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
b4e0: 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
b4f0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
b500: 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
b510: 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
b520: 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
b530: 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
b540: 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
b550: 69 6e 74 20 75 6e 69 78 43 68 65 63 6b 52 65 73  int unixCheckRes
b560: 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
b570: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
b580: 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74  *pResOut){.  int
b590: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
b5a0: 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20  .  int reserved 
b5b0: 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
b5c0: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
b5d0: 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c  le*)id;..  Simul
b5e0: 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
b5f0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
b600: 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
b610: 4b 3b 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  K; );..  assert(
b620: 20 70 46 69 6c 65 20 29 3b 0a 20 20 61 73 73 65   pFile );.  asse
b630: 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  rt( pFile->eFile
b640: 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
b650: 4b 20 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72  K );.  unixEnter
b660: 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61  Mutex(); /* Beca
b670: 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  use pFile->pInod
b680: 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  e is shared acro
b690: 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 0a 20  ss threads */.. 
b6a0: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74   /* Check if a t
b6b0: 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72  hread in this pr
b6c0: 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68  ocess holds such
b6d0: 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28   a lock */.  if(
b6e0: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
b6f0: 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
b700: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73  _LOCK ){.    res
b710: 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a  erved = 1;.  }..
b720: 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73    /* Otherwise s
b730: 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ee if some other
b740: 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69   process holds i
b750: 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  t..  */.#ifndef 
b760: 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 69 66 28 20  __DJGPP__.  if( 
b770: 21 72 65 73 65 72 76 65 64 20 26 26 20 21 70 46  !reserved && !pF
b780: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72  ile->pInode->bPr
b790: 6f 63 65 73 73 4c 6f 63 6b 20 29 7b 0a 20 20 20  ocessLock ){.   
b7a0: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
b7b0: 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  ck;.    lock.l_w
b7c0: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
b7d0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  ;.    lock.l_sta
b7e0: 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59  rt = RESERVED_BY
b7f0: 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  TE;.    lock.l_l
b800: 65 6e 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b  en = 1;.    lock
b810: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43  .l_type = F_WRLC
b820: 4b 3b 0a 20 20 20 20 69 66 28 20 6f 73 46 63 6e  K;.    if( osFcn
b830: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 47  tl(pFile->h, F_G
b840: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a  ETLK, &lock) ){.
b850: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
b860: 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
b870: 45 52 56 45 44 4c 4f 43 4b 3b 0a 20 20 20 20 20  ERVEDLOCK;.     
b880: 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
b890: 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20  pFile, errno);. 
b8a0: 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 6f     } else if( lo
b8b0: 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c  ck.l_type!=F_UNL
b8c0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 73 65  CK ){.      rese
b8d0: 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  rved = 1;.    }.
b8e0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
b8f0: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
b900: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  ;.  OSTRACE(("TE
b910: 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
b920: 20 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70   %d (unix)\n", p
b930: 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
b940: 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65  erved));..  *pRe
b950: 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
b960: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
b970: 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
b980: 6f 20 73 65 74 20 61 20 73 79 73 74 65 6d 2d 6c  o set a system-l
b990: 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  ock on the file 
b9a0: 70 46 69 6c 65 2e 20 20 54 68 65 20 6c 6f 63 6b  pFile.  The lock
b9b0: 20 69 73 20 0a 2a 2a 20 64 65 73 63 72 69 62 65   is .** describe
b9c0: 64 20 62 79 20 70 4c 6f 63 6b 2e 0a 2a 2a 0a 2a  d by pLock..**.*
b9d0: 2a 20 49 66 20 74 68 65 20 70 46 69 6c 65 20 77  * If the pFile w
b9e0: 61 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2f 77  as opened read/w
b9f0: 72 69 74 65 20 66 72 6f 6d 20 75 6e 69 78 2d 65  rite from unix-e
ba00: 78 63 6c 2c 20 74 68 65 6e 20 74 68 65 20 6f 6e  xcl, then the on
ba10: 6c 79 20 6c 6f 63 6b 0a 2a 2a 20 65 76 65 72 20  ly lock.** ever 
ba20: 6f 62 74 61 69 6e 65 64 20 69 73 20 61 6e 20 65  obtained is an e
ba30: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 61  xclusive lock, a
ba40: 6e 64 20 69 74 20 69 73 20 6f 62 74 61 69 6e 65  nd it is obtaine
ba50: 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 0a 2a  d exactly once.*
ba60: 2a 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  * the first time
ba70: 20 61 6e 79 20 6c 6f 63 6b 20 69 73 20 61 74 74   any lock is att
ba80: 65 6d 70 74 65 64 2e 20 20 41 6c 6c 20 73 75 62  empted.  All sub
ba90: 73 65 71 75 65 6e 74 20 73 79 73 74 65 6d 20 6c  sequent system l
baa0: 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74  ocking.** operat
bab0: 69 6f 6e 73 20 62 65 63 6f 6d 65 20 6e 6f 2d 6f  ions become no-o
bac0: 70 73 2e 20 20 4c 6f 63 6b 69 6e 67 20 6f 70 65  ps.  Locking ope
bad0: 72 61 74 69 6f 6e 73 20 73 74 69 6c 6c 20 68 61  rations still ha
bae0: 70 70 65 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 2c  ppen internally,
baf0: 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
bb00: 63 6f 6f 72 64 69 6e 61 74 65 20 61 63 63 65 73  coordinate acces
bb10: 73 20 62 65 74 77 65 65 6e 20 73 65 70 61 72 61  s between separa
bb20: 74 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  te database conn
bb30: 65 63 74 69 6f 6e 73 0a 2a 2a 20 77 69 74 68 69  ections.** withi
bb40: 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 2c 20  n this process, 
bb50: 62 75 74 20 61 6c 6c 20 6f 66 20 74 68 61 74 20  but all of that 
bb60: 69 73 20 68 61 6e 64 6c 65 64 20 69 6e 20 6d 65  is handled in me
bb70: 6d 6f 72 79 20 61 6e 64 20 74 68 65 0a 2a 2a 20  mory and the.** 
bb80: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
bb90: 20 64 6f 65 73 20 6e 6f 74 20 70 61 72 74 69 63   does not partic
bba0: 69 70 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ipate..**.** Thi
bbb0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
bbc0: 70 61 73 73 2d 74 68 72 6f 75 67 68 20 74 6f 20  pass-through to 
bbd0: 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b 29 20 69  fcntl(F_SETLK) i
bbe0: 66 20 70 46 69 6c 65 20 69 73 20 75 73 69 6e 67  f pFile is using
bbf0: 0a 2a 2a 20 61 6e 79 20 56 46 53 20 6f 74 68 65  .** any VFS othe
bc00: 72 20 74 68 61 6e 20 22 75 6e 69 78 2d 65 78 63  r than "unix-exc
bc10: 6c 22 20 6f 72 20 69 66 20 70 46 69 6c 65 20 69  l" or if pFile i
bc20: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 22 75 6e 69  s opened on "uni
bc30: 78 2d 65 78 63 6c 22 0a 2a 2a 20 61 6e 64 20 69  x-excl".** and i
bc40: 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a 2a 2a 0a  s read-only..**.
bc50: 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72  ** Zero is retur
bc60: 6e 65 64 20 69 66 20 74 68 65 20 63 61 6c 6c 20  ned if the call 
bc70: 63 6f 6d 70 6c 65 74 65 73 20 73 75 63 63 65 73  completes succes
bc80: 73 66 75 6c 6c 79 2c 20 6f 72 20 2d 31 20 69 66  sfully, or -1 if
bc90: 20 61 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66 63   a call.** to fc
bca0: 6e 74 6c 28 29 20 66 61 69 6c 73 2e 20 49 6e 20  ntl() fails. In 
bcb0: 74 68 69 73 20 63 61 73 65 2c 20 65 72 72 6e 6f  this case, errno
bcc0: 20 69 73 20 73 65 74 20 61 70 70 72 6f 70 72 69   is set appropri
bcd0: 61 74 65 6c 79 20 28 62 79 20 66 63 6e 74 6c 28  ately (by fcntl(
bce0: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ))..*/.static in
bcf0: 74 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 75  t unixFileLock(u
bd00: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
bd10: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 4c  struct flock *pL
bd20: 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ock){.  int rc;.
bd30: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
bd40: 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
bd50: 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72  >pInode;.  asser
bd60: 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  t( unixMutexHeld
bd70: 28 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  () );.  assert( 
bd80: 70 49 6e 6f 64 65 21 3d 30 20 29 3b 0a 20 20 69  pInode!=0 );.  i
bd90: 66 28 20 28 28 70 46 69 6c 65 2d 3e 63 74 72 6c  f( ((pFile->ctrl
bda0: 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
bdb0: 5f 45 58 43 4c 29 21 3d 30 20 7c 7c 20 70 49 6e  _EXCL)!=0 || pIn
bdc0: 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
bdd0: 6b 29 0a 20 20 20 26 26 20 28 28 70 46 69 6c 65  k).   && ((pFile
bde0: 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
bdf0: 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d  IXFILE_RDONLY)==
be00: 30 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  0).  ){.    if( 
be10: 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
be20: 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Lock==0 ){.     
be30: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
be40: 63 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ck;.      assert
be50: 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d  ( pInode->nLock=
be60: 3d 30 20 29 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  =0 );.      lock
be70: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
be80: 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  _SET;.      lock
be90: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
bea0: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c  D_FIRST;.      l
beb0: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
bec0: 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 6c  ED_SIZE;.      l
bed0: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57  ock.l_type = F_W
bee0: 52 4c 43 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d  RLCK;.      rc =
bef0: 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e   osFcntl(pFile->
bf00: 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_SETLK, &loc
bf10: 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  k);.      if( rc
bf20: 3c 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  <0 ) return rc;.
bf30: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 62 50        pInode->bP
bf40: 72 6f 63 65 73 73 4c 6f 63 6b 20 3d 20 31 3b 0a  rocessLock = 1;.
bf50: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c        pInode->nL
bf60: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  ock++;.    }else
bf70: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a  {.      rc = 0;.
bf80: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
bf90: 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28     rc = osFcntl(
bfa0: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  pFile->h, F_SETL
bfb0: 4b 2c 20 70 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 20  K, pLock);.  }. 
bfc0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
bfd0: 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
bfe0: 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
bff0: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
c000: 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
c010: 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
c020: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
c030: 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
c040: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
c050: 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
c060: 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
c070: 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
c080: 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
c090: 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
c0a0: 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
c0b0: 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
c0c0: 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
c0d0: 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
c0e0: 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
c0f0: 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
c100: 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
c110: 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
c120: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
c130: 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
c140: 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
c150: 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
c160: 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
c170: 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
c180: 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
c190: 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
c1a0: 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
c1b0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
c1c0: 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
c1d0: 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
c1e0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
c1f0: 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
c200: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
c210: 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
c220: 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
c230: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
c240: 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
c250: 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
c260: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
c270: 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
c280: 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
c290: 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
c2a0: 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
c2b0: 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
c2c0: 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
c2d0: 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
c2e0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
c2f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
c300: 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ixLock(sqlite3_f
c310: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
c320: 6c 65 4c 6f 63 6b 29 7b 0a 20 20 2f 2a 20 54 68  leLock){.  /* Th
c330: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63  e following desc
c340: 72 69 62 65 73 20 74 68 65 20 69 6d 70 6c 65 6d  ribes the implem
c350: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
c360: 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e  various locks an
c370: 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e  d.  ** lock tran
c380: 73 69 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73  sitions in terms
c390: 20 6f 66 20 74 68 65 20 50 4f 53 49 58 20 61 64   of the POSIX ad
c3a0: 76 69 73 6f 72 79 20 73 68 61 72 65 64 20 61 6e  visory shared an
c3b0: 64 20 65 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a  d exclusive.  **
c3c0: 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76 65 73   lock primitives
c3d0: 20 28 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f   (called read-lo
c3e0: 63 6b 73 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f  cks and write-lo
c3f0: 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76  cks below, to av
c400: 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69  oid.  ** confusi
c410: 6f 6e 20 77 69 74 68 20 53 51 4c 69 74 65 20 6c  on with SQLite l
c420: 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65 20  ock names). The 
c430: 61 6c 67 6f 72 69 74 68 6d 73 20 61 72 65 20 63  algorithms are c
c440: 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20  omplicated.  ** 
c450: 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72 64 65  slightly in orde
c460: 72 20 74 6f 20 62 65 20 63 6f 6d 70 61 74 69 62  r to be compatib
c470: 6c 65 20 77 69 74 68 20 77 69 6e 64 6f 77 73 20  le with windows 
c480: 73 79 73 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e  systems simultan
c490: 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65  eously.  ** acce
c4a0: 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64  ssing the same d
c4b0: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 6e  atabase file, in
c4c0: 20 63 61 73 65 20 74 68 61 74 20 69 73 20 65 76   case that is ev
c4d0: 65 72 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a  er required..  *
c4e0: 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64  *.  ** Symbols d
c4f0: 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69  efined in os.h i
c500: 6e 64 65 6e 74 69 66 79 20 74 68 65 20 27 70 65  ndentify the 'pe
c510: 6e 64 69 6e 67 20 62 79 74 65 27 20 61 6e 64 20  nding byte' and 
c520: 74 68 65 20 27 72 65 73 65 72 76 65 64 0a 20 20  the 'reserved.  
c530: 2a 2a 20 62 79 74 65 27 2c 20 65 61 63 68 20 73  ** byte', each s
c540: 69 6e 67 6c 65 20 62 79 74 65 73 20 61 74 20 77  ingle bytes at w
c550: 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74  ell known offset
c560: 73 2c 20 61 6e 64 20 74 68 65 20 27 73 68 61 72  s, and the 'shar
c570: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
c580: 67 65 27 2c 20 61 20 72 61 6e 67 65 20 6f 66 20  ge', a range of 
c590: 35 31 30 20 62 79 74 65 73 20 61 74 20 61 20 77  510 bytes at a w
c5a0: 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74  ell known offset
c5b0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f  ..  **.  ** To o
c5c0: 62 74 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c  btain a SHARED l
c5d0: 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ock, a read-lock
c5e0: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20   is obtained on 
c5f0: 74 68 65 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a  the 'pending.  *
c600: 2a 20 62 79 74 65 27 2e 20 20 49 66 20 74 68 69  * byte'.  If thi
c610: 73 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  s is successful,
c620: 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66   a random byte f
c630: 72 6f 6d 20 74 68 65 20 27 73 68 61 72 65 64 20  rom the 'shared 
c640: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
c650: 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64 20   is read-locked 
c660: 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  and the lock on 
c670: 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74  the 'pending byt
c680: 65 27 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a  e' released..  *
c690: 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73  *.  ** A process
c6a0: 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e   may only obtain
c6b0: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
c6c0: 20 61 66 74 65 72 20 69 74 20 68 61 73 20 61 20   after it has a 
c6d0: 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a  SHARED lock..  *
c6e0: 2a 20 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63  * A RESERVED loc
c6f0: 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  k is implemented
c700: 20 62 79 20 67 72 61 62 62 69 6e 67 20 61 20 77   by grabbing a w
c710: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
c720: 0a 20 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20  .  ** 'reserved 
c730: 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a  byte'. .  **.  *
c740: 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20  * A process may 
c750: 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45  only obtain a PE
c760: 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72  NDING lock after
c770: 20 69 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64   it has obtained
c780: 20 61 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c   a.  ** SHARED l
c790: 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c  ock. A PENDING l
c7a0: 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ock is implement
c7b0: 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20  ed by obtaining 
c7c0: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a  a write-lock.  *
c7d0: 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e  * on the 'pendin
c7e0: 67 20 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e  g byte'. This en
c7f0: 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65  sures that no ne
c800: 77 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63  w SHARED locks c
c810: 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69  an be.  ** obtai
c820: 6e 65 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e  ned, but existin
c830: 67 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61  g SHARED locks a
c840: 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65  re allowed to pe
c850: 72 73 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73  rsist. A process
c860: 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68  .  ** does not h
c870: 61 76 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  ave to obtain a 
c880: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
c890: 20 74 68 65 20 77 61 79 20 74 6f 20 61 20 50 45   the way to a PE
c8a0: 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  NDING lock..  **
c8b0: 20 54 68 69 73 20 70 72 6f 70 65 72 74 79 20 69   This property i
c8c0: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 61 6c  s used by the al
c8d0: 67 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c  gorithm for roll
c8e0: 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e  ing back a journ
c8f0: 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74  al file.  ** aft
c900: 65 72 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a  er a crash..  **
c910: 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49  .  ** An EXCLUSI
c920: 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65  VE lock, obtaine
c930: 64 20 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e  d after a PENDIN
c940: 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  G lock is held, 
c950: 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e  is.  ** implemen
c960: 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67  ted by obtaining
c970: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
c980: 20 74 68 65 20 65 6e 74 69 72 65 20 27 73 68 61   the entire 'sha
c990: 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61  red byte.  ** ra
c9a0: 6e 67 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20  nge'. Since all 
c9b0: 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75  other locks requ
c9c0: 69 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ire a read-lock 
c9d0: 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79  on one of the by
c9e0: 74 65 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20  tes.  ** within 
c9f0: 74 68 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73  this range, this
ca00: 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f   ensures that no
ca10: 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65   other locks are
ca20: 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a   held on the.  *
ca30: 2a 20 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a  * database. .  *
ca40: 2a 0a 20 20 2a 2a 20 54 68 65 20 72 65 61 73 6f  *.  ** The reaso
ca50: 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  n a single byte 
ca60: 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 69  cannot be used i
ca70: 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 27 73  nstead of the 's
ca80: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
ca90: 72 61 6e 67 65 27 20 69 73 20 74 68 61 74 20 73  range' is that s
caa0: 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ome versions of 
cab0: 77 69 6e 64 6f 77 73 20 64 6f 20 6e 6f 74 20 73  windows do not s
cac0: 75 70 70 6f 72 74 20 72 65 61 64 2d 6c 6f 63 6b  upport read-lock
cad0: 73 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69  s. By.  ** locki
cae0: 6e 67 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65  ng a random byte
caf0: 20 66 72 6f 6d 20 61 20 72 61 6e 67 65 2c 20 63   from a range, c
cb00: 6f 6e 63 75 72 72 65 6e 74 20 53 48 41 52 45 44  oncurrent SHARED
cb10: 20 6c 6f 63 6b 73 20 6d 61 79 20 65 78 69 73 74   locks may exist
cb20: 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68  .  ** even if th
cb30: 65 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74  e locking primit
cb40: 69 76 65 20 75 73 65 64 20 69 73 20 61 6c 77 61  ive used is alwa
cb50: 79 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2e  ys a write-lock.
cb60: 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  .  */.  int rc =
cb70: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
cb80: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
cb90: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
cba0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
cbb0: 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63 74  pInode;.  struct
cbc0: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69   flock lock;.  i
cbd0: 6e 74 20 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 0a  nt tErrno = 0;..
cbe0: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
cbf0: 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  );.  OSTRACE(("L
cc00: 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77 61 73  OCK    %d %s was
cc10: 20 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25   %s(%s,%d) pid=%
cc20: 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69  d (unix)\n", pFi
cc30: 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 61 7a 46  le->h,.      azF
cc40: 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
cc50: 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70  k), azFileLock(p
cc60: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29  File->eFileLock)
cc70: 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f  ,.      azFileLo
cc80: 63 6b 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  ck(pFile->pInode
cc90: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 46  ->eFileLock), pF
cca0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68  ile->pInode->nSh
ccb0: 61 72 65 64 2c 0a 20 20 20 20 20 20 6f 73 47 65  ared,.      osGe
ccc0: 74 70 69 64 28 30 29 29 29 3b 0a 0a 20 20 2f 2a  tpid(0)));..  /*
ccd0: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
cce0: 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74  eady a lock of t
ccf0: 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65  his type or more
cd00: 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20   restrictive on 
cd10: 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c  the.  ** unixFil
cd20: 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44  e, do nothing. D
cd30: 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e 64  on't use the end
cd40: 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68  _lock: exit path
cd50: 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e  , as.  ** unixEn
cd60: 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27  terMutex() hasn'
cd70: 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65  t been called ye
cd80: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  t..  */.  if( pF
cd90: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ile->eFileLock>=
cda0: 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
cdb0: 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
cdc0: 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72     %d %s ok (alr
cdd0: 65 61 64 79 20 68 65 6c 64 29 20 28 75 6e 69 78  eady held) (unix
cde0: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
cdf0: 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69              azFi
ce00: 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
ce10: 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )));.    return 
ce20: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
ce30: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
ce40: 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65  he locking seque
ce50: 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 2e 0a  nce is correct..
ce60: 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76    **  (1) We nev
ce70: 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c  er move from unl
ce80: 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e  ocked to anythin
ce90: 67 20 68 69 67 68 65 72 20 74 68 61 6e 20 73 68  g higher than sh
cea0: 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ared lock..  ** 
ceb0: 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65   (2) SQLite neve
cec0: 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71  r explicitly req
ced0: 75 65 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c  uests a pendig l
cee0: 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41  ock..  **  (3) A
cef0: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20   shared lock is 
cf00: 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e  always held when
cf10: 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20   a reserve lock 
cf20: 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20  is requested..  
cf30: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  */.  assert( pFi
cf40: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e  le->eFileLock!=N
cf50: 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c  O_LOCK || eFileL
cf60: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
cf70: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46   );.  assert( eF
cf80: 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47  ileLock!=PENDING
cf90: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
cfa0: 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45  t( eFileLock!=RE
cfb0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SERVED_LOCK || p
cfc0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
cfd0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
cfe0: 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78  .  /* This mutex
cff0: 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75   is needed becau
d000: 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  se pFile->pInode
d010: 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73   is shared acros
d020: 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20  s threads.  */. 
d030: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
d040: 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46  );.  pInode = pF
d050: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20  ile->pInode;..  
d060: 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61  /* If some threa
d070: 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
d080: 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20   has a lock via 
d090: 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78  a different unix
d0a0: 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c  File*.  ** handl
d0b0: 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65 73  e that precludes
d0c0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
d0d0: 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59  ock, return BUSY
d0e0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46  ..  */.  if( (pF
d0f0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d  ile->eFileLock!=
d100: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
d110: 6b 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  k && .          
d120: 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  (pInode->eFileLo
d130: 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ck>=PENDING_LOCK
d140: 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48   || eFileLock>SH
d150: 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b  ARED_LOCK)).  ){
d160: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
d170: 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20  _BUSY;.    goto 
d180: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20  end_lock;.  }.. 
d190: 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44 20   /* If a SHARED 
d1a0: 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
d1b0: 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65  d, and some thre
d1c0: 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
d1d0: 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68  D already.  ** h
d1e0: 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 52  as a SHARED or R
d1f0: 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68  ESERVED lock, th
d200: 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66  en increment ref
d210: 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e  erence counts an
d220: 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51  d.  ** return SQ
d230: 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20  LITE_OK..  */.  
d240: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
d250: 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20  HARED_LOCK && . 
d260: 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46       (pInode->eF
d270: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
d280: 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
d290: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
d2a0: 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  VED_LOCK) ){.   
d2b0: 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
d2c0: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
d2d0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
d2e0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
d2f0: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
d300: 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
d310: 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65  d>0 );.    pFile
d320: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
d330: 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70  ARED_LOCK;.    p
d340: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b  Inode->nShared++
d350: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c  ;.    pInode->nL
d360: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20  ock++;.    goto 
d370: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a  end_lock;.  }...
d380: 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c    /* A PENDING l
d390: 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65  ock is needed be
d3a0: 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 61  fore acquiring a
d3b0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64   SHARED lock and
d3c0: 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71   before.  ** acq
d3d0: 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  uiring an EXCLUS
d3e0: 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74  IVE lock.  For t
d3f0: 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20  he SHARED lock, 
d400: 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c  the PENDING will
d410: 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65  .  ** be release
d420: 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c  d..  */.  lock.l
d430: 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63  _len = 1L;.  loc
d440: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
d450: 4b 5f 53 45 54 3b 0a 20 20 69 66 28 20 65 46 69  K_SET;.  if( eFi
d460: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
d470: 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65  OCK .      || (e
d480: 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
d490: 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c  IVE_LOCK && pFil
d4a0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e  e->eFileLock<PEN
d4b0: 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a  DING_LOCK).  ){.
d4c0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
d4d0: 3d 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  = (eFileLock==SH
d4e0: 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43  ARED_LOCK?F_RDLC
d4f0: 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20  K:F_WRLCK);.    
d500: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
d510: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
d520: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
d530: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20  k(pFile, &lock) 
d540: 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  ){.      tErrno 
d550: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
d560: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
d570: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
d580: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
d590: 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  RR_LOCK);.      
d5a0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42  if( rc!=SQLITE_B
d5b0: 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73  USY ){.        s
d5c0: 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
d5d0: 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
d5e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
d5f0: 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d   end_lock;.    }
d600: 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 63  .  }...  /* If c
d610: 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74  ontrol gets to t
d620: 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
d630: 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61  actually go ahea
d640: 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20  d and make.  ** 
d650: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
d660: 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73   calls for the s
d670: 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20  pecified lock.. 
d680: 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
d690: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
d6a0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
d6b0: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d  pInode->nShared=
d6c0: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
d6d0: 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ( pInode->eFileL
d6e0: 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ock==0 );.    as
d6f0: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
d700: 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e  _OK );..    /* N
d710: 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64 2d  ow get the read-
d720: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b  lock */.    lock
d730: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
d740: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f 63  D_FIRST;.    loc
d750: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
d760: 5f 53 49 5a 45 3b 0a 20 20 20 20 69 66 28 20 75  _SIZE;.    if( u
d770: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
d780: 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20  e, &lock) ){.   
d790: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
d7a0: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
d7b0: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
d7c0: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
d7d0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
d7e0: 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  K);.    }..    /
d7f0: 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f  * Drop the tempo
d800: 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63  rary PENDING loc
d810: 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  k */.    lock.l_
d820: 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f  start = PENDING_
d830: 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  BYTE;.    lock.l
d840: 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 6c  _len = 1L;.    l
d850: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
d860: 4e 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 75 6e  NLCK;.    if( un
d870: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
d880: 2c 20 26 6c 6f 63 6b 29 20 26 26 20 72 63 3d 3d  , &lock) && rc==
d890: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d8a0: 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 75 6c 64     /* This could
d8b0: 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 20 6e   happen with a n
d8c0: 65 74 77 6f 72 6b 20 6d 6f 75 6e 74 20 2a 2f 0a  etwork mount */.
d8d0: 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
d8e0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
d8f0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
d900: 4c 4f 43 4b 3b 20 0a 20 20 20 20 7d 0a 0a 20 20  LOCK; .    }..  
d910: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
d920: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
d930: 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20  _BUSY ){.       
d940: 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
d950: 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
d960: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
d970: 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  to end_lock;.   
d980: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46   }else{.      pF
d990: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
d9a0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
d9b0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
d9c0: 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64  k++;.      pInod
d9d0: 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a  e->nShared = 1;.
d9e0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
d9f0: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  ( eFileLock==EXC
da00: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70  LUSIVE_LOCK && p
da10: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31  Inode->nShared>1
da20: 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72   ){.    /* We ar
da30: 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20  e trying for an 
da40: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62  exclusive lock b
da50: 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  ut another threa
da60: 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a  d in this.    **
da70: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73   same process is
da80: 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
da90: 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f   shared lock. */
daa0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
dab0: 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BUSY;.  }else{.
dac0: 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
dad0: 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53  st was for a RES
dae0: 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
daf0: 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a  VE lock.  It is.
db00: 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74      ** assumed t
db10: 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53  hat there is a S
db20: 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72  HARED or greater
db30: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
db40: 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79  e.    ** already
db50: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
db60: 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65  ert( 0!=pFile->e
db70: 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  FileLock );.    
db80: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
db90: 57 52 4c 43 4b 3b 0a 0a 20 20 20 20 61 73 73 65  WRLCK;..    asse
dba0: 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52  rt( eFileLock==R
dbb0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
dbc0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
dbd0: 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
dbe0: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
dbf0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b  RESERVED_LOCK ){
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 52 45 53 45 52 56 45 44 5f 42  art = RESERVED_B
dc20: 59 54 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  YTE;.      lock.
dc30: 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20  l_len = 1L;.    
dc40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 6f 63  }else{.      loc
dc50: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
dc60: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
dc70: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41  lock.l_len = SHA
dc80: 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 0a  RED_SIZE;.    }.
dc90: 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c  .    if( unixFil
dca0: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
dcb0: 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72  ck) ){.      tEr
dcc0: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
dcd0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
dce0: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
dcf0: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
dd00: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20  _IOERR_LOCK);.  
dd10: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
dd20: 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
dd30: 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
dd40: 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
dd50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
dd60: 20 20 7d 0a 20 20 0a 0a 23 69 66 64 65 66 20 53    }.  ..#ifdef S
dd70: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
dd80: 20 53 65 74 20 75 70 20 74 68 65 20 74 72 61 6e   Set up the tran
dd90: 73 61 63 74 69 6f 6e 2d 63 6f 75 6e 74 65 72 20  saction-counter 
dda0: 63 68 61 6e 67 65 20 63 68 65 63 6b 69 6e 67 20  change checking 
ddb0: 66 6c 61 67 73 20 77 68 65 6e 0a 20 20 2a 2a 20  flags when.  ** 
ddc0: 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72  transitioning fr
ddd0: 6f 6d 20 61 20 53 48 41 52 45 44 20 74 6f 20 61  om a SHARED to a
dde0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20   RESERVED lock. 
ddf0: 20 54 68 65 20 63 68 61 6e 67 65 0a 20 20 2a 2a   The change.  **
de00: 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20   from SHARED to 
de10: 52 45 53 45 52 56 45 44 20 6d 61 72 6b 73 20 74  RESERVED marks t
de20: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
de30: 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 77 72  a normal.  ** wr
de40: 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 28 6e  ite operation (n
de50: 6f 74 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ot a hot journal
de60: 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20 2a 2f   rollback)..  */
de70: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
de80: 45 5f 4f 4b 0a 20 20 20 26 26 20 70 46 69 6c 65  E_OK.   && pFile
de90: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ->eFileLock<=SHA
dea0: 52 45 44 5f 4c 4f 43 4b 0a 20 20 20 26 26 20 65  RED_LOCK.   && e
deb0: 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  FileLock==RESERV
dec0: 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b 0a 20 20 20  ED_LOCK.  ){.   
ded0: 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74   pFile->transCnt
dee0: 72 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 70  rChng = 0;.    p
def0: 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20 3d  File->dbUpdate =
df00: 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69   0;.    pFile->i
df10: 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 31  nNormalWrite = 1
df20: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20  ;.  }.#endif... 
df30: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
df40: 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  OK ){.    pFile-
df50: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
df60: 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f  leLock;.    pIno
df70: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
df80: 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c  eFileLock;.  }el
df90: 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  se if( eFileLock
dfa0: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
dfb0: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
dfc0: 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49  FileLock = PENDI
dfd0: 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e  NG_LOCK;.    pIn
dfe0: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
dff0: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
e000: 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20   }..end_lock:.  
e010: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
e020: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f  ;.  OSTRACE(("LO
e030: 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28  CK    %d %s %s (
e040: 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  unix)\n", pFile-
e050: 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65  >h, azFileLock(e
e060: 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20  FileLock), .    
e070: 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20    rc==SQLITE_OK 
e080: 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
e090: 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  "));.  return rc
e0a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74  ;.}../*.** Add t
e0b0: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
e0c0: 6f 72 20 75 73 65 64 20 62 79 20 66 69 6c 65 20  or used by file 
e0d0: 68 61 6e 64 6c 65 20 70 46 69 6c 65 20 74 6f 20  handle pFile to 
e0e0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
e0f0: 67 0a 2a 2a 20 70 55 6e 75 73 65 64 20 6c 69 73  g.** pUnused lis
e100: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
e110: 64 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 75  d setPendingFd(u
e120: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
e130: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
e140: 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
e150: 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78  ->pInode;.  Unix
e160: 55 6e 75 73 65 64 46 64 20 2a 70 20 3d 20 70 46  UnusedFd *p = pF
e170: 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20  ile->pUnused;.  
e180: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64  p->pNext = pInod
e190: 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70 49  e->pUnused;.  pI
e1a0: 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20  node->pUnused = 
e1b0: 70 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20  p;.  pFile->h = 
e1c0: 2d 31 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 55 6e  -1;.  pFile->pUn
e1d0: 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  used = 0;.}../*.
e1e0: 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
e1f0: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
e200: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
e210: 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
e220: 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
e230: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
e240: 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
e250: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
e260: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
e270: 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
e280: 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
e290: 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
e2a0: 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
e2b0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
e2c0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
e2d0: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20  a no-op..** .** 
e2e0: 49 66 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  If handleNFSUnlo
e2f0: 63 6b 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ck is true, then
e300: 20 6f 6e 20 64 6f 77 6e 67 72 61 64 69 6e 67 20   on downgrading 
e310: 61 6e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  an EXCLUSIVE_LOC
e320: 4b 20 74 6f 20 53 48 41 52 45 44 0a 2a 2a 20 74  K to SHARED.** t
e330: 68 65 20 62 79 74 65 20 72 61 6e 67 65 20 69 73  he byte range is
e340: 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20 32 20   divided into 2 
e350: 70 61 72 74 73 20 61 6e 64 20 74 68 65 20 66 69  parts and the fi
e360: 72 73 74 20 70 61 72 74 20 69 73 20 75 6e 6c 6f  rst part is unlo
e370: 63 6b 65 64 20 74 68 65 6e 0a 2a 2a 20 73 65 74  cked then.** set
e380: 20 74 6f 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c   to a read lock,
e390: 20 74 68 65 6e 20 74 68 65 20 6f 74 68 65 72 20   then the other 
e3a0: 70 61 72 74 20 69 73 20 73 69 6d 70 6c 79 20 75  part is simply u
e3b0: 6e 6c 6f 63 6b 65 64 2e 20 20 54 68 69 73 20 77  nlocked.  This w
e3c0: 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f 75 6e 64 20  orks .** around 
e3d0: 61 20 62 75 67 20 69 6e 20 42 53 44 20 4e 46 53  a bug in BSD NFS
e3e0: 20 6c 6f 63 6b 64 20 28 61 6c 73 6f 20 73 65 65   lockd (also see
e3f0: 6e 20 6f 6e 20 4d 61 63 4f 53 58 20 31 30 2e 33  n on MacOSX 10.3
e400: 2b 29 20 74 68 61 74 20 66 61 69 6c 73 20 74 6f  +) that fails to
e410: 20 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20   .** remove the 
e420: 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 61 20  write lock on a 
e430: 72 65 67 69 6f 6e 20 77 68 65 6e 20 61 20 72 65  region when a re
e440: 61 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 2e 0a  ad lock is set..
e450: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f  */.static int po
e460: 73 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  sixUnlock(sqlite
e470: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
e480: 65 46 69 6c 65 4c 6f 63 6b 2c 20 69 6e 74 20 68  eFileLock, int h
e490: 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 29 7b  andleNFSUnlock){
e4a0: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
e4b0: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
e4c0: 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  id;.  unixInodeI
e4d0: 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 73  nfo *pInode;.  s
e4e0: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
e4f0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
e500: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
e510: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
e520: 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20  TRACE(("UNLOCK  
e530: 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64 2c  %d %d was %d(%d,
e540: 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69 78  %d) pid=%d (unix
e550: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
e560: 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20  eFileLock,.     
e570: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
e580: 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  k, pFile->pInode
e590: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69  ->eFileLock, pFi
e5a0: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  le->pInode->nSha
e5b0: 72 65 64 2c 0a 20 20 20 20 20 20 6f 73 47 65 74  red,.      osGet
e5c0: 70 69 64 28 30 29 29 29 3b 0a 0a 20 20 61 73 73  pid(0)));..  ass
e5d0: 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ert( eFileLock<=
e5e0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
e5f0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
e600: 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b  eLock<=eFileLock
e610: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
e620: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
e630: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
e640: 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69  ;.  pInode = pFi
e650: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73  le->pInode;.  as
e660: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
e670: 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69 66  hared!=0 );.  if
e680: 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
e690: 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
e6a0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  {.    assert( pI
e6b0: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
e6c0: 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  =pFile->eFileLoc
e6d0: 6b 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  k );..#ifdef SQL
e6e0: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a  ITE_DEBUG.    /*
e6f0: 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61   When reducing a
e700: 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20   lock such that 
e710: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
e720: 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a  can start.    **
e730: 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74   reading the dat
e740: 61 62 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e  abase file again
e750: 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  , make sure that
e760: 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
e770: 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
e780: 77 61 73 20 75 70 64 61 74 65 64 20 69 66 20 61  was updated if a
e790: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  ny part of the d
e7a0: 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66  atabase.    ** f
e7b0: 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66  ile changed.  If
e7c0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
e7d0: 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20   counter is not 
e7e0: 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20  updated,.    ** 
e7f0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
e800: 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69  s to the same fi
e810: 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61  le might not rea
e820: 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  lize that.    **
e830: 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 63 68   the file has ch
e840: 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20  anged and hence 
e850: 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74  might not know t
e860: 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20  o flush their.  
e870: 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65    ** cache.  The
e880: 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20   use of a stale 
e890: 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74  cache can lead t
e8a0: 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  o database corru
e8b0: 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ption..    */.  
e8c0: 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61    pFile->inNorma
e8d0: 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64  lWrite = 0;.#end
e8e0: 69 66 0a 0a 20 20 20 20 2f 2a 20 64 6f 77 6e 67  if..    /* downg
e8f0: 72 61 64 69 6e 67 20 74 6f 20 61 20 73 68 61 72  rading to a shar
e900: 65 64 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53 20 69  ed lock on NFS i
e910: 6e 76 6f 6c 76 65 73 20 63 6c 65 61 72 69 6e 67  nvolves clearing
e920: 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 0a   the write lock.
e930: 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 65 73      ** before es
e940: 74 61 62 6c 69 73 68 69 6e 67 20 74 68 65 20 72  tablishing the r
e950: 65 61 64 6c 6f 63 6b 20 2d 20 74 6f 20 61 76 6f  eadlock - to avo
e960: 69 64 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74  id a race condit
e970: 69 6f 6e 20 77 65 20 64 6f 77 6e 67 72 61 64 65  ion we downgrade
e980: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b  .    ** the lock
e990: 20 69 6e 20 32 20 62 6c 6f 63 6b 73 2c 20 73 6f   in 2 blocks, so
e9a0: 20 74 68 61 74 20 70 61 72 74 20 6f 66 20 74 68   that part of th
e9b0: 65 20 72 61 6e 67 65 20 77 69 6c 6c 20 62 65 20  e range will be 
e9c0: 63 6f 76 65 72 65 64 20 62 79 20 61 20 0a 20 20  covered by a .  
e9d0: 20 20 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20    ** write lock 
e9e0: 75 6e 74 69 6c 20 74 68 65 20 72 65 73 74 20 69  until the rest i
e9f0: 73 20 63 6f 76 65 72 65 64 20 62 79 20 61 20 72  s covered by a r
ea00: 65 61 64 20 6c 6f 63 6b 3a 0a 20 20 20 20 2a 2a  ead lock:.    **
ea10: 20 20 31 3a 20 20 20 5b 57 57 57 57 57 5d 0a 20    1:   [WWWWW]. 
ea20: 20 20 20 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e 2e     **  2:   [...
ea30: 2e 57 5d 0a 20 20 20 20 2a 2a 20 20 33 3a 20 20  .W].    **  3:  
ea40: 20 5b 52 52 52 52 57 5d 0a 20 20 20 20 2a 2a 20   [RRRRW].    ** 
ea50: 20 34 3a 20 20 20 5b 52 52 52 52 2e 5d 0a 20 20   4:   [RRRR.].  
ea60: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 46 69    */.    if( eFi
ea70: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
ea80: 4f 43 4b 20 29 7b 0a 23 69 66 20 21 64 65 66 69  OCK ){.#if !defi
ea90: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c  ned(__APPLE__) |
eaa0: 7c 20 21 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  | !SQLITE_ENABLE
eab0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
eac0: 20 20 20 20 20 28 76 6f 69 64 29 68 61 6e 64 6c       (void)handl
ead0: 65 4e 46 53 55 6e 6c 6f 63 6b 3b 0a 20 20 20 20  eNFSUnlock;.    
eae0: 20 20 61 73 73 65 72 74 28 20 68 61 6e 64 6c 65    assert( handle
eaf0: 4e 46 53 55 6e 6c 6f 63 6b 3d 3d 30 20 29 3b 0a  NFSUnlock==0 );.
eb00: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
eb10: 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
eb20: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
eb30: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20  OCKING_STYLE.   
eb40: 20 20 20 69 66 28 20 68 61 6e 64 6c 65 4e 46 53     if( handleNFS
eb50: 55 6e 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  Unlock ){.      
eb60: 20 20 69 6e 74 20 74 45 72 72 6e 6f 3b 20 20 20    int tErrno;   
eb70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
eb80: 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 73  rror code from s
eb90: 79 73 74 65 6d 20 63 61 6c 6c 20 65 72 72 6f 72  ystem call error
eba0: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 66 66  s */.        off
ebb0: 5f 74 20 64 69 76 53 69 7a 65 20 3d 20 53 48 41  _t divSize = SHA
ebc0: 52 45 44 5f 53 49 5a 45 20 2d 20 31 3b 0a 20 20  RED_SIZE - 1;.  
ebd0: 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 6c        .        l
ebe0: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
ebf0: 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f  NLCK;.        lo
ec00: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
ec10: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20  EK_SET;.        
ec20: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
ec30: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
ec40: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
ec50: 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20  = divSize;.     
ec60: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
ec70: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
ec80: 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  )==(-1) ){.     
ec90: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
eca0: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
ecb0: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
ecc0: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  _UNLOCK;.       
ecd0: 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
ece0: 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
ecf0: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
ed00: 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
ed10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c       }.        l
ed20: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52  ock.l_type = F_R
ed30: 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f  DLCK;.        lo
ed40: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
ed50: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20  EK_SET;.        
ed60: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
ed70: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
ed80: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
ed90: 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20  = divSize;.     
eda0: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
edb0: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
edc0: 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  )==(-1) ){.     
edd0: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
ede0: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
edf0: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
ee00: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
ee10: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
ee20: 52 52 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20  RR_RDLOCK);.    
ee30: 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
ee40: 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
ee50: 20 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65             store
ee60: 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
ee70: 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20   tErrno);.      
ee80: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
ee90: 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b  goto end_unlock;
eea0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
eeb0: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
eec0: 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20   F_UNLCK;.      
eed0: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
eee0: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
eef0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
ef00: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b   = SHARED_FIRST+
ef10: 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  divSize;.       
ef20: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
ef30: 41 52 45 44 5f 53 49 5a 45 2d 64 69 76 53 69 7a  ARED_SIZE-divSiz
ef40: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75  e;.        if( u
ef50: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
ef60: 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20  e, &lock)==(-1) 
ef70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72  ){.          tEr
ef80: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
ef90: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
efa0: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
efb0: 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65  .          store
efc0: 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
efd0: 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20   tErrno);.      
efe0: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c      goto end_unl
eff0: 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ock;.        }. 
f000: 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
f010: 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41  f /* defined(__A
f020: 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
f030: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
f040: 5f 53 54 59 4c 45 20 2a 2f 0a 20 20 20 20 20 20  _STYLE */.      
f050: 7b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  {.        lock.l
f060: 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b  _type = F_RDLCK;
f070: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
f080: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
f090: 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
f0a0: 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
f0b0: 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20  _FIRST;.        
f0c0: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41  lock.l_len = SHA
f0d0: 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20  RED_SIZE;.      
f0e0: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
f0f0: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
f100: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
f110: 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 65 20   In theory, the 
f120: 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46 69 6c 65  call to unixFile
f130: 4c 6f 63 6b 28 29 20 63 61 6e 6e 6f 74 20 66 61  Lock() cannot fa
f140: 69 6c 20 62 65 63 61 75 73 65 20 61 6e 6f 74 68  il because anoth
f150: 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  er.          ** 
f160: 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
f170: 6e 67 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  ng an incompatib
f180: 6c 65 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 64  le lock. If it d
f190: 6f 65 73 2c 20 74 68 69 73 20 0a 20 20 20 20 20  oes, this .     
f1a0: 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 61 74 65       ** indicate
f1b0: 73 20 74 68 61 74 20 74 68 65 20 6f 74 68 65 72  s that the other
f1c0: 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20   process is not 
f1d0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 6f  following the lo
f1e0: 63 6b 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  cking.          
f1f0: 2a 2a 20 70 72 6f 74 6f 63 6f 6c 2e 20 49 66 20  ** protocol. If 
f200: 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20 72 65  this happens, re
f210: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
f220: 52 5f 52 44 4c 4f 43 4b 2e 20 52 65 74 75 72 6e  R_RDLOCK. Return
f230: 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ing.          **
f240: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 6f 75   SQLITE_BUSY wou
f250: 6c 64 20 63 6f 6e 66 75 73 65 20 74 68 65 20 75  ld confuse the u
f260: 70 70 65 72 20 6c 61 79 65 72 20 28 69 6e 20 70  pper layer (in p
f270: 72 61 63 74 69 63 65 20 69 74 20 63 61 75 73 65  ractice it cause
f280: 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
f290: 61 6e 20 61 73 73 65 72 74 20 74 6f 20 66 61 69  an assert to fai
f2a0: 6c 29 2e 20 2a 2f 20 0a 20 20 20 20 20 20 20 20  l). */ .        
f2b0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
f2c0: 45 52 52 5f 52 44 4c 4f 43 4b 3b 0a 20 20 20 20  ERR_RDLOCK;.    
f2d0: 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
f2e0: 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e  rrno(pFile, errn
f2f0: 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  o);.          go
f300: 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20  to end_unlock;. 
f310: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
f320: 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e  .    }.    lock.
f330: 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
f340: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65  ;.    lock.l_whe
f350: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
f360: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
f370: 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b   = PENDING_BYTE;
f380: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  .    lock.l_len 
f390: 3d 20 32 4c 3b 20 20 61 73 73 65 72 74 28 20 50  = 2L;  assert( P
f3a0: 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52  ENDING_BYTE+1==R
f3b0: 45 53 45 52 56 45 44 5f 42 59 54 45 20 29 3b 0a  ESERVED_BYTE );.
f3c0: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
f3d0: 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
f3e0: 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  k)==0 ){.      p
f3f0: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
f400: 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
f410: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f420: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
f430: 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20  RR_UNLOCK;.     
f440: 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
f450: 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20  pFile, errno);. 
f460: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
f470: 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lock;.    }.  }.
f480: 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
f490: 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  =NO_LOCK ){.    
f4a0: 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
f4b0: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75   shared lock cou
f4c0: 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74  nter.  Release t
f4d0: 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e  he lock using an
f4e0: 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20  .    ** OS call 
f4f0: 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68  only when all th
f500: 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 73 61  reads in this sa
f510: 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 65 20  me process have 
f520: 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20  released.    ** 
f530: 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f  the lock..    */
f540: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  .    pInode->nSh
f550: 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20  ared--;.    if( 
f560: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d  pInode->nShared=
f570: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b  =0 ){.      lock
f580: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
f590: 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  K;.      lock.l_
f5a0: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
f5b0: 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  T;.      lock.l_
f5c0: 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c  start = lock.l_l
f5d0: 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20 69  en = 0L;.      i
f5e0: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
f5f0: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30  pFile, &lock)==0
f600: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f   ){.        pIno
f610: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
f620: 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d  NO_LOCK;.      }
f630: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
f640: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
f650: 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  UNLOCK;.        
f660: 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
f670: 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  File, errno);.  
f680: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46        pInode->eF
f690: 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
f6a0: 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  K;.        pFile
f6b0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
f6c0: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  _LOCK;.      }. 
f6d0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63     }..    /* Dec
f6e0: 72 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e 74  rement the count
f6f0: 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73   of locks agains
f700: 74 20 74 68 69 73 20 73 61 6d 65 20 66 69 6c 65  t this same file
f710: 2e 20 20 57 68 65 6e 20 74 68 65 0a 20 20 20 20  .  When the.    
f720: 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73  ** count reaches
f730: 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79   zero, close any
f740: 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63   other file desc
f750: 72 69 70 74 6f 72 73 20 77 68 6f 73 65 20 63 6c  riptors whose cl
f760: 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61 73 20 64  ose.    ** was d
f770: 65 66 65 72 72 65 64 20 62 65 63 61 75 73 65 20  eferred because 
f780: 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  of outstanding l
f790: 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ocks..    */.   
f7a0: 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d   pInode->nLock--
f7b0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
f7c0: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29  node->nLock>=0 )
f7d0: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ;.    if( pInode
f7e0: 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  ->nLock==0 ){.  
f7f0: 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67      closePending
f800: 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  Fds(pFile);.    
f810: 7d 0a 20 20 7d 0a 0a 65 6e 64 5f 75 6e 6c 6f 63  }.  }..end_unloc
f820: 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  k:.  unixLeaveMu
f830: 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d  tex();.  if( rc=
f840: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69  =SQLITE_OK ) pFi
f850: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
f860: 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74  eFileLock;.  ret
f870: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
f880: 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
f890: 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
f8a0: 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
f8b0: 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
f8c0: 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
f8d0: 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
f8e0: 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
f8f0: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
f900: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
f910: 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
f920: 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
f930: 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
f940: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
f950: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
f960: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
f970: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
f980: 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28   int unixUnlock(
f990: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
f9a0: 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
f9b0: 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  {.#if SQLITE_MAX
f9c0: 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 61  _MMAP_SIZE>0.  a
f9d0: 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
f9e0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
f9f0: 20 28 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64   ((unixFile *)id
fa00: 29 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20  )->nFetchOut==0 
fa10: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
fa20: 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69  rn posixUnlock(i
fa30: 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 30 29  d, eFileLock, 0)
fa40: 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
fa50: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
fa60: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d  static int unixM
fa70: 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20  apfile(unixFile 
fa80: 2a 70 46 64 2c 20 69 36 34 20 6e 42 79 74 65 29  *pFd, i64 nByte)
fa90: 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  ;.static void un
faa0: 69 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e 69 78  ixUnmapfile(unix
fab0: 46 69 6c 65 20 2a 70 46 64 29 3b 0a 23 65 6e 64  File *pFd);.#end
fac0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
fad0: 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73  unction performs
fae0: 20 74 68 65 20 70 61 72 74 73 20 6f 66 20 74 68   the parts of th
faf0: 65 20 22 63 6c 6f 73 65 20 66 69 6c 65 22 20 6f  e "close file" o
fb00: 70 65 72 61 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d  peration .** com
fb10: 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69  mon to all locki
fb20: 6e 67 20 73 63 68 65 6d 65 73 2e 20 49 74 20 63  ng schemes. It c
fb30: 6c 6f 73 65 73 20 74 68 65 20 64 69 72 65 63 74  loses the direct
fb40: 6f 72 79 20 61 6e 64 20 66 69 6c 65 0a 2a 2a 20  ory and file.** 
fb50: 68 61 6e 64 6c 65 73 2c 20 69 66 20 74 68 65 79  handles, if they
fb60: 20 61 72 65 20 76 61 6c 69 64 2c 20 61 6e 64 20   are valid, and 
fb70: 73 65 74 73 20 61 6c 6c 20 66 69 65 6c 64 73 20  sets all fields 
fb80: 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 0a  of the unixFile.
fb90: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  ** structure to 
fba0: 30 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 2a  0..**.** It is *
fbb0: 6e 6f 74 2a 20 6e 65 63 65 73 73 61 72 79 20 74  not* necessary t
fbc0: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78  o hold the mutex
fbd0: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
fbe0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a  ne is called,.**
fbf0: 20 65 76 65 6e 20 6f 6e 20 56 78 57 6f 72 6b 73   even on VxWorks
fc00: 2e 20 20 41 20 6d 75 74 65 78 20 77 69 6c 6c 20  .  A mutex will 
fc10: 62 65 20 61 63 71 75 69 72 65 64 20 6f 6e 20 56  be acquired on V
fc20: 78 57 6f 72 6b 73 20 62 79 20 74 68 65 0a 2a 2a  xWorks by the.**
fc30: 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46   vxworksReleaseF
fc40: 69 6c 65 49 64 28 29 20 72 6f 75 74 69 6e 65 2e  ileId() routine.
fc50: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
fc60: 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 73 71 6c  loseUnixFile(sql
fc70: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
fc80: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
fc90: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
fca0: 64 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  d;.#if SQLITE_MA
fcb0: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
fcc0: 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46  unixUnmapfile(pF
fcd0: 69 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69  ile);.#endif.  i
fce0: 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29  f( pFile->h>=0 )
fcf0: 7b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f  {.    robust_clo
fd00: 73 65 28 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d  se(pFile, pFile-
fd10: 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  >h, __LINE__);. 
fd20: 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31     pFile->h = -1
fd30: 3b 0a 20 20 7d 0a 23 69 66 20 4f 53 5f 56 58 57  ;.  }.#if OS_VXW
fd40: 4f 52 4b 53 0a 20 20 69 66 28 20 70 46 69 6c 65  ORKS.  if( pFile
fd50: 2d 3e 70 49 64 20 29 7b 0a 20 20 20 20 69 66 28  ->pId ){.    if(
fd60: 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
fd70: 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c  s & UNIXFILE_DEL
fd80: 45 54 45 20 29 7b 0a 20 20 20 20 20 20 6f 73 55  ETE ){.      osU
fd90: 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 70 49 64  nlink(pFile->pId
fda0: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
fdb0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76 78 77  );.    }.    vxw
fdc0: 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49  orksReleaseFileI
fdd0: 64 28 70 46 69 6c 65 2d 3e 70 49 64 29 3b 0a 20  d(pFile->pId);. 
fde0: 20 20 20 70 46 69 6c 65 2d 3e 70 49 64 20 3d 20     pFile->pId = 
fdf0: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  0;.  }.#endif.#i
fe00: 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 4c 49  fdef SQLITE_UNLI
fe10: 4e 4b 5f 41 46 54 45 52 5f 43 4c 4f 53 45 0a 20  NK_AFTER_CLOSE. 
fe20: 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c   if( pFile->ctrl
fe30: 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
fe40: 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6f  _DELETE ){.    o
fe50: 73 55 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 7a  sUnlink(pFile->z
fe60: 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74  Path);.    sqlit
fe70: 65 33 5f 66 72 65 65 28 2a 28 63 68 61 72 2a 2a  e3_free(*(char**
fe80: 29 26 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  )&pFile->zPath);
fe90: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74  .    pFile->zPat
fea0: 68 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  h = 0;.  }.#endi
feb0: 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c  f.  OSTRACE(("CL
fec0: 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70  OSE   %-3d\n", p
fed0: 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 4f 70 65  File->h));.  Ope
fee0: 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20  nCounter(-1);.  
fef0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69  sqlite3_free(pFi
ff00: 6c 65 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20  le->pUnused);.  
ff10: 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c  memset(pFile, 0,
ff20: 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65   sizeof(unixFile
ff30: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
ff40: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
ff50: 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a   Close a file..*
ff60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
ff70: 78 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  xClose(sqlite3_f
ff80: 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20  ile *id){.  int 
ff90: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
ffa0: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
ffb0: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  e = (unixFile *)
ffc0: 69 64 3b 0a 20 20 76 65 72 69 66 79 44 62 46 69  id;.  verifyDbFi
ffd0: 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20 75 6e 69  le(pFile);.  uni
ffe0: 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  xUnlock(id, NO_L
fff0: 4f 43 4b 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65  OCK);.  unixEnte
10000 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20  rMutex();..  /* 
10010 75 6e 69 78 46 69 6c 65 2e 70 49 6e 6f 64 65 20  unixFile.pInode 
10020 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20  is always valid 
10030 68 65 72 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  here. Otherwise,
10040 20 61 20 64 69 66 66 65 72 65 6e 74 20 63 6c 6f   a different clo
10050 73 65 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20  se.  ** routine 
10060 28 65 2e 67 2e 20 6e 6f 6c 6f 63 6b 43 6c 6f 73  (e.g. nolockClos
10070 65 28 29 29 20 77 6f 75 6c 64 20 62 65 20 63 61  e()) would be ca
10080 6c 6c 65 64 20 69 6e 73 74 65 61 64 2e 0a 20 20  lled instead..  
10090 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  */.  assert( pFi
100a0 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  le->pInode->nLoc
100b0 6b 3e 30 20 7c 7c 20 70 46 69 6c 65 2d 3e 70 49  k>0 || pFile->pI
100c0 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
100d0 63 6b 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 41  ck==0 );.  if( A
100e0 4c 57 41 59 53 28 70 46 69 6c 65 2d 3e 70 49 6e  LWAYS(pFile->pIn
100f0 6f 64 65 29 20 26 26 20 70 46 69 6c 65 2d 3e 70  ode) && pFile->p
10100 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a  Inode->nLock ){.
10110 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
10120 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  are outstanding 
10130 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63  locks, do not ac
10140 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65  tually close the
10150 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 2a   file just.    *
10160 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74 68  * yet because th
10170 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74  at would clear t
10180 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73  hose locks.  Ins
10190 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66 69  tead, add the fi
101a0 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73 63 72 69  le.    ** descri
101b0 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e  ptor to pInode->
101c0 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 20 20 49  pUnused list.  I
101d0 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  t will be automa
101e0 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 0a  tically closed .
101f0 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20      ** when the 
10200 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65  last lock is cle
10210 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ared..    */.   
10220 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46   setPendingFd(pF
10230 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65  ile);.  }.  rele
10240 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69  aseInodeInfo(pFi
10250 6c 65 29 3b 0a 20 20 72 63 20 3d 20 63 6c 6f 73  le);.  rc = clos
10260 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20  eUnixFile(id);. 
10270 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
10280 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
10290 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }../************
102a0 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 70 6f  ** End of the po
102b0 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  six advisory loc
102c0 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
102d0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
102e0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
102f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 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 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 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 2a 2a 2a 2a  ****************
10360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10380 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
10390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
103a0 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e 67  ** No-op Locking
103b0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
103c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
103d0 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68 65  ***.**.** Of the
103e0 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69 6e 67   various locking
103f0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
10400 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 69 73   available, this
10410 20 69 73 20 62 79 20 66 61 72 20 74 68 65 0a 2a   is by far the.*
10420 2a 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c 6f 63  * simplest:  loc
10430 6b 69 6e 67 20 69 73 20 69 67 6e 6f 72 65 64 2e  king is ignored.
10440 20 20 4e 6f 20 61 74 74 65 6d 70 74 20 69 73 20    No attempt is 
10450 6d 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74 68 65  made to lock the
10460 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
10470 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72  e for reading or
10480 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   writing..**.** 
10490 54 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64  This locking mod
104a0 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  e is appropriate
104b0 20 66 6f 72 20 75 73 65 20 6f 6e 20 72 65 61 64   for use on read
104c0 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 73 0a  -only databases.
104d0 2a 2a 20 28 65 78 3a 20 64 61 74 61 62 61 73 65  ** (ex: database
104e0 73 20 74 68 61 74 20 61 72 65 20 62 75 72 6e 65  s that are burne
104f0 64 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20 66  d into CD-ROM, f
10500 6f 72 20 65 78 61 6d 70 6c 65 2e 29 20 20 49 74  or example.)  It
10510 20 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65 20   can.** also be 
10520 75 73 65 64 20 69 66 20 74 68 65 20 61 70 70 6c  used if the appl
10530 69 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79 73 20  ication employs 
10540 73 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20 6d 65  some external me
10550 63 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70 72  chanism to.** pr
10560 65 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e 65 6f  event simultaneo
10570 75 73 20 61 63 63 65 73 73 20 6f 66 20 74 68 65  us access of the
10580 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 62   same database b
10590 79 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a  y two or more.**
105a0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
105b0 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 65 72  tions.  But ther
105c0 65 20 69 73 20 61 20 73 65 72 69 6f 75 73 20 72  e is a serious r
105d0 69 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65 0a  isk of database.
105e0 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 66  ** corruption if
105f0 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f   this locking mo
10600 64 65 20 69 73 20 75 73 65 64 20 69 6e 20 73 69  de is used in si
10610 74 75 61 74 69 6f 6e 73 20 77 68 65 72 65 20 6d  tuations where m
10620 75 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74 61 62  ultiple.** datab
10630 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
10640 61 72 65 20 61 63 63 65 73 73 69 6e 67 20 74 68  are accessing th
10650 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
10660 66 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65  file at the same
10670 0a 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f 6e 65  .** time and one
10680 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 6f 73   or more of thos
10690 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72  e connections ar
106a0 65 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a 73  e writing..*/..s
106b0 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b  tatic int nolock
106c0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
106d0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
106e0 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 2a 70 52  NotUsed, int *pR
106f0 65 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45 44  esOut){.  UNUSED
10700 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
10710 65 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20  ed);.  *pResOut 
10720 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 0;.  return SQ
10730 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69  LITE_OK;.}.stati
10740 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b  c int nolockLock
10750 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e  (sqlite3_file *N
10760 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55  otUsed, int NotU
10770 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sed2){.  UNUSED_
10780 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
10790 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20  ed, NotUsed2);. 
107a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
107b0 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  K;.}.static int 
107c0 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c  nolockUnlock(sql
107d0 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73  ite3_file *NotUs
107e0 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32  ed, int NotUsed2
107f0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
10800 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
10810 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74  NotUsed2);.  ret
10820 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
10830 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68  ../*.** Close th
10840 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  e file..*/.stati
10850 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c 6f 73  c int nolockClos
10860 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
10870 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 63  id) {.  return c
10880 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
10890 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}../**********
108a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
108b0 20 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 20   the no-op lock 
108c0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
108d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
108e0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
108f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10910 2a 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 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
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 2a 2a 2a 2a 2a 2a 2a  ****************
10960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10980 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
10990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
109a0 42 65 67 69 6e 20 64 6f 74 2d 66 69 6c 65 20 4c  Begin dot-file L
109b0 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
109c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109d0 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  *****.**.** The 
109e0 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  dotfile locking 
109f0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75  implementation u
10a00 73 65 73 20 74 68 65 20 65 78 69 73 74 65 6e 63  ses the existenc
10a10 65 20 6f 66 20 73 65 70 61 72 61 74 65 20 6c 6f  e of separate lo
10a20 63 6b 0a 2a 2a 20 66 69 6c 65 73 20 28 72 65 61  ck.** files (rea
10a30 6c 6c 79 20 61 20 64 69 72 65 63 74 6f 72 79 29  lly a directory)
10a40 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65   to control acce
10a50 73 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ss to the databa
10a60 73 65 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 0a  se.  This works.
10a70 2a 2a 20 6f 6e 20 6a 75 73 74 20 61 62 6f 75 74  ** on just about
10a80 20 65 76 65 72 79 20 66 69 6c 65 73 79 73 74 65   every filesyste
10a90 6d 20 69 6d 61 67 69 6e 61 62 6c 65 2e 20 20 42  m imaginable.  B
10aa0 75 74 20 74 68 65 72 65 20 61 72 65 20 73 65 72  ut there are ser
10ab0 69 6f 75 73 20 64 6f 77 6e 73 69 64 65 73 3a 0a  ious downsides:.
10ac0 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68  **.**    (1)  Th
10ad0 65 72 65 20 69 73 20 7a 65 72 6f 20 63 6f 6e 63  ere is zero conc
10ae0 75 72 72 65 6e 63 79 2e 20 20 41 20 73 69 6e 67  urrency.  A sing
10af0 6c 65 20 72 65 61 64 65 72 20 62 6c 6f 63 6b 73  le reader blocks
10b00 20 61 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 20 20   all other.**   
10b10 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e        connection
10b20 73 20 66 72 6f 6d 20 72 65 61 64 69 6e 67 20 6f  s from reading o
10b30 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61  r writing the da
10b40 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  tabase..**.**   
10b50 20 28 32 29 20 20 41 6e 20 61 70 70 6c 69 63 61   (2)  An applica
10b60 74 69 6f 6e 20 63 72 61 73 68 20 6f 72 20 70 6f  tion crash or po
10b70 77 65 72 20 6c 6f 73 73 20 63 61 6e 20 6c 65 61  wer loss can lea
10b80 76 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20 66 69  ve stale lock fi
10b90 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 73  les.**         s
10ba0 69 74 74 69 6e 67 20 61 72 6f 75 6e 64 20 74 68  itting around th
10bb0 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6c  at need to be cl
10bc0 65 61 72 65 64 20 6d 61 6e 75 61 6c 6c 79 2e 0a  eared manually..
10bd0 2a 2a 0a 2a 2a 20 4e 65 76 65 72 74 68 65 6c 65  **.** Neverthele
10be0 73 73 2c 20 61 20 64 6f 74 6c 6f 63 6b 20 69 73  ss, a dotlock is
10bf0 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
10c00 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 66 6f 72  locking mode for
10c10 20 75 73 65 20 69 66 20 6e 6f 0a 2a 2a 20 6f 74   use if no.** ot
10c20 68 65 72 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  her locking stra
10c30 74 65 67 79 20 69 73 20 61 76 61 69 6c 61 62 6c  tegy is availabl
10c40 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 74 66 69 6c 65  e..**.** Dotfile
10c50 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 20 62   locking works b
10c60 79 20 63 72 65 61 74 69 6e 67 20 61 20 73 75 62  y creating a sub
10c70 64 69 72 65 63 74 6f 72 79 20 69 6e 20 74 68 65  directory in the
10c80 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20   same directory 
10c90 61 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  as.** the databa
10ca0 73 65 20 61 6e 64 20 77 69 74 68 20 74 68 65 20  se and with the 
10cb0 73 61 6d 65 20 6e 61 6d 65 20 62 75 74 20 77 69  same name but wi
10cc0 74 68 20 61 20 22 2e 6c 6f 63 6b 22 20 65 78 74  th a ".lock" ext
10cd0 65 6e 73 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2a  ension added..**
10ce0 20 54 68 65 20 65 78 69 73 74 65 6e 63 65 20 6f   The existence o
10cf0 66 20 61 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f  f a lock directo
10d00 72 79 20 69 6d 70 6c 69 65 73 20 61 6e 20 45 58  ry implies an EX
10d10 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 41  CLUSIVE lock.  A
10d20 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 6c 6f 63 6b  ll other.** lock
10d30 20 74 79 70 65 73 20 28 53 48 41 52 45 44 2c 20   types (SHARED, 
10d40 52 45 53 45 52 56 45 44 2c 20 50 45 4e 44 49 4e  RESERVED, PENDIN
10d50 47 29 20 61 72 65 20 6d 61 70 70 65 64 20 69 6e  G) are mapped in
10d60 74 6f 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2f  to EXCLUSIVE..*/
10d70 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ../*.** The file
10d80 20 73 75 66 66 69 78 20 61 64 64 65 64 20 74 6f   suffix added to
10d90 20 74 68 65 20 64 61 74 61 20 62 61 73 65 20 66   the data base f
10da0 69 6c 65 6e 61 6d 65 20 69 6e 20 6f 72 64 65 72  ilename in order
10db0 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 2a   to create the.*
10dc0 2a 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72 79  * lock directory
10dd0 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44 4f 54  ..*/.#define DOT
10de0 4c 4f 43 4b 5f 53 55 46 46 49 58 20 22 2e 6c 6f  LOCK_SUFFIX ".lo
10df0 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ck"../*.** This 
10e00 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
10e10 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
10e20 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
10e30 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
10e40 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
10e50 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
10e60 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
10e70 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73   lock is held, s
10e80 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74  et *pResOut.** t
10e90 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
10ea0 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52  ue otherwise *pR
10eb0 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
10ec0 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72  zero.  The retur
10ed0 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  n value.** is se
10ee0 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75  t to SQLITE_OK u
10ef0 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72  nless an I/O err
10f00 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
10f10 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a   lock checking..
10f20 2a 2a 0a 2a 2a 20 49 6e 20 64 6f 74 66 69 6c 65  **.** In dotfile
10f30 20 6c 6f 63 6b 69 6e 67 2c 20 65 69 74 68 65 72   locking, either
10f40 20 61 20 6c 6f 63 6b 20 65 78 69 73 74 73 20 6f   a lock exists o
10f50 72 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 20 20  r it does not.  
10f60 53 6f 20 69 6e 20 74 68 69 73 0a 2a 2a 20 76 61  So in this.** va
10f70 72 69 61 74 69 6f 6e 20 6f 66 20 43 68 65 63 6b  riation of Check
10f80 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 2c 20  ReservedLock(), 
10f90 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
10fa0 74 6f 20 74 72 75 65 20 69 66 20 61 6e 79 20 6c  to true if any l
10fb0 6f 63 6b 0a 2a 2a 20 69 73 20 68 65 6c 64 20 6f  ock.** is held o
10fc0 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 66  n the file and f
10fd0 61 6c 73 65 20 69 66 20 74 68 65 20 66 69 6c 65  alse if the file
10fe0 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f   is unlocked..*/
10ff0 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c  .static int dotl
11000 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
11010 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
11020 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
11030 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  Out) {.  int rc 
11040 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
11050 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b  nt reserved = 0;
11060 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
11070 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
11080 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49  id;..  SimulateI
11090 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
110a0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
110b0 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
110c0 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
110d0 46 69 6c 65 20 29 3b 0a 20 20 72 65 73 65 72 76  File );.  reserv
110e0 65 64 20 3d 20 6f 73 41 63 63 65 73 73 28 28 63  ed = osAccess((c
110f0 6f 6e 73 74 20 63 68 61 72 2a 29 70 46 69 6c 65  onst char*)pFile
11100 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
11110 2c 20 30 29 3d 3d 30 3b 0a 20 20 4f 53 54 52 41  , 0)==0;.  OSTRA
11120 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
11130 4b 20 25 64 20 25 64 20 25 64 20 28 64 6f 74 6c  K %d %d %d (dotl
11140 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  ock)\n", pFile->
11150 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29  h, rc, reserved)
11160 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  );.  *pResOut = 
11170 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
11180 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
11190 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
111a0 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
111b0 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
111c0 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f  er eFileLock - o
111d0 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
111e0 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
111f0 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
11200 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
11210 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
11220 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
11230 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
11240 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
11250 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
11260 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
11270 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
11280 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
11290 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
112a0 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
112b0 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
112c0 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
112d0 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
112e0 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
112f0 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
11300 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
11310 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
11320 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
11330 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
11340 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
11350 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
11360 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
11370 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
11380 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
11390 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
113a0 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
113b0 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
113c0 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
113d0 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
113e0 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
113f0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
11400 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
11410 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
11420 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
11430 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
11440 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11450 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
11460 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
11470 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
11480 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
11490 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
114a0 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a  ing level..**.**
114b0 20 57 69 74 68 20 64 6f 74 66 69 6c 65 20 6c 6f   With dotfile lo
114c0 63 6b 69 6e 67 2c 20 77 65 20 72 65 61 6c 6c 79  cking, we really
114d0 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 73 74   only support st
114e0 61 74 65 20 28 34 29 3a 20 45 58 43 4c 55 53 49  ate (4): EXCLUSI
114f0 56 45 2e 0a 2a 2a 20 42 75 74 20 77 65 20 74 72  VE..** But we tr
11500 61 63 6b 20 74 68 65 20 6f 74 68 65 72 20 6c 6f  ack the other lo
11510 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 69 6e 74  cking levels int
11520 65 72 6e 61 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74  ernally..*/.stat
11530 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f  ic int dotlockLo
11540 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
11550 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
11560 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ck) {.  unixFile
11570 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
11580 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72 20  ile*)id;.  char 
11590 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68  *zLockFile = (ch
115a0 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ar *)pFile->lock
115b0 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e  ingContext;.  in
115c0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
115d0 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 68  ;...  /* If we h
115e0 61 76 65 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68  ave any lock, th
115f0 65 6e 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65  en the lock file
11600 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e   already exists.
11610 20 20 41 6c 6c 20 77 65 20 68 61 76 65 0a 20 20    All we have.  
11620 2a 2a 20 74 6f 20 64 6f 20 69 73 20 61 64 6a 75  ** to do is adju
11630 73 74 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20  st our internal 
11640 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 6c 6f  record of the lo
11650 63 6b 20 6c 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20  ck level..  */. 
11660 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
11670 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 20  eLock > NO_LOCK 
11680 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  ){.    pFile->eF
11690 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
116a0 6f 63 6b 3b 0a 20 20 20 20 2f 2a 20 41 6c 77 61  ock;.    /* Alwa
116b0 79 73 20 75 70 64 61 74 65 20 74 68 65 20 74 69  ys update the ti
116c0 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68 65 20 6f  mestamp on the o
116d0 6c 64 20 66 69 6c 65 20 2a 2f 0a 23 69 66 64 65  ld file */.#ifde
116e0 66 20 48 41 56 45 5f 55 54 49 4d 45 0a 20 20 20  f HAVE_UTIME.   
116f0 20 75 74 69 6d 65 28 7a 4c 6f 63 6b 46 69 6c 65   utime(zLockFile
11700 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 73 65 0a 20  , NULL);.#else. 
11710 20 20 20 75 74 69 6d 65 73 28 7a 4c 6f 63 6b 46     utimes(zLockF
11720 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64  ile, NULL);.#end
11730 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
11740 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
11750 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63    /* grab an exc
11760 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20  lusive lock */. 
11770 20 72 63 20 3d 20 6f 73 4d 6b 64 69 72 28 7a 4c   rc = osMkdir(zL
11780 6f 63 6b 46 69 6c 65 2c 20 30 37 37 37 29 3b 0a  ockFile, 0777);.
11790 20 20 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20    if( rc<0 ){.  
117a0 20 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 6f    /* failed to o
117b0 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20 6c  pen/create the l
117c0 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 20 2a 2f  ock directory */
117d0 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  .    int tErrno 
117e0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28  = errno;.    if(
117f0 20 45 45 58 49 53 54 20 3d 3d 20 74 45 72 72 6e   EEXIST == tErrn
11800 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  o ){.      rc = 
11810 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
11820 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
11830 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
11840 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
11850 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
11860 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  ERR_LOCK);.     
11870 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11880 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20  BUSY ){.        
11890 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
118a0 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
118b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
118c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20   return rc;.  } 
118d0 0a 20 20 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c  .  .  /* got it,
118e0 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e   set the type an
118f0 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20  d return ok */. 
11900 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
11910 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
11920 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11930 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
11940 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
11950 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
11960 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
11970 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
11980 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
11990 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
119a0 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
119b0 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
119c0 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
119d0 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
119e0 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
119f0 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
11a00 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
11a10 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
11a20 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
11a30 20 57 68 65 6e 20 74 68 65 20 6c 6f 63 6b 69 6e   When the lockin
11a40 67 20 6c 65 76 65 6c 20 72 65 61 63 68 65 73 20  g level reaches 
11a50 4e 4f 5f 4c 4f 43 4b 2c 20 64 65 6c 65 74 65 20  NO_LOCK, delete 
11a60 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a  the lock file..*
11a70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  /.static int dot
11a80 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  lockUnlock(sqlit
11a90 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
11aa0 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
11ab0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
11ac0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
11ad0 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69  .  char *zLockFi
11ae0 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 70 46 69  le = (char *)pFi
11af0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
11b00 78 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  xt;.  int rc;.. 
11b10 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
11b20 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ;.  OSTRACE(("UN
11b30 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20  LOCK  %d %d was 
11b40 25 64 20 70 69 64 3d 25 64 20 28 64 6f 74 6c 6f  %d pid=%d (dotlo
11b50 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ck)\n", pFile->h
11b60 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20  , eFileLock,.   
11b70 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
11b80 46 69 6c 65 4c 6f 63 6b 2c 20 6f 73 47 65 74 70  FileLock, osGetp
11b90 69 64 28 30 29 29 29 3b 0a 20 20 61 73 73 65 72  id(0)));.  asser
11ba0 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48  t( eFileLock<=SH
11bb0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a  ARED_LOCK );.  .
11bc0 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f    /* no-op if po
11bd0 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20  ssible */.  if( 
11be0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
11bf0 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  ==eFileLock ){. 
11c00 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11c10 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  _OK;.  }..  /* T
11c20 6f 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 73  o downgrade to s
11c30 68 61 72 65 64 2c 20 73 69 6d 70 6c 79 20 75 70  hared, simply up
11c40 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61  date our interna
11c50 6c 20 6e 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a  l notion of the.
11c60 20 20 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e    ** lock state.
11c70 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73    No need to mes
11c80 73 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20  s with the file 
11c90 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20  on disk..  */.  
11ca0 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
11cb0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
11cc0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
11cd0 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
11ce0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
11cf0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
11d00 20 2f 2a 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c   /* To fully unl
11d10 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
11d20 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63  , delete the loc
11d30 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65  k file */.  asse
11d40 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e  rt( eFileLock==N
11d50 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 72 63 20 3d  O_LOCK );.  rc =
11d60 20 6f 73 52 6d 64 69 72 28 7a 4c 6f 63 6b 46 69   osRmdir(zLockFi
11d70 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20  le);.  if( rc<0 
11d80 29 7b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e  ){.    int tErrn
11d90 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69  o = errno;.    i
11da0 66 28 20 74 45 72 72 6e 6f 3d 3d 45 4e 4f 45 4e  f( tErrno==ENOEN
11db0 54 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  T ){.      rc = 
11dc0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
11dd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
11de0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
11df0 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 73 74 6f 72  LOCK;.      stor
11e00 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
11e10 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d  , tErrno);.    }
11e20 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20  .    return rc; 
11e30 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46  .  }.  pFile->eF
11e40 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
11e50 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  K;.  return SQLI
11e60 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
11e70 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 20 20 4d  Close a file.  M
11e80 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
11e90 6b 20 68 61 73 20 62 65 65 6e 20 72 65 6c 65 61  k has been relea
11ea0 73 65 64 20 62 65 66 6f 72 65 20 63 6c 6f 73 69  sed before closi
11eb0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
11ec0 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 28 73  t dotlockClose(s
11ed0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
11ee0 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
11ef0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
11f00 2a 29 69 64 3b 0a 20 20 61 73 73 65 72 74 28 20  *)id;.  assert( 
11f10 69 64 21 3d 30 20 29 3b 0a 20 20 64 6f 74 6c 6f  id!=0 );.  dotlo
11f20 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  ckUnlock(id, NO_
11f30 4c 4f 43 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33  LOCK);.  sqlite3
11f40 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63  _free(pFile->loc
11f50 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20  kingContext);.  
11f60 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78  return closeUnix
11f70 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 2f 2a 2a 2a  File(id);.}./***
11f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
11f90 45 6e 64 20 6f 66 20 74 68 65 20 64 6f 74 2d 66  End of the dot-f
11fa0 69 6c 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  ile lock impleme
11fb0 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
11fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
11fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11ff0 2a 2a 2a 2a 2a 2a 2a 2a 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 2f 0a 0a 2f 2a 2a  **********/../**
12020 2a 2a 2a 2a 2a 2a 2a 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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
12070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12080 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 6c  ******* Begin fl
12090 6f 63 6b 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  ock Locking ****
120a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
120b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
120c0 2a 2a 20 55 73 65 20 74 68 65 20 66 6c 6f 63 6b  ** Use the flock
120d0 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74  () system call t
120e0 6f 20 64 6f 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  o do file lockin
120f0 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29  g..**.** flock()
12100 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65   locking is like
12110 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e   dot-file lockin
12120 67 20 69 6e 20 74 68 61 74 20 74 68 65 20 76 61  g in that the va
12130 72 69 6f 75 73 0a 2a 2a 20 66 69 6e 65 2d 67 72  rious.** fine-gr
12140 61 69 6e 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ain locking leve
12150 6c 73 20 73 75 70 70 6f 72 74 65 64 20 62 79 20  ls supported by 
12160 53 51 4c 69 74 65 20 61 72 65 20 63 6f 6c 6c 61  SQLite are colla
12170 70 73 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 20 73  psed into.** a s
12180 69 6e 67 6c 65 20 65 78 63 6c 75 73 69 76 65 20  ingle exclusive 
12190 6c 6f 63 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20  lock.  In other 
121a0 77 6f 72 64 73 2c 20 53 48 41 52 45 44 2c 20 52  words, SHARED, R
121b0 45 53 45 52 56 45 44 2c 20 61 6e 64 0a 2a 2a 20  ESERVED, and.** 
121c0 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 73 20 61 72  PENDING locks ar
121d0 65 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67  e the same thing
121e0 20 61 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45   as an EXCLUSIVE
121f0 20 6c 6f 63 6b 2e 20 20 53 51 4c 69 74 65 0a 2a   lock.  SQLite.*
12200 2a 20 73 74 69 6c 6c 20 77 6f 72 6b 73 20 77 68  * still works wh
12210 65 6e 20 79 6f 75 20 64 6f 20 74 68 69 73 2c 20  en you do this, 
12220 62 75 74 20 63 6f 6e 63 75 72 72 65 6e 63 79 20  but concurrency 
12230 69 73 20 72 65 64 75 63 65 64 20 73 69 6e 63 65  is reduced since
12240 0a 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  .** only a singl
12250 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20 62 65  e process can be
12260 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74   reading the dat
12270 61 62 61 73 65 20 61 74 20 61 20 74 69 6d 65 2e  abase at a time.
12280 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74 20 74 68 69 73  .**.** Omit this
12290 20 73 65 63 74 69 6f 6e 20 69 66 20 53 51 4c 49   section if SQLI
122a0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
122b0 47 5f 53 54 59 4c 45 20 69 73 20 74 75 72 6e 65  G_STYLE is turne
122c0 64 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 53 51 4c  d off.*/.#if SQL
122d0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
122e0 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20  NG_STYLE../*.** 
122f0 52 65 74 72 79 20 66 6c 6f 63 6b 28 29 20 63 61  Retry flock() ca
12300 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20 77 69  lls that fail wi
12310 74 68 20 45 49 4e 54 52 0a 2a 2f 0a 23 69 66 64  th EINTR.*/.#ifd
12320 65 66 20 45 49 4e 54 52 0a 73 74 61 74 69 63 20  ef EINTR.static 
12330 69 6e 74 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  int robust_flock
12340 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 29  (int fd, int op)
12350 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f  {.  int rc;.  do
12360 7b 20 72 63 20 3d 20 66 6c 6f 63 6b 28 66 64 2c  { rc = flock(fd,
12370 6f 70 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c  op); }while( rc<
12380 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
12390 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  R );.  return rc
123a0 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
123b0 6e 65 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28  ne robust_flock(
123c0 61 2c 62 29 20 66 6c 6f 63 6b 28 61 2c 62 29 0a  a,b) flock(a,b).
123d0 23 65 6e 64 69 66 0a 20 20 20 20 20 0a 0a 2f 2a  #endif.     ../*
123e0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
123f0 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
12400 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
12410 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
12420 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
12430 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
12440 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
12450 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
12460 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65  s held, set *pRe
12470 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e  sOut.** to a non
12480 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65  -zero value othe
12490 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69  rwise *pResOut i
124a0 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
124b0 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
124c0 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
124d0 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61  LITE_OK unless a
124e0 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  n I/O error occu
124f0 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63  rs during lock c
12500 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  hecking..*/.stat
12510 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 68 65 63  ic int flockChec
12520 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
12530 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
12540 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
12550 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
12560 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
12570 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
12580 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
12590 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20  ixFile*)id;.  . 
125a0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
125b0 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
125c0 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
125d0 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20  VEDLOCK; );.  . 
125e0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
125f0 3b 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20  ;.  .  /* Check 
12600 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74  if a thread in t
12610 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  his process hold
12620 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f  s such a lock */
12630 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
12640 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
12650 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72  OCK ){.    reser
12660 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a  ved = 1;.  }.  .
12670 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73    /* Otherwise s
12680 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ee if some other
12690 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69   process holds i
126a0 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73  t. */.  if( !res
126b0 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20  erved ){.    /* 
126c0 61 74 74 65 6d 70 74 20 74 6f 20 67 65 74 20 74  attempt to get t
126d0 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69  he lock */.    i
126e0 6e 74 20 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f  nt lrc = robust_
126f0 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
12700 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e  LOCK_EX | LOCK_N
12710 42 29 3b 0a 20 20 20 20 69 66 28 20 21 6c 72 63  B);.    if( !lrc
12720 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74   ){.      /* got
12730 20 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63   the lock, unloc
12740 6b 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72  k it */.      lr
12750 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  c = robust_flock
12760 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
12770 55 4e 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20  UN);.      if ( 
12780 6c 72 63 20 29 20 7b 0a 20 20 20 20 20 20 20 20  lrc ) {.        
12790 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
127a0 6e 6f 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 75  no;.        /* u
127b0 6e 6c 6f 63 6b 20 66 61 69 6c 65 64 20 77 69 74  nlock failed wit
127c0 68 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  h an error */.  
127d0 20 20 20 20 20 20 6c 72 63 20 3d 20 53 51 4c 49        lrc = SQLI
127e0 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
127f0 20 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c   .        storeL
12800 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
12810 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20  tErrno);.       
12820 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20   rc = lrc;.     
12830 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a   }.    } else {.
12840 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f        int tErrno
12850 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
12860 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
12870 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65      /* someone e
12880 6c 73 65 20 6d 69 67 68 74 20 68 61 76 65 20 69  lse might have i
12890 74 20 72 65 73 65 72 76 65 64 20 2a 2f 0a 20 20  t reserved */.  
128a0 20 20 20 20 6c 72 63 20 3d 20 73 71 6c 69 74 65      lrc = sqlite
128b0 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
128c0 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
128d0 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20  TE_IOERR_LOCK); 
128e0 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  .      if( IS_LO
128f0 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b  CK_ERROR(lrc) ){
12900 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61  .        storeLa
12910 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
12920 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  Errno);.        
12930 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20  rc = lrc;.      
12940 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53  }.    }.  }.  OS
12950 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d  TRACE(("TEST WR-
12960 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 66  LOCK %d %d %d (f
12970 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  lock)\n", pFile-
12980 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64  >h, rc, reserved
12990 29 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ));..#ifdef SQLI
129a0 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
129b0 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66  LOCK_ERRORS.  if
129c0 28 20 28 72 63 20 26 20 53 51 4c 49 54 45 5f 49  ( (rc & SQLITE_I
129d0 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f  OERR) == SQLITE_
129e0 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20  IOERR ){.    rc 
129f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
12a00 20 72 65 73 65 72 76 65 64 3d 31 3b 0a 20 20 7d   reserved=1;.  }
12a10 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
12a20 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
12a30 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20  OCK_ERRORS */.  
12a40 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
12a50 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
12a60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
12a70 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
12a80 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
12a90 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46   by parameter eF
12aa0 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a  ileLock - one.**
12ab0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
12ac0 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
12ad0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
12ae0 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
12af0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
12b00 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
12b10 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
12b20 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
12b30 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
12b40 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
12b50 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
12b60 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
12b70 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
12b80 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
12b90 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
12ba0 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
12bb0 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
12bc0 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
12bd0 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
12be0 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
12bf0 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
12c00 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
12c10 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
12c20 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
12c30 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
12c40 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
12c50 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
12c60 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
12c70 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
12c80 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
12c90 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
12ca0 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
12cb0 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
12cc0 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
12cd0 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
12ce0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
12cf0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
12d00 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
12d10 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 66 6c  CLUSIVE.**.** fl
12d20 6f 63 6b 28 29 20 6f 6e 6c 79 20 72 65 61 6c 6c  ock() only reall
12d30 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55 53  y support EXCLUS
12d40 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74  IVE locks.  We t
12d50 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61 74  rack intermediat
12d60 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73  e.** lock states
12d70 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f   in the sqlite3_
12d80 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20  file structure, 
12d90 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48  but all locks SH
12da0 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65  ARED or.** above
12db0 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43 4c   are really EXCL
12dc0 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20  USIVE locks and 
12dd0 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65  exclude all othe
12de0 72 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f 6d  r processes from
12df0 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20 66  .** access the f
12e00 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ile..**.** This 
12e10 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
12e20 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
12e30 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69  k.  Use the sqli
12e40 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a  te3OsUnlock().**
12e50 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65   routine to lowe
12e60 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  r a locking leve
12e70 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
12e80 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74   flockLock(sqlit
12e90 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
12ea0 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
12eb0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
12ec0 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
12ed0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
12ee0 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72 74  e*)id;..  assert
12ef0 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a  ( pFile );..  /*
12f00 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 68   if we already h
12f10 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69  ave a lock, it i
12f20 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20  s exclusive.  . 
12f30 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20   ** Just adjust 
12f40 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f  level and punt o
12f50 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f  n outta here. */
12f60 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65 46  .  if (pFile->eF
12f70 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43  ileLock > NO_LOC
12f80 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K) {.    pFile->
12f90 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
12fa0 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72  eLock;.    retur
12fb0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
12fc0 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e  .  .  /* grab an
12fd0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
12fe0 2a 2f 0a 20 20 0a 20 20 69 66 20 28 72 6f 62 75  */.  .  if (robu
12ff0 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e  st_flock(pFile->
13000 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43  h, LOCK_EX | LOC
13010 4b 5f 4e 42 29 29 20 7b 0a 20 20 20 20 69 6e 74  K_NB)) {.    int
13020 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
13030 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27 74 20 67  .    /* didn't g
13040 65 74 2c 20 6d 75 73 74 20 62 65 20 62 75 73 79  et, must be busy
13050 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
13060 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
13070 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
13080 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
13090 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  );.    if( IS_LO
130a0 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
130b0 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
130c0 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
130d0 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65  no);.    }.  } e
130e0 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f 74  lse {.    /* got
130f0 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70   it, set the typ
13100 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20  e and return ok 
13110 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  */.    pFile->eF
13120 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
13130 6f 63 6b 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41  ock;.  }.  OSTRA
13140 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
13150 25 73 20 25 73 20 28 66 6c 6f 63 6b 29 5c 6e 22  %s %s (flock)\n"
13160 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69  , pFile->h, azFi
13170 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
13180 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 72  ), .           r
13190 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22  c==SQLITE_OK ? "
131a0 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
131b0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
131c0 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
131d0 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28  K_ERRORS.  if( (
131e0 72 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc & SQLITE_IOER
131f0 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  R) == SQLITE_IOE
13200 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  RR ){.    rc = S
13210 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
13220 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
13230 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
13240 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 72  CK_ERRORS */.  r
13250 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
13260 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
13270 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
13280 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
13290 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
132a0 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a  k.  eFileLock.**
132b0 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
132c0 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
132d0 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
132e0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
132f0 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
13300 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
13310 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
13320 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
13330 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
13340 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
13350 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
13360 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c  tic int flockUnl
13370 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
13380 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
13390 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ock) {.  unixFil
133a0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
133b0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61  File*)id;.  .  a
133c0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
133d0 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f    OSTRACE(("UNLO
133e0 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
133f0 20 70 69 64 3d 25 64 20 28 66 6c 6f 63 6b 29 5c   pid=%d (flock)\
13400 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46  n", pFile->h, eF
13410 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20  ileLock,.       
13420 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
13430 4c 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64 28 30  Lock, osGetpid(0
13440 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  )));.  assert( e
13450 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  FileLock<=SHARED
13460 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a  _LOCK );.  .  /*
13470 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62   no-op if possib
13480 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  le */.  if( pFil
13490 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46  e->eFileLock==eF
134a0 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72  ileLock ){.    r
134b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
134c0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61  .  }.  .  /* sha
134d0 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20  red can just be 
134e0 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20 61  set because we a
134f0 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65 78  lways have an ex
13500 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20  clusive */.  if 
13510 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  (eFileLock==SHAR
13520 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70  ED_LOCK) {.    p
13530 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
13540 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  = eFileLock;.   
13550 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13560 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e  K;.  }.  .  /* n
13570 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63  o, really, unloc
13580 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 72 6f 62 75  k. */.  if( robu
13590 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e  st_flock(pFile->
135a0 68 2c 20 4c 4f 43 4b 5f 55 4e 29 20 29 7b 0a 23  h, LOCK_UN) ){.#
135b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e  ifdef SQLITE_IGN
135c0 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
135d0 52 52 4f 52 53 0a 20 20 20 20 72 65 74 75 72 6e  RRORS.    return
135e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64   SQLITE_OK;.#end
135f0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e  if /* SQLITE_IGN
13600 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
13610 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 72 65 74  RRORS */.    ret
13620 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
13630 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65  _UNLOCK;.  }else
13640 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
13650 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
13660 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
13670 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ITE_OK;.  }.}../
13680 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
13690 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
136a0 20 66 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69   flockClose(sqli
136b0 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a  te3_file *id) {.
136c0 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
136d0 29 3b 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b  );.  flockUnlock
136e0 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  (id, NO_LOCK);. 
136f0 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69   return closeUni
13700 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 23 65  xFile(id);.}..#e
13710 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
13720 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
13730 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52  YLE && !OS_VXWOR
13740 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  K */../*********
13750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
13760 66 20 74 68 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b  f the flock lock
13770 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
13780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13790 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
137a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
137b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
137c0 2a 2a 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 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
137f0 2a 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 2a 2a 2a 2a 2a 2a 2a  ****************
13810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13830 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
13840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
13850 42 65 67 69 6e 20 4e 61 6d 65 64 20 53 65 6d 61  Begin Named Sema
13860 70 68 6f 72 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a  phore Locking **
13870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13880 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d  ******.**.** Nam
13890 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ed semaphore loc
138a0 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 73 75 70  king is only sup
138b0 70 6f 72 74 65 64 20 6f 6e 20 56 78 57 6f 72 6b  ported on VxWork
138c0 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f  s..**.** Semapho
138d0 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69  re locking is li
138e0 6b 65 20 64 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20  ke dot-lock and 
138f0 66 6c 6f 63 6b 20 69 6e 20 74 68 61 74 20 69 74  flock in that it
13900 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20   really only.** 
13910 73 75 70 70 6f 72 74 73 20 45 58 43 4c 55 53 49  supports EXCLUSI
13920 56 45 20 6c 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c  VE locking.  Onl
13930 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65  y a single proce
13940 73 73 20 63 61 6e 20 72 65 61 64 20 6f 72 20 77  ss can read or w
13950 72 69 74 65 0a 2a 2a 20 74 68 65 20 64 61 74 61  rite.** the data
13960 62 61 73 65 20 66 69 6c 65 20 61 74 20 61 20 74  base file at a t
13970 69 6d 65 2e 20 20 54 68 69 73 20 72 65 64 75 63  ime.  This reduc
13980 65 73 20 70 6f 74 65 6e 74 69 61 6c 20 63 6f 6e  es potential con
13990 63 75 72 72 65 6e 63 79 2c 20 62 75 74 0a 2a 2a  currency, but.**
139a0 20 6d 61 6b 65 73 20 74 68 65 20 6c 6f 63 6b 20   makes the lock 
139b0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d  implementation m
139c0 75 63 68 20 65 61 73 69 65 72 2e 0a 2a 2f 0a 23  uch easier..*/.#
139d0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f  if OS_VXWORKS../
139e0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
139f0 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
13a00 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
13a10 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
13a20 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
13a30 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
13a40 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
13a50 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
13a60 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
13a70 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
13a80 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
13a90 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
13aa0 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
13ab0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
13ac0 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
13ad0 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
13ae0 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
13af0 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
13b00 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61  checking..*/.sta
13b10 74 69 63 20 69 6e 74 20 73 65 6d 58 43 68 65 63  tic int semXChec
13b20 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
13b30 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
13b40 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a  int *pResOut) {.
13b50 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
13b60 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65  E_OK;.  int rese
13b70 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78  rved = 0;.  unix
13b80 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
13b90 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  nixFile*)id;..  
13ba0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
13bb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
13bc0 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
13bd0 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20  EDLOCK; );.  .  
13be0 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
13bf0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
13c00 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
13c10 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
13c20 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
13c30 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
13c40 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
13c50 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64   ){.    reserved
13c60 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f   = 1;.  }.  .  /
13c70 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20  * Otherwise see 
13c80 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  if some other pr
13c90 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20  ocess holds it. 
13ca0 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76  */.  if( !reserv
13cb0 65 64 20 29 7b 0a 20 20 20 20 73 65 6d 5f 74 20  ed ){.    sem_t 
13cc0 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70  *pSem = pFile->p
13cd0 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20  Inode->pSem;..  
13ce0 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69    if( sem_trywai
13cf0 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20  t(pSem)==-1 ){. 
13d00 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20       int tErrno 
13d10 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69  = errno;.      i
13d20 66 28 20 45 41 47 41 49 4e 20 21 3d 20 74 45 72  f( EAGAIN != tEr
13d30 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72  rno ){.        r
13d40 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
13d50 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
13d60 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
13d70 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
13d80 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73  LOCK);.        s
13d90 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
13da0 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
13db0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
13dc0 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20       /* someone 
13dd0 65 6c 73 65 20 68 61 73 20 74 68 65 20 6c 6f 63  else has the loc
13de0 6b 20 77 68 65 6e 20 77 65 20 61 72 65 20 69 6e  k when we are in
13df0 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20   NO_LOCK */.    
13e00 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 28      reserved = (
13e10 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
13e20 20 3c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b   < SHARED_LOCK);
13e30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
13e40 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 77 65 20  se{.      /* we 
13e50 63 6f 75 6c 64 20 68 61 76 65 20 69 74 20 69 66  could have it if
13e60 20 77 65 20 77 61 6e 74 20 69 74 20 2a 2f 0a 20   we want it */. 
13e70 20 20 20 20 20 73 65 6d 5f 70 6f 73 74 28 70 53       sem_post(pS
13e80 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  em);.    }.  }. 
13e90 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20   OSTRACE(("TEST 
13ea0 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64  WR-LOCK %d %d %d
13eb0 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65   (sem)\n", pFile
13ec0 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
13ed0 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74  d));..  *pResOut
13ee0 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72   = reserved;.  r
13ef0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
13f00 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
13f10 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
13f20 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
13f30 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20  meter eFileLock 
13f40 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
13f50 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
13f60 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
13f70 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
13f80 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
13f90 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
13fa0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
13fb0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
13fc0 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
13fd0 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
13fe0 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
13ff0 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
14000 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
14010 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
14020 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
14030 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
14040 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
14050 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
14060 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
14070 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
14080 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
14090 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
140a0 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
140b0 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
140c0 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
140d0 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
140e0 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
140f0 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
14100 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
14110 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
14120 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
14130 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
14140 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
14150 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
14160 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
14170 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
14180 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
14190 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
141a0 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
141b0 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20  **.** Semaphore 
141c0 6c 6f 63 6b 73 20 6f 6e 6c 79 20 72 65 61 6c 6c  locks only reall
141d0 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55 53  y support EXCLUS
141e0 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74  IVE locks.  We t
141f0 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61 74  rack intermediat
14200 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73  e.** lock states
14210 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f   in the sqlite3_
14220 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20  file structure, 
14230 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48  but all locks SH
14240 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65  ARED or.** above
14250 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43 4c   are really EXCL
14260 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20  USIVE locks and 
14270 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65  exclude all othe
14280 72 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f 6d  r processes from
14290 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20 66  .** access the f
142a0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ile..**.** This 
142b0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
142c0 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
142d0 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69  k.  Use the sqli
142e0 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a  te3OsUnlock().**
142f0 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65   routine to lowe
14300 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  r a locking leve
14310 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
14320 20 73 65 6d 58 4c 6f 63 6b 28 73 71 6c 69 74 65   semXLock(sqlite
14330 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
14340 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75  eFileLock) {.  u
14350 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
14360 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
14370 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20    sem_t *pSem = 
14380 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pFile->pInode->p
14390 53 65 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Sem;.  int rc = 
143a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
143b0 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 68   if we already h
143c0 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69  ave a lock, it i
143d0 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20  s exclusive.  . 
143e0 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20   ** Just adjust 
143f0 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f  level and punt o
14400 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f  n outta here. */
14410 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65 46  .  if (pFile->eF
14420 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43  ileLock > NO_LOC
14430 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K) {.    pFile->
14440 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
14450 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 63 20 3d 20  eLock;.    rc = 
14460 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67  SQLITE_OK;.    g
14470 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b  oto sem_end_lock
14480 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f  ;.  }.  .  /* lo
14490 63 6b 20 73 65 6d 61 70 68 6f 72 65 20 6e 6f 77  ck semaphore now
144a0 20 62 75 74 20 62 61 69 6c 20 6f 75 74 20 77 68   but bail out wh
144b0 65 6e 20 61 6c 72 65 61 64 79 20 6c 6f 63 6b 65  en already locke
144c0 64 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65 6d 5f  d. */.  if( sem_
144d0 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d  trywait(pSem)==-
144e0 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  1 ){.    rc = SQ
144f0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67  LITE_BUSY;.    g
14500 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b  oto sem_end_lock
14510 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20  ;.  }..  /* got 
14520 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65  it, set the type
14530 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a   and return ok *
14540 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  /.  pFile->eFile
14550 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
14560 3b 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b  ;.. sem_end_lock
14570 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  :.  return rc;.}
14580 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
14590 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
145a0 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
145b0 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
145c0 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
145d0 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  k.** must be eit
145e0 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
145f0 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
14600 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
14610 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
14620 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
14630 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
14640 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
14650 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
14660 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
14670 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
14680 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 58  .static int semX
14690 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
146a0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
146b0 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
146c0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
146d0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73  nixFile*)id;.  s
146e0 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69  em_t *pSem = pFi
146f0 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  le->pInode->pSem
14700 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
14710 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  le );.  assert( 
14720 70 53 65 6d 20 29 3b 0a 20 20 4f 53 54 52 41 43  pSem );.  OSTRAC
14730 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
14740 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 20  d was %d pid=%d 
14750 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (sem)\n", pFile-
14760 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
14770 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
14780 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 6f 73 47 65  >eFileLock, osGe
14790 74 70 69 64 28 30 29 29 29 3b 0a 20 20 61 73 73  tpid(0)));.  ass
147a0 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ert( eFileLock<=
147b0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
147c0 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20   .  /* no-op if 
147d0 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66  possible */.  if
147e0 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
147f0 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck==eFileLock ){
14800 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14810 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
14820 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75  /* shared can ju
14830 73 74 20 62 65 20 73 65 74 20 62 65 63 61 75 73  st be set becaus
14840 65 20 77 65 20 61 6c 77 61 79 73 20 68 61 76 65  e we always have
14850 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f   an exclusive */
14860 0a 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b  .  if (eFileLock
14870 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b  ==SHARED_LOCK) {
14880 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
14890 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
148a0 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  k;.    return SQ
148b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
148c0 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 20    /* no, really 
148d0 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 20  unlock. */.  if 
148e0 28 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29  ( sem_post(pSem)
148f0 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e 74  ==-1 ) {.    int
14900 20 72 63 2c 20 74 45 72 72 6e 6f 20 3d 20 65 72   rc, tErrno = er
14910 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  rno;.    rc = sq
14920 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
14930 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
14940 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
14950 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53  OCK);.    if( IS
14960 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
14970 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  ){.      storeLa
14980 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
14990 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  Errno);.    }.  
149a0 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20    return rc; .  
149b0 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  }.  pFile->eFile
149c0 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
149d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
149e0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c  OK;.}../*. ** Cl
149f0 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a  ose a file.. */.
14a00 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 58 43  static int semXC
14a10 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
14a20 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69  e *id) {.  if( i
14a30 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  d ){.    unixFil
14a40 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
14a50 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73 65  File*)id;.    se
14a60 6d 58 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  mXUnlock(id, NO_
14a70 4c 4f 43 4b 29 3b 0a 20 20 20 20 61 73 73 65 72  LOCK);.    asser
14a80 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  t( pFile );.    
14a90 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
14aa0 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f  ;.    releaseIno
14ab0 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20  deInfo(pFile);. 
14ac0 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
14ad0 78 28 29 3b 0a 20 20 20 20 63 6c 6f 73 65 55 6e  x();.    closeUn
14ae0 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a  ixFile(id);.  }.
14af0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14b00 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  OK;.}..#endif /*
14b10 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f   OS_VXWORKS */./
14b20 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70  *.** Named semap
14b30 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20  hore locking is 
14b40 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f  only available o
14b50 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a  n VxWorks..**.**
14b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
14b70 64 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 73  d of the named s
14b80 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 20 69 6d  emaphore lock im
14b90 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
14ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
14bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 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 2f 0a 0a 0a  ************/...
14c00 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
14c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
14c70 6e 20 41 46 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a  n AFP Locking **
14c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
14ca0 2a 2a 0a 2a 2a 20 41 46 50 20 69 73 20 74 68 65  **.** AFP is the
14cb0 20 41 70 70 6c 65 20 46 69 6c 69 6e 67 20 50 72   Apple Filing Pr
14cc0 6f 74 6f 63 6f 6c 2e 20 20 41 46 50 20 69 73 20  otocol.  AFP is 
14cd0 61 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 73 79  a network filesy
14ce0 73 74 65 6d 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e  stem found.** on
14cf0 20 41 70 70 6c 65 20 4d 61 63 69 6e 74 6f 73 68   Apple Macintosh
14d00 20 63 6f 6d 70 75 74 65 72 73 20 2d 20 62 6f 74   computers - bot
14d10 68 20 4f 53 39 20 61 6e 64 20 4f 53 58 2e 0a 2a  h OS9 and OSX..*
14d20 2a 0a 2a 2a 20 54 68 69 72 64 2d 70 61 72 74 79  *.** Third-party
14d30 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
14d40 20 6f 66 20 41 46 50 20 61 72 65 20 61 76 61 69   of AFP are avai
14d50 6c 61 62 6c 65 2e 20 20 42 75 74 20 74 68 69 73  lable.  But this
14d60 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 6f 6e   code here.** on
14d70 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e  ly works on OSX.
14d80 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  .*/..#if defined
14d90 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
14da0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
14db0 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a  KING_STYLE./*.**
14dc0 20 54 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43   The afpLockingC
14dd0 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65  ontext structure
14de0 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61 66   contains all af
14df0 70 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 63 20  p lock specific 
14e00 73 74 61 74 65 0a 2a 2f 0a 74 79 70 65 64 65 66  state.*/.typedef
14e10 20 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69   struct afpLocki
14e20 6e 67 43 6f 6e 74 65 78 74 20 61 66 70 4c 6f 63  ngContext afpLoc
14e30 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72  kingContext;.str
14e40 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  uct afpLockingCo
14e50 6e 74 65 78 74 20 7b 0a 20 20 69 6e 74 20 72 65  ntext {.  int re
14e60 73 65 72 76 65 64 3b 0a 20 20 63 6f 6e 73 74 20  served;.  const 
14e70 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20  char *dbPath;   
14e80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
14e90 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69  e of the open fi
14ea0 6c 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74  le */.};..struct
14eb0 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
14ec0 32 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c  2.{.  unsigned l
14ed0 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b  ong long offset;
14ee0 20 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65          /* offse
14ef0 74 20 74 6f 20 66 69 72 73 74 20 62 79 74 65 20  t to first byte 
14f00 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73  to lock */.  uns
14f10 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
14f20 6c 65 6e 67 74 68 3b 20 20 20 20 20 20 20 20 2f  length;        /
14f30 2a 20 6e 62 72 20 6f 66 20 62 79 74 65 73 20 74  * nbr of bytes t
14f40 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69  o lock */.  unsi
14f50 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72  gned long long r
14f60 65 74 52 61 6e 67 65 53 74 61 72 74 3b 20 2f 2a  etRangeStart; /*
14f70 20 6e 62 72 20 6f 66 20 31 73 74 20 62 79 74 65   nbr of 1st byte
14f80 20 6c 6f 63 6b 65 64 20 69 66 20 73 75 63 63 65   locked if succe
14f90 73 73 66 75 6c 20 2a 2f 0a 20 20 75 6e 73 69 67  ssful */.  unsig
14fa0 6e 65 64 20 63 68 61 72 20 75 6e 4c 6f 63 6b 46  ned char unLockF
14fb0 6c 61 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  lag;         /* 
14fc0 31 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20  1 = unlock, 0 = 
14fd0 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  lock */.  unsign
14fe0 65 64 20 63 68 61 72 20 73 74 61 72 74 45 6e 64  ed char startEnd
14ff0 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 31  Flag;       /* 1
15000 3d 72 65 6c 20 74 6f 20 65 6e 64 20 6f 66 20 66  =rel to end of f
15010 6f 72 6b 2c 20 30 3d 72 65 6c 20 74 6f 20 73 74  ork, 0=rel to st
15020 61 72 74 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b  art */.  int fd;
15030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15040 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69             /* fi
15050 6c 65 20 64 65 73 63 20 74 6f 20 61 73 73 6f 63  le desc to assoc
15060 20 74 68 69 73 20 6c 6f 63 6b 20 77 69 74 68 20   this lock with 
15070 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 61  */.};..#define a
15080 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63  fpfsByteRangeLoc
15090 6b 32 46 53 43 54 4c 20 20 20 20 20 20 20 20 5f  k2FSCTL        _
150a0 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74  IOWR('z', 23, st
150b0 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f  ruct ByteRangeLo
150c0 63 6b 50 42 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  ckPB2)../*.** Th
150d0 69 73 20 69 73 20 61 20 75 74 69 6c 69 74 79 20  is is a utility 
150e0 66 6f 72 20 73 65 74 74 69 6e 67 20 6f 72 20 63  for setting or c
150f0 6c 65 61 72 69 6e 67 20 61 20 62 69 74 2d 72 61  learing a bit-ra
15100 6e 67 65 20 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a  nge lock on an.*
15110 2a 20 41 46 50 20 66 69 6c 65 73 79 73 74 65 6d  * AFP filesystem
15120 2e 0a 2a 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20  ..** .** Return 
15130 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
15140 63 65 73 73 2c 20 53 51 4c 49 54 45 5f 42 55 53  cess, SQLITE_BUS
15150 59 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f  Y on failure..*/
15160 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 53  .static int afpS
15170 65 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74 20  etLock(.  const 
15180 63 68 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20  char *path,     
15190 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
151a0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20   of the file to 
151b0 62 65 20 6c 6f 63 6b 65 64 20 6f 72 20 75 6e 6c  be locked or unl
151c0 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 46  ocked */.  unixF
151d0 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20  ile *pFile,     
151e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
151f0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
15200 72 20 6f 6e 20 70 61 74 68 20 2a 2f 0a 20 20 75  r on path */.  u
15210 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
15220 67 20 6f 66 66 73 65 74 2c 20 20 20 20 20 2f 2a  g offset,     /*
15230 20 46 69 72 73 74 20 62 79 74 65 20 74 6f 20 62   First byte to b
15240 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e  e locked */.  un
15250 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
15260 20 6c 65 6e 67 74 68 2c 20 20 20 20 20 2f 2a 20   length,     /* 
15270 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
15280 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74  to lock */.  int
15290 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 20 20 20   setLockFlag    
152a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
152b0 72 75 65 20 74 6f 20 73 65 74 20 6c 6f 63 6b 2e  rue to set lock.
152c0 20 20 46 61 6c 73 65 20 74 6f 20 63 6c 65 61 72    False to clear
152d0 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74   lock */.){.  st
152e0 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f  ruct ByteRangeLo
152f0 63 6b 50 42 32 20 70 62 3b 0a 20 20 69 6e 74 20  ckPB2 pb;.  int 
15300 65 72 72 3b 0a 20 20 0a 20 20 70 62 2e 75 6e 4c  err;.  .  pb.unL
15310 6f 63 6b 46 6c 61 67 20 3d 20 73 65 74 4c 6f 63  ockFlag = setLoc
15320 6b 46 6c 61 67 20 3f 20 30 20 3a 20 31 3b 0a 20  kFlag ? 0 : 1;. 
15330 20 70 62 2e 73 74 61 72 74 45 6e 64 46 6c 61 67   pb.startEndFlag
15340 20 3d 20 30 3b 0a 20 20 70 62 2e 6f 66 66 73 65   = 0;.  pb.offse
15350 74 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 70 62  t = offset;.  pb
15360 2e 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68  .length = length
15370 3b 20 0a 20 20 70 62 2e 66 64 20 3d 20 70 46 69  ; .  pb.fd = pFi
15380 6c 65 2d 3e 68 3b 0a 20 20 0a 20 20 4f 53 54 52  le->h;.  .  OSTR
15390 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b  ACE(("AFPSETLOCK
153a0 20 5b 25 73 5d 20 66 6f 72 20 25 64 25 73 20 69   [%s] for %d%s i
153b0 6e 20 72 61 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c  n range %llx:%ll
153c0 78 5c 6e 22 2c 20 0a 20 20 20 20 28 73 65 74 4c  x\n", .    (setL
153d0 6f 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46  ockFlag?"ON":"OF
153e0 46 22 29 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 28  F"), pFile->h, (
153f0 70 62 2e 66 64 3d 3d 2d 31 3f 22 5b 74 65 73 74  pb.fd==-1?"[test
15400 76 61 6c 2d 31 5d 22 3a 22 22 29 2c 0a 20 20 20  val-1]":""),.   
15410 20 6f 66 66 73 65 74 2c 20 6c 65 6e 67 74 68 29   offset, length)
15420 29 3b 0a 20 20 65 72 72 20 3d 20 66 73 63 74 6c  );.  err = fsctl
15430 28 70 61 74 68 2c 20 61 66 70 66 73 42 79 74 65  (path, afpfsByte
15440 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 2c  RangeLock2FSCTL,
15450 20 26 70 62 2c 20 30 29 3b 0a 20 20 69 66 20 28   &pb, 0);.  if (
15460 20 65 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20 20   err==-1 ) {.   
15470 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74   int rc;.    int
15480 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
15490 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 41  .    OSTRACE(("A
154a0 46 50 53 45 54 4c 4f 43 4b 20 66 61 69 6c 65 64  FPSETLOCK failed
154b0 20 74 6f 20 66 73 63 74 6c 28 29 20 27 25 73 27   to fsctl() '%s'
154c0 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20   %d %s\n",.     
154d0 20 20 20 20 20 20 20 20 70 61 74 68 2c 20 74 45          path, tE
154e0 72 72 6e 6f 2c 20 73 74 72 65 72 72 6f 72 28 74  rrno, strerror(t
154f0 45 72 72 6e 6f 29 29 29 3b 0a 23 69 66 64 65 66  Errno)));.#ifdef
15500 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41   SQLITE_IGNORE_A
15510 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20  FP_LOCK_ERRORS. 
15520 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
15530 55 53 59 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72  USY;.#else.    r
15540 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
15550 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
15560 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
15570 20 20 20 20 20 20 20 20 20 20 73 65 74 4c 6f 63            setLoc
15580 6b 46 6c 61 67 20 3f 20 53 51 4c 49 54 45 5f 49  kFlag ? SQLITE_I
15590 4f 45 52 52 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49  OERR_LOCK : SQLI
155a0 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
155b0 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
155c0 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f  TE_IGNORE_AFP_LO
155d0 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20  CK_ERRORS */.   
155e0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
155f0 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
15600 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
15610 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
15620 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
15630 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  rc;.  } else {. 
15640 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15650 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  _OK;.  }.}../*.*
15660 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
15670 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
15680 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
15690 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
156a0 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
156b0 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
156c0 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
156d0 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
156e0 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
156f0 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
15700 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
15710 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
15720 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
15730 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
15740 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
15750 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
15760 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
15770 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
15780 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
15790 20 69 6e 74 20 61 66 70 43 68 65 63 6b 52 65 73   int afpCheckRes
157a0 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
157b0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
157c0 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74  *pResOut){.  int
157d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
157e0 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20  .  int reserved 
157f0 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
15800 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
15810 6c 65 2a 29 69 64 3b 0a 20 20 61 66 70 4c 6f 63  le*)id;.  afpLoc
15820 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e  kingContext *con
15830 74 65 78 74 3b 0a 20 20 0a 20 20 53 69 6d 75 6c  text;.  .  Simul
15840 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
15850 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
15860 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
15870 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72  K; );.  .  asser
15880 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 63 6f  t( pFile );.  co
15890 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b  ntext = (afpLock
158a0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46  ingContext *) pF
158b0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
158c0 65 78 74 3b 0a 20 20 69 66 28 20 63 6f 6e 74 65  ext;.  if( conte
158d0 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b 0a  xt->reserved ){.
158e0 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 31      *pResOut = 1
158f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
15900 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e  ITE_OK;.  }.  un
15910 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20  ixEnterMutex(); 
15920 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c 65  /* Because pFile
15930 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72  ->pInode is shar
15940 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ed across thread
15950 73 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 43 68 65  s */.  .  /* Che
15960 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69  ck if a thread i
15970 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68  n this process h
15980 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b  olds such a lock
15990 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
159a0 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  >pInode->eFileLo
159b0 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
159c0 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  {.    reserved =
159d0 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20   1;.  }.  .  /* 
159e0 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66  Otherwise see if
159f0 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
15a00 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20  ess holds it..  
15a10 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72   */.  if( !reser
15a20 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f  ved ){.    /* lo
15a30 63 6b 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ck the RESERVED 
15a40 62 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  byte */.    int 
15a50 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  lrc = afpSetLock
15a60 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
15a70 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45  , pFile, RESERVE
15a80 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 20 20 0a  D_BYTE, 1,1);  .
15a90 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
15aa0 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20 20 20 20 20  K==lrc ){.      
15ab0 2f 2a 20 69 66 20 77 65 20 73 75 63 63 65 65 64  /* if we succeed
15ac0 65 64 20 69 6e 20 74 61 6b 69 6e 67 20 74 68 65  ed in taking the
15ad0 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c 20   reserved lock, 
15ae0 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65 73  unlock it to res
15af0 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  tore.      ** th
15b00 65 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  e original state
15b10 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20   */.      lrc = 
15b20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
15b30 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
15b40 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  e, RESERVED_BYTE
15b50 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 65  , 1, 0);.    } e
15b60 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69  lse {.      /* i
15b70 66 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 67  f we failed to g
15b80 65 74 20 74 68 65 20 6c 6f 63 6b 20 74 68 65 6e  et the lock then
15b90 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 75   someone else mu
15ba0 73 74 20 68 61 76 65 20 69 74 20 2a 2f 0a 20 20  st have it */.  
15bb0 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
15bc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
15bd0 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
15be0 63 29 20 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c  c) ){.      rc=l
15bf0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rc;.    }.  }.  
15c00 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
15c10 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  x();.  OSTRACE((
15c20 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
15c30 20 25 64 20 25 64 20 28 61 66 70 29 5c 6e 22 2c   %d %d (afp)\n",
15c40 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
15c50 65 73 65 72 76 65 64 29 29 3b 0a 20 20 0a 20 20  eserved));.  .  
15c60 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
15c70 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
15c80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
15c90 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
15ca0 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
15cb0 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46   by parameter eF
15cc0 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a  ileLock - one.**
15cd0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
15ce0 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
15cf0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
15d00 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
15d10 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
15d20 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
15d30 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
15d40 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
15d50 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
15d60 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
15d70 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
15d80 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
15d90 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
15da0 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
15db0 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
15dc0 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
15dd0 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
15de0 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
15df0 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
15e00 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
15e10 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
15e20 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
15e30 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
15e40 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
15e50 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
15e60 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
15e70 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
15e80 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
15e90 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
15ea0 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
15eb0 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
15ec0 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
15ed0 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
15ee0 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
15ef0 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
15f00 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
15f10 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
15f20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
15f30 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
15f40 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
15f50 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
15f60 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
15f70 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
15f80 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
15f90 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
15fa0 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  evel..*/.static 
15fb0 69 6e 74 20 61 66 70 4c 6f 63 6b 28 73 71 6c 69  int afpLock(sqli
15fc0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
15fd0 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20  t eFileLock){.  
15fe0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
15ff0 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
16000 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
16010 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f  e*)id;.  unixIno
16020 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d  deInfo *pInode =
16030 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
16040 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74    afpLockingCont
16050 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28  ext *context = (
16060 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
16070 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  t *) pFile->lock
16080 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20  ingContext;.  . 
16090 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
160a0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f  ;.  OSTRACE(("LO
160b0 43 4b 20 20 20 20 25 64 20 25 73 20 77 61 73 20  CK    %d %s was 
160c0 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64  %s(%s,%d) pid=%d
160d0 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65   (afp)\n", pFile
160e0 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
160f0 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
16100 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63  Lock), azFileLoc
16110 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  k(pFile->eFileLo
16120 63 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ck),.           
16130 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64  azFileLock(pInod
16140 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70  e->eFileLock), p
16150 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 2c  Inode->nShared ,
16160 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a   osGetpid(0)));.
16170 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
16180 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b  s already a lock
16190 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72   of this type or
161a0 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76   more restrictiv
161b0 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e  e on the.  ** un
161c0 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69  ixFile, do nothi
161d0 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68  ng. Don't use th
161e0 65 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20  e afp_end_lock: 
161f0 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20  exit path, as.  
16200 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  ** unixEnterMute
16210 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20  x() hasn't been 
16220 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f  called yet..  */
16230 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
16240 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f  ileLock>=eFileLo
16250 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  ck ){.    OSTRAC
16260 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E(("LOCK    %d %
16270 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65  s ok (already he
16280 6c 64 29 20 28 61 66 70 29 5c 6e 22 2c 20 70 46  ld) (afp)\n", pF
16290 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
162a0 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46     azFileLock(eF
162b0 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20  ileLock)));.    
162c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
162d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
162e0 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e   sure the lockin
162f0 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f  g sequence is co
16300 72 72 65 63 74 0a 20 20 2a 2a 20 20 28 31 29 20  rrect.  **  (1) 
16310 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20 66 72  We never move fr
16320 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61  om unlocked to a
16330 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72 20 74  nything higher t
16340 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e  han shared lock.
16350 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c 69 74  .  **  (2) SQLit
16360 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63 69 74  e never explicit
16370 6c 79 20 72 65 71 75 65 73 74 73 20 61 20 70 65  ly requests a pe
16380 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ndig lock..  ** 
16390 20 28 33 29 20 41 20 73 68 61 72 65 64 20 6c 6f   (3) A shared lo
163a0 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c  ck is always hel
163b0 64 20 77 68 65 6e 20 61 20 72 65 73 65 72 76 65  d when a reserve
163c0 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74   lock is request
163d0 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ed..  */.  asser
163e0 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  t( pFile->eFileL
163f0 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ock!=NO_LOCK || 
16400 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
16410 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
16420 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50  rt( eFileLock!=P
16430 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20  ENDING_LOCK );. 
16440 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
16450 63 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck!=RESERVED_LOC
16460 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c  K || pFile->eFil
16470 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
16480 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68  CK );.  .  /* Th
16490 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64  is mutex is need
164a0 65 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65  ed because pFile
164b0 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72  ->pInode is shar
164c0 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ed across thread
164d0 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  s.  */.  unixEnt
164e0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e  erMutex();.  pIn
164f0 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
16500 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f  ode;..  /* If so
16510 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20  me thread using 
16520 74 68 69 73 20 50 49 44 20 68 61 73 20 61 20 6c  this PID has a l
16530 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66 65 72  ock via a differ
16540 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20  ent unixFile*.  
16550 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70  ** handle that p
16560 72 65 63 6c 75 64 65 73 20 74 68 65 20 72 65 71  recludes the req
16570 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74  uested lock, ret
16580 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20  urn BUSY..  */. 
16590 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 69   if( (pFile->eFi
165a0 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e  leLock!=pInode->
165b0 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20  eFileLock && .  
165c0 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46       (pInode->eF
165d0 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47  ileLock>=PENDING
165e0 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f  _LOCK || eFileLo
165f0 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29  ck>SHARED_LOCK))
16600 0a 20 20 20 20 20 29 7b 0a 20 20 20 20 72 63 20  .     ){.    rc 
16610 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
16620 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
16630 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  lock;.  }.  .  /
16640 2a 20 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f  * If a SHARED lo
16650 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ck is requested,
16660 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64   and some thread
16670 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20   using this PID 
16680 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73  already.  ** has
16690 20 61 20 53 48 41 52 45 44 20 6f 72 20 52 45 53   a SHARED or RES
166a0 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e  ERVED lock, then
166b0 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72   increment refer
166c0 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a  ence counts and.
166d0 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49    ** return SQLI
166e0 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66  TE_OK..  */.  if
166f0 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
16700 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20  RED_LOCK && .   
16710 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65    (pInode->eFile
16720 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
16730 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69  K || pInode->eFi
16740 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
16750 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73  _LOCK) ){.    as
16760 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
16770 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
16780 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
16790 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20  e->eFileLock==0 
167a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
167b0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30  Inode->nShared>0
167c0 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   );.    pFile->e
167d0 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
167e0 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f  D_LOCK;.    pIno
167f0 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20  de->nShared++;. 
16800 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
16810 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70  ++;.    goto afp
16820 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  _end_lock;.  }. 
16830 20 20 20 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49     .  /* A PENDI
16840 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65  NG lock is neede
16850 64 20 62 65 66 6f 72 65 20 61 63 71 75 69 72 69  d before acquiri
16860 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ng a SHARED lock
16870 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a   and before.  **
16880 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58   acquiring an EX
16890 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46  CLUSIVE lock.  F
168a0 6f 72 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f  or the SHARED lo
168b0 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20  ck, the PENDING 
168c0 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c  will.  ** be rel
168d0 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  eased..  */.  if
168e0 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
168f0 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20  RED_LOCK .      
16900 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  || (eFileLock==E
16910 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
16920 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
16930 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a  k<PENDING_LOCK).
16940 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 61 69    ){.    int fai
16950 6c 65 64 3b 0a 20 20 20 20 66 61 69 6c 65 64 20  led;.    failed 
16960 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
16970 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
16980 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ile, PENDING_BYT
16990 45 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66  E, 1, 1);.    if
169a0 20 28 66 61 69 6c 65 64 29 20 7b 0a 20 20 20 20   (failed) {.    
169b0 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20    rc = failed;. 
169c0 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
169d0 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  d_lock;.    }.  
169e0 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 63 6f 6e  }.  .  /* If con
169f0 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69  trol gets to thi
16a00 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63  s point, then ac
16a10 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20  tually go ahead 
16a20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70  and make.  ** op
16a30 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63  erating system c
16a40 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65  alls for the spe
16a50 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a  cified lock..  *
16a60 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  /.  if( eFileLoc
16a70 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
16a80 7b 0a 20 20 20 20 69 6e 74 20 6c 72 63 31 2c 20  {.    int lrc1, 
16a90 6c 72 63 32 2c 20 6c 72 63 31 45 72 72 6e 6f 20  lrc2, lrc1Errno 
16aa0 3d 20 30 3b 0a 20 20 20 20 6c 6f 6e 67 20 6c 6b  = 0;.    long lk
16ab0 2c 20 6d 61 73 6b 3b 0a 20 20 20 20 0a 20 20 20  , mask;.    .   
16ac0 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
16ad0 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20  >nShared==0 );. 
16ae0 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
16af0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20  e->eFileLock==0 
16b00 29 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  );.        .    
16b10 6d 61 73 6b 20 3d 20 28 73 69 7a 65 6f 66 28 6c  mask = (sizeof(l
16b20 6f 6e 67 29 3d 3d 38 29 20 3f 20 4c 41 52 47 45  ong)==8) ? LARGE
16b30 53 54 5f 49 4e 54 36 34 20 3a 20 30 78 37 66 66  ST_INT64 : 0x7ff
16b40 66 66 66 66 66 3b 0a 20 20 20 20 2f 2a 20 4e 6f  fffff;.    /* No
16b50 77 20 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c  w get the read-l
16b60 6f 63 6b 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock SHARED_LOCK 
16b70 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74 65 20 74  */.    /* note t
16b80 68 61 74 20 74 68 65 20 71 75 61 6c 69 74 79 20  hat the quality 
16b90 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73  of the randomnes
16ba0 73 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72  s doesn't matter
16bb0 20 74 68 61 74 20 6d 75 63 68 20 2a 2f 0a 20 20   that much */.  
16bc0 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28 29 3b    lk = random();
16bd0 20 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68   .    pInode->sh
16be0 61 72 65 64 42 79 74 65 20 3d 20 28 6c 6b 20 26  aredByte = (lk &
16bf0 20 6d 61 73 6b 29 25 28 53 48 41 52 45 44 5f 53   mask)%(SHARED_S
16c00 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20 6c 72  IZE - 1);.    lr
16c10 63 31 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  c1 = afpSetLock(
16c20 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
16c30 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20   pFile, .       
16c40 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b     SHARED_FIRST+
16c50 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
16c60 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69  te, 1, 1);.    i
16c70 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
16c80 28 6c 72 63 31 29 20 29 7b 0a 20 20 20 20 20 20  (lrc1) ){.      
16c90 6c 72 63 31 45 72 72 6e 6f 20 3d 20 70 46 69 6c  lrc1Errno = pFil
16ca0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  e->lastErrno;.  
16cb0 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20    }.    /* Drop 
16cc0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45  the temporary PE
16cd0 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20  NDING lock */.  
16ce0 20 20 6c 72 63 32 20 3d 20 61 66 70 53 65 74 4c    lrc2 = afpSetL
16cf0 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
16d00 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44  ath, pFile, PEND
16d10 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b  ING_BYTE, 1, 0);
16d20 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 49 53  .    .    if( IS
16d30 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31  _LOCK_ERROR(lrc1
16d40 29 20 29 20 7b 0a 20 20 20 20 20 20 73 74 6f 72  ) ) {.      stor
16d50 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
16d60 2c 20 6c 72 63 31 45 72 72 6e 6f 29 3b 0a 20 20  , lrc1Errno);.  
16d70 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20      rc = lrc1;. 
16d80 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
16d90 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c  d_lock;.    } el
16da0 73 65 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45  se if( IS_LOCK_E
16db0 52 52 4f 52 28 6c 72 63 32 29 20 29 7b 0a 20 20  RROR(lrc2) ){.  
16dc0 20 20 20 20 72 63 20 3d 20 6c 72 63 32 3b 0a 20      rc = lrc2;. 
16dd0 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
16de0 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c  d_lock;.    } el
16df0 73 65 20 69 66 28 20 6c 72 63 31 20 21 3d 20 53  se if( lrc1 != S
16e00 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20  QLITE_OK ) {.   
16e10 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20     rc = lrc1;.  
16e20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
16e30 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
16e40 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
16e50 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  .      pInode->n
16e60 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49  Lock++;.      pI
16e70 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20  node->nShared = 
16e80 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
16e90 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
16ea0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
16eb0 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  & pInode->nShare
16ec0 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65  d>1 ){.    /* We
16ed0 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20   are trying for 
16ee0 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
16ef0 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68  k but another th
16f00 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20  read in this.   
16f10 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73    ** same proces
16f20 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69  s is still holdi
16f30 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  ng a shared lock
16f40 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51  . */.    rc = SQ
16f50 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c  LITE_BUSY;.  }el
16f60 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  se{.    /* The r
16f70 65 71 75 65 73 74 20 77 61 73 20 66 6f 72 20 61  equest was for a
16f80 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
16f90 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74  LUSIVE lock.  It
16fa0 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d   is.    ** assum
16fb0 65 64 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ed that there is
16fc0 20 61 20 53 48 41 52 45 44 20 6f 72 20 67 72 65   a SHARED or gre
16fd0 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ater lock on the
16fe0 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72   file.    ** alr
16ff0 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eady..    */.   
17000 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 30 3b   int failed = 0;
17010 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21 3d  .    assert( 0!=
17020 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
17030 20 29 3b 0a 20 20 20 20 69 66 20 28 65 46 69 6c   );.    if (eFil
17040 65 4c 6f 63 6b 20 3e 3d 20 52 45 53 45 52 56 45  eLock >= RESERVE
17050 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d  D_LOCK && pFile-
17060 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 52 45 53  >eFileLock < RES
17070 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20  ERVED_LOCK) {.  
17080 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65        /* Acquire
17090 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
170a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c   */.        fail
170b0 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  ed = afpSetLock(
170c0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
170d0 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44   pFile, RESERVED
170e0 5f 42 59 54 45 2c 20 31 2c 31 29 3b 0a 20 20 20  _BYTE, 1,1);.   
170f0 20 20 20 69 66 28 20 21 66 61 69 6c 65 64 20 29     if( !failed )
17100 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78  {.        contex
17110 74 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 31 3b  t->reserved = 1;
17120 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
17130 20 20 20 69 66 20 28 21 66 61 69 6c 65 64 20 26     if (!failed &
17140 26 20 65 46 69 6c 65 4c 6f 63 6b 20 3d 3d 20 45  & eFileLock == E
17150 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 7b  XCLUSIVE_LOCK) {
17160 0a 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72  .      /* Acquir
17170 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  e an EXCLUSIVE l
17180 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 0a  ock */.        .
17190 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
171a0 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
171b0 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20 74 68  before trying th
171c0 65 20 72 61 6e 67 65 2e 20 20 77 65 27 6c 6c 20  e range.  we'll 
171d0 6e 65 65 64 20 74 6f 20 0a 20 20 20 20 20 20 2a  need to .      *
171e0 2a 20 72 65 65 73 74 61 62 6c 69 73 68 20 74 68  * reestablish th
171f0 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66  e shared lock if
17200 20 77 65 20 63 61 6e 27 74 20 67 65 74 20 74 68   we can't get th
17210 65 20 20 61 66 70 55 6e 6c 6f 63 6b 0a 20 20 20  e  afpUnlock.   
17220 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
17230 21 28 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65  !(failed = afpSe
17240 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
17250 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48  bPath, pFile, SH
17260 41 52 45 44 5f 46 49 52 53 54 20 2b 0a 20 20 20  ARED_FIRST +.   
17270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17280 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68        pInode->sh
17290 61 72 65 64 42 79 74 65 2c 20 31 2c 20 30 29 29  aredByte, 1, 0))
172a0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
172b0 66 61 69 6c 65 64 32 20 3d 20 53 51 4c 49 54 45  failed2 = SQLITE
172c0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  _OK;.        /* 
172d0 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20 74 6f 20  now attemmpt to 
172e0 67 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76  get the exclusiv
172f0 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f 0a  e lock range */.
17300 20 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d          failed =
17310 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
17320 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
17330 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  le, SHARED_FIRST
17340 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
17350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17360 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 31    SHARED_SIZE, 1
17370 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  );.        if( f
17380 61 69 6c 65 64 20 26 26 20 28 66 61 69 6c 65 64  ailed && (failed
17390 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  2 = afpSetLock(c
173a0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
173b0 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20  pFile, .        
173c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
173d0 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20 70 49  HARED_FIRST + pI
173e0 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65  node->sharedByte
173f0 2c 20 31 2c 20 31 29 29 20 29 7b 0a 20 20 20 20  , 1, 1)) ){.    
17400 20 20 20 20 20 20 2f 2a 20 43 61 6e 27 74 20 72        /* Can't r
17410 65 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73  eestablish the s
17420 68 61 72 65 64 20 6c 6f 63 6b 2e 20 20 53 71 6c  hared lock.  Sql
17430 69 74 65 20 63 61 6e 27 74 20 64 65 61 6c 2c 20  ite can't deal, 
17440 74 68 69 73 20 69 73 0a 20 20 20 20 20 20 20 20  this is.        
17450 20 20 2a 2a 20 61 20 63 72 69 74 69 63 61 6c 20    ** a critical 
17460 49 2f 4f 20 65 72 72 6f 72 0a 20 20 20 20 20 20  I/O error.      
17470 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
17480 20 72 63 20 3d 20 28 28 66 61 69 6c 65 64 20 26   rc = ((failed &
17490 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d   SQLITE_IOERR) =
174a0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20  = SQLITE_IOERR) 
174b0 3f 20 66 61 69 6c 65 64 32 20 3a 20 0a 20 20 20  ? failed2 : .   
174c0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
174d0 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20  TE_IOERR_LOCK;. 
174e0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 66           goto af
174f0 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  p_end_lock;.    
17500 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c      } .      }el
17510 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
17520 20 66 61 69 6c 65 64 3b 20 0a 20 20 20 20 20 20   failed; .      
17530 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
17540 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  failed ){.      
17550 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20  rc = failed;.   
17560 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20   }.  }.  .  if( 
17570 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
17580 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
17590 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
175a0 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65  k;.    pInode->e
175b0 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
175c0 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Lock;.  }else if
175d0 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  ( eFileLock==EXC
175e0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
175f0 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
17600 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ock = PENDING_LO
17610 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  CK;.    pInode->
17620 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44  eFileLock = PEND
17630 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20  ING_LOCK;.  }.  
17640 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20  .afp_end_lock:. 
17650 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
17660 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  );.  OSTRACE(("L
17670 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 20  OCK    %d %s %s 
17680 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
17690 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65  >h, azFileLock(e
176a0 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20  FileLock), .    
176b0 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
176c0 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
176d0 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e  led"));.  return
176e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
176f0 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
17700 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
17710 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
17720 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
17730 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
17740 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
17750 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
17760 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
17770 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
17780 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
17790 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
177a0 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
177b0 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
177c0 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
177d0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
177e0 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
177f0 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73 71 6c 69  t afpUnlock(sqli
17800 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
17810 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
17820 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
17830 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
17840 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
17850 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e  le*)id;.  unixIn
17860 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b  odeInfo *pInode;
17870 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  .  afpLockingCon
17880 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20  text *context = 
17890 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
178a0 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63  xt *) pFile->loc
178b0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69  kingContext;.  i
178c0 6e 74 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20  nt skipShared = 
178d0 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
178e0 5f 54 45 53 54 0a 20 20 69 6e 74 20 68 20 3d 20  _TEST.  int h = 
178f0 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64 69 66  pFile->h;.#endif
17900 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
17910 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
17920 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
17930 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69 64  as %d(%d,%d) pid
17940 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46  =%d (afp)\n", pF
17950 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63  ile->h, eFileLoc
17960 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  k,.           pF
17970 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20  ile->eFileLock, 
17980 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65  pFile->pInode->e
17990 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d  FileLock, pFile-
179a0 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64  >pInode->nShared
179b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
179c0 65 74 70 69 64 28 30 29 29 29 3b 0a 0a 20 20 61  etpid(0)));..  a
179d0 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
179e0 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
179f0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
17a00 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f  ileLock<=eFileLo
17a10 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
17a20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
17a30 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
17a40 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  ();.  pInode = p
17a50 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
17a60 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
17a70 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20  nShared!=0 );.  
17a80 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
17a90 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
17aa0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
17ab0 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
17ac0 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  k==pFile->eFileL
17ad0 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75 6c  ock );.    Simul
17ae0 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
17af0 28 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  (1);.    Simulat
17b00 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29  eIOError( h=(-1)
17b10 20 29 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49   ).    SimulateI
17b20 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
17b30 0a 20 20 20 20 0a 23 69 66 64 65 66 20 53 51 4c  .    .#ifdef SQL
17b40 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a  ITE_DEBUG.    /*
17b50 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61   When reducing a
17b60 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20   lock such that 
17b70 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
17b80 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a  can start.    **
17b90 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74   reading the dat
17ba0 61 62 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e  abase file again
17bb0 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  , make sure that
17bc0 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
17bd0 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
17be0 77 61 73 20 75 70 64 61 74 65 64 20 69 66 20 61  was updated if a
17bf0 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  ny part of the d
17c00 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66  atabase.    ** f
17c10 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66  ile changed.  If
17c20 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
17c30 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20   counter is not 
17c40 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20  updated,.    ** 
17c50 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
17c60 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69  s to the same fi
17c70 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61  le might not rea
17c80 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  lize that.    **
17c90 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 63 68   the file has ch
17ca0 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20  anged and hence 
17cb0 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74  might not know t
17cc0 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20  o flush their.  
17cd0 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65    ** cache.  The
17ce0 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20   use of a stale 
17cf0 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74  cache can lead t
17d00 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  o database corru
17d10 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ption..    */.  
17d20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
17d30 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d 3d  >inNormalWrite==
17d40 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  0.           || 
17d50 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 3d  pFile->dbUpdate=
17d60 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  =0.           ||
17d70 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74   pFile->transCnt
17d80 72 43 68 6e 67 3d 3d 31 20 29 3b 0a 20 20 20 20  rChng==1 );.    
17d90 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
17da0 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  rite = 0;.#endif
17db0 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 70 46  .    .    if( pF
17dc0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
17dd0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
17de0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66 70  {.      rc = afp
17df0 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
17e00 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
17e10 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 53 48  SHARED_FIRST, SH
17e20 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20  ARED_SIZE, 0);. 
17e30 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
17e40 49 54 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65  ITE_OK && (eFile
17e50 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
17e60 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  K || pInode->nSh
17e70 61 72 65 64 3e 31 29 20 29 7b 0a 20 20 20 20 20  ared>1) ){.     
17e80 20 20 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d 65 73     /* only re-es
17e90 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72  tablish the shar
17ea0 65 64 20 6c 6f 63 6b 20 69 66 20 6e 65 63 65 73  ed lock if neces
17eb0 73 61 72 79 20 2a 2f 0a 20 20 20 20 20 20 20 20  sary */.        
17ec0 69 6e 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79  int sharedLockBy
17ed0 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  te = SHARED_FIRS
17ee0 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64  T+pInode->shared
17ef0 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 72 63  Byte;.        rc
17f00 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
17f10 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
17f20 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b  File, sharedLock
17f30 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  Byte, 1, 1);.   
17f40 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
17f50 20 20 20 20 73 6b 69 70 53 68 61 72 65 64 20 3d      skipShared =
17f60 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
17f70 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
17f80 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65  LITE_OK && pFile
17f90 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e  ->eFileLock>=PEN
17fa0 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  DING_LOCK ){.   
17fb0 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f     rc = afpSetLo
17fc0 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
17fd0 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49  th, pFile, PENDI
17fe0 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a  NG_BYTE, 1, 0);.
17ff0 20 20 20 20 7d 20 0a 20 20 20 20 69 66 28 20 72      } .    if( r
18000 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
18010 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
18020 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
18030 26 26 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65  && context->rese
18040 72 76 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63  rved ){.      rc
18050 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
18060 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
18070 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42  File, RESERVED_B
18080 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  YTE, 1, 0);.    
18090 20 20 69 66 28 20 21 72 63 20 29 7b 20 0a 20 20    if( !rc ){ .  
180a0 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72        context->r
180b0 65 73 65 72 76 65 64 20 3d 20 30 3b 20 0a 20 20  eserved = 0; .  
180c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
180d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
180e0 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d  K && (eFileLock=
180f0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
18100 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e  pInode->nShared>
18110 31 29 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64  1)){.      pInod
18120 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
18130 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
18140 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  }.  }.  if( rc==
18150 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 46 69  SQLITE_OK && eFi
18160 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  leLock==NO_LOCK 
18170 29 7b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65  ){..    /* Decre
18180 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64 20  ment the shared 
18190 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52  lock counter.  R
181a0 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20  elease the lock 
181b0 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20  using an.    ** 
181c0 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65  OS call only whe
181d0 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e  n all threads in
181e0 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65   this same proce
181f0 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65 64  ss have released
18200 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b  .    ** the lock
18210 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 73  ..    */.    uns
18220 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
18230 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d  sharedLockByte =
18240 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49   SHARED_FIRST+pI
18250 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65  node->sharedByte
18260 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53  ;.    pInode->nS
18270 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28  hared--;.    if(
18280 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
18290 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 69 6d  ==0 ){.      Sim
182a0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
182b0 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 53 69 6d  gn(1);.      Sim
182c0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d  ulateIOError( h=
182d0 28 2d 31 29 20 29 0a 20 20 20 20 20 20 53 69 6d  (-1) ).      Sim
182e0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
182f0 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28  gn(0);.      if(
18300 20 21 73 6b 69 70 53 68 61 72 65 64 20 29 7b 0a   !skipShared ){.
18310 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 66 70          rc = afp
18320 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
18330 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
18340 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20  sharedLockByte, 
18350 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  1, 0);.      }. 
18360 20 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a       if( !rc ){.
18370 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
18380 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
18390 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69  OCK;.        pFi
183a0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
183b0 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d  NO_LOCK;.      }
183c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
183d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
183e0 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c        pInode->nL
183f0 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20 20 61 73 73  ock--;.      ass
18400 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  ert( pInode->nLo
18410 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ck>=0 );.      i
18420 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  f( pInode->nLock
18430 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==0 ){.        c
18440 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70  losePendingFds(p
18450 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  File);.      }. 
18460 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e     }.  }.  .  un
18470 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
18480 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18490 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46 69  _OK ) pFile->eFi
184a0 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
184b0 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ck;.  return rc;
184c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
184d0 61 20 66 69 6c 65 20 26 20 63 6c 65 61 6e 75 70  a file & cleanup
184e0 20 41 46 50 20 73 70 65 63 69 66 69 63 20 6c 6f   AFP specific lo
184f0 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 0a 2a  cking context .*
18500 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
18510 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
18520 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20  le *id) {.  int 
18530 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
18540 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
18550 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
18560 64 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  d;.  assert( id!
18570 3d 30 20 29 3b 0a 20 20 61 66 70 55 6e 6c 6f 63  =0 );.  afpUnloc
18580 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
18590 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
185a0 28 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  ();.  if( pFile-
185b0 3e 70 49 6e 6f 64 65 20 26 26 20 70 46 69 6c 65  >pInode && pFile
185c0 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20  ->pInode->nLock 
185d0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
185e0 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
185f0 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74  ng locks, do not
18600 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20   actually close 
18610 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20  the file just.  
18620 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65    ** yet because
18630 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61   that would clea
18640 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20  r those locks.  
18650 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68 65  Instead, add the
18660 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73   file.    ** des
18670 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64  criptor to pInod
18680 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74  e->aPending.  It
18690 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
186a0 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68  ically closed wh
186b0 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 61  en.    ** the la
186c0 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72  st lock is clear
186d0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
186e0 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c  etPendingFd(pFil
186f0 65 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73  e);.  }.  releas
18700 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65  eInodeInfo(pFile
18710 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
18720 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  e(pFile->locking
18730 43 6f 6e 74 65 78 74 29 3b 0a 20 20 72 63 20 3d  Context);.  rc =
18740 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
18750 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  d);.  unixLeaveM
18760 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e  utex();.  return
18770 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f   rc;.}..#endif /
18780 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  * defined(__APPL
18790 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
187a0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
187b0 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65  YLE */./*.** The
187c0 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74   code above is t
187d0 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c  he AFP lock impl
187e0 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65  ementation.  The
187f0 20 63 6f 64 65 20 69 73 20 73 70 65 63 69 66 69   code is specifi
18800 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61  c.** to MacOSX a
18810 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  nd does not work
18820 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70   on other unix p
18830 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c  latforms.  No al
18840 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20  ternative.** is 
18850 61 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 79  available.  If y
18860 6f 75 20 64 6f 6e 27 74 20 63 6f 6d 70 69 6c 65  ou don't compile
18870 20 66 6f 72 20 61 20 6d 61 63 2c 20 74 68 65 6e   for a mac, then
18880 20 74 68 65 20 22 75 6e 69 78 2d 61 66 70 22 0a   the "unix-afp".
18890 2a 2a 20 56 46 53 20 69 73 20 6e 6f 74 20 61 76  ** VFS is not av
188a0 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ailable..**.****
188b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
188c0 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 41 46 50  * End of the AFP
188d0 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
188e0 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
188f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
18900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18920 2a 2a 2a 2a 2a 2a 2a 2a 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 2f 0a 0a 2f 2a 2a  **********/../**
18950 2a 2a 2a 2a 2a 2a 2a 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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
189a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
189b0 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e  ******** Begin N
189c0 46 53 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  FS Locking *****
189d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
189e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69  ***********/..#i
189f0 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
18a00 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
18a10 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
18a20 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72  YLE./*. ** Lower
18a30 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
18a40 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
18a50 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65  iptor pFile to e
18a60 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65  FileLock.  eFile
18a70 4c 6f 63 6b 0a 20 2a 2a 20 6d 75 73 74 20 62 65  Lock. ** must be
18a80 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
18a90 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
18aa0 20 2a 2a 0a 20 2a 2a 20 49 66 20 74 68 65 20 6c   **. ** If the l
18ab0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
18ac0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
18ad0 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
18ae0 74 20 6f 72 20 62 65 6c 6f 77 0a 20 2a 2a 20 74  t or below. ** t
18af0 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
18b00 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
18b10 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
18b20 2d 6f 70 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  -op.. */.static 
18b30 69 6e 74 20 6e 66 73 55 6e 6c 6f 63 6b 28 73 71  int nfsUnlock(sq
18b40 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
18b50 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a  int eFileLock){.
18b60 20 20 72 65 74 75 72 6e 20 70 6f 73 69 78 55 6e    return posixUn
18b70 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f  lock(id, eFileLo
18b80 63 6b 2c 20 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69  ck, 1);.}..#endi
18b90 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41  f /* defined(__A
18ba0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
18bb0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
18bc0 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20  _STYLE */./*.** 
18bd0 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69  The code above i
18be0 73 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69  s the NFS lock i
18bf0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20  mplementation.  
18c00 54 68 65 20 63 6f 64 65 20 69 73 20 73 70 65 63  The code is spec
18c10 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53  ific.** to MacOS
18c20 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77  X and does not w
18c30 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69  ork on other uni
18c40 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f  x platforms.  No
18c50 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20   alternative.** 
18c60 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 0a  is available.  .
18c70 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
18c80 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
18c90 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70  the NFS lock imp
18ca0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
18cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18cc0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
18cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 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 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
18d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18d60 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
18d70 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67  **** Non-locking
18d80 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65   sqlite3_file me
18d90 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  thods **********
18da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18db0 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  ***.**.** The ne
18dc0 78 74 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74  xt division cont
18dd0 61 69 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74  ains implementat
18de0 69 6f 6e 73 20 66 6f 72 20 61 6c 6c 20 6d 65 74  ions for all met
18df0 68 6f 64 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20  hods of the .** 
18e00 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62 6a  sqlite3_file obj
18e10 65 63 74 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ect other than t
18e20 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  he locking metho
18e30 64 73 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  ds.  The locking
18e40 0a 2a 2a 20 6d 65 74 68 6f 64 73 20 77 65 72 65  .** methods were
18e50 20 64 65 66 69 6e 65 64 20 69 6e 20 64 69 76 69   defined in divi
18e60 73 69 6f 6e 73 20 61 62 6f 76 65 20 28 6f 6e 65  sions above (one
18e70 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20   locking method 
18e80 70 65 72 0a 2a 2a 20 64 69 76 69 73 69 6f 6e 29  per.** division)
18e90 2e 20 20 54 68 6f 73 65 20 6d 65 74 68 6f 64 73  .  Those methods
18ea0 20 74 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e   that are common
18eb0 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20   to all locking 
18ec0 6d 6f 64 65 73 0a 2a 2a 20 61 72 65 20 67 61 74  modes.** are gat
18ed0 68 65 72 20 74 6f 67 65 74 68 65 72 20 69 6e 74  her together int
18ee0 6f 20 74 68 69 73 20 64 69 76 69 73 69 6f 6e 2e  o this division.
18ef0 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20  .*/../*.** Seek 
18f00 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 70 61  to the offset pa
18f10 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
18f20 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 65  nd argument, the
18f30 6e 20 72 65 61 64 20 63 6e 74 20 0a 2a 2a 20 62  n read cnt .** b
18f40 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 20  ytes into pBuf. 
18f50 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
18f60 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61  r of bytes actua
18f70 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  lly read..**.** 
18f80 4e 42 3a 20 20 49 66 20 79 6f 75 20 64 65 66 69  NB:  If you defi
18f90 6e 65 20 55 53 45 5f 50 52 45 41 44 20 6f 72 20  ne USE_PREAD or 
18fa0 55 53 45 5f 50 52 45 41 44 36 34 2c 20 74 68 65  USE_PREAD64, the
18fb0 6e 20 69 74 20 6d 69 67 68 74 20 61 6c 73 6f 0a  n it might also.
18fc0 2a 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79 20  ** be necessary 
18fd0 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e  to define _XOPEN
18fe0 5f 53 4f 55 52 43 45 20 74 6f 20 62 65 20 35 30  _SOURCE to be 50
18ff0 30 2e 20 20 54 68 69 73 20 76 61 72 69 65 73 20  0.  This varies 
19000 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73 74  from.** one syst
19010 65 6d 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20  em to another.  
19020 53 69 6e 63 65 20 53 51 4c 69 74 65 20 64 6f 65  Since SQLite doe
19030 73 20 6e 6f 74 20 64 65 66 69 6e 65 20 55 53 45  s not define USE
19040 5f 50 52 45 41 44 0a 2a 2a 20 69 6e 20 61 6e 79  _PREAD.** in any
19050 20 66 6f 72 6d 20 62 79 20 64 65 66 61 75 6c 74   form by default
19060 2c 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74  , we will not at
19070 74 65 6d 70 74 20 74 6f 20 64 65 66 69 6e 65 20  tempt to define 
19080 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a  _XOPEN_SOURCE..*
19090 2a 20 53 65 65 20 74 69 63 6b 65 74 73 20 23 32  * See tickets #2
190a0 37 34 31 20 61 6e 64 20 23 32 36 38 31 2e 0a 2a  741 and #2681..*
190b0 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74  *.** To avoid st
190c0 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f  omping the errno
190d0 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c   value on a fail
190e0 65 64 20 72 65 61 64 20 74 68 65 20 6c 61 73 74  ed read the last
190f0 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69  Errno value.** i
19100 73 20 73 65 74 20 62 65 66 6f 72 65 20 72 65 74  s set before ret
19110 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
19120 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 52 65 61  c int seekAndRea
19130 64 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20  d(unixFile *id, 
19140 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
19150 66 73 65 74 2c 20 76 6f 69 64 20 2a 70 42 75 66  fset, void *pBuf
19160 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e  , int cnt){.  in
19170 74 20 67 6f 74 3b 0a 20 20 69 6e 74 20 70 72 69  t got;.  int pri
19180 6f 72 20 3d 20 30 3b 0a 23 69 66 20 28 21 64 65  or = 0;.#if (!de
19190 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
191a0 20 26 26 20 21 64 65 66 69 6e 65 64 28 55 53 45   && !defined(USE
191b0 5f 50 52 45 41 44 36 34 29 29 0a 20 20 69 36 34  _PREAD64)).  i64
191c0 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64   newOffset;.#end
191d0 69 66 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54  if.  TIMER_START
191e0 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d  ;.  assert( cnt=
191f0 3d 28 63 6e 74 26 30 78 31 66 66 66 66 29 20 29  =(cnt&0x1ffff) )
19200 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 2d 3e  ;.  assert( id->
19210 68 3e 32 20 29 3b 0a 20 20 64 6f 7b 0a 23 69 66  h>2 );.  do{.#if
19220 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
19230 41 44 29 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73  AD).    got = os
19240 50 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75  Pread(id->h, pBu
19250 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b  f, cnt, offset);
19260 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
19270 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29  rror( got = -1 )
19280 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
19290 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 20  USE_PREAD64).   
192a0 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64 36 34   got = osPread64
192b0 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
192c0 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  t, offset);.    
192d0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
192e0 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c   got = -1 );.#el
192f0 73 65 0a 20 20 20 20 6e 65 77 4f 66 66 73 65 74  se.    newOffset
19300 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20   = lseek(id->h, 
19310 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54  offset, SEEK_SET
19320 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
19330 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66 73 65  OError( newOffse
19340 74 20 3d 20 2d 31 20 29 3b 0a 20 20 20 20 69 66  t = -1 );.    if
19350 28 20 6e 65 77 4f 66 66 73 65 74 3c 30 20 29 7b  ( newOffset<0 ){
19360 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
19370 45 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65 2a  Errno((unixFile*
19380 29 69 64 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  )id, errno);.   
19390 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
193a0 20 20 7d 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73    }.    got = os
193b0 52 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66  Read(id->h, pBuf
193c0 2c 20 63 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20  , cnt);.#endif. 
193d0 20 20 20 69 66 28 20 67 6f 74 3d 3d 63 6e 74 20     if( got==cnt 
193e0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
193f0 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 20 20   got<0 ){.      
19400 69 66 28 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52  if( errno==EINTR
19410 20 29 7b 20 67 6f 74 20 3d 20 31 3b 20 63 6f 6e   ){ got = 1; con
19420 74 69 6e 75 65 3b 20 7d 0a 20 20 20 20 20 20 70  tinue; }.      p
19430 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
19440 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 28  storeLastErrno((
19450 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 20 65  unixFile*)id,  e
19460 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 62 72 65  rrno);.      bre
19470 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ak;.    }else if
19480 28 20 67 6f 74 3e 30 20 29 7b 0a 20 20 20 20 20  ( got>0 ){.     
19490 20 63 6e 74 20 2d 3d 20 67 6f 74 3b 0a 20 20 20   cnt -= got;.   
194a0 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 67 6f 74     offset += got
194b0 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 20 2b 3d  ;.      prior +=
194c0 20 67 6f 74 3b 0a 20 20 20 20 20 20 70 42 75 66   got;.      pBuf
194d0 20 3d 20 28 76 6f 69 64 2a 29 28 67 6f 74 20 2b   = (void*)(got +
194e0 20 28 63 68 61 72 2a 29 70 42 75 66 29 3b 0a 20   (char*)pBuf);. 
194f0 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 67     }.  }while( g
19500 6f 74 3e 30 20 29 3b 0a 20 20 54 49 4d 45 52 5f  ot>0 );.  TIMER_
19510 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  END;.  OSTRACE((
19520 22 52 45 41 44 20 20 20 20 25 2d 33 64 20 25 35  "READ    %-3d %5
19530 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c  d %7lld %llu\n",
19540 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 64 2d  .            id-
19550 3e 68 2c 20 67 6f 74 2b 70 72 69 6f 72 2c 20 6f  >h, got+prior, o
19560 66 66 73 65 74 2d 70 72 69 6f 72 2c 20 54 49 4d  ffset-prior, TIM
19570 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 20 20  ER_ELAPSED));.  
19580 72 65 74 75 72 6e 20 67 6f 74 2b 70 72 69 6f 72  return got+prior
19590 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
195a0 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65  data from a file
195b0 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20   into a buffer. 
195c0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
195d0 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65  K if all.** byte
195e0 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63  s were read succ
195f0 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c  essfully and SQL
19600 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79  ITE_IOERR if any
19610 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
19620 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
19630 6e 74 20 75 6e 69 78 52 65 61 64 28 0a 20 20 73  nt unixRead(.  s
19640 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
19650 20 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20   .  void *pBuf, 
19660 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71  .  int amt,.  sq
19670 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
19680 65 74 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  et.){.  unixFile
19690 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
196a0 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20  ile *)id;.  int 
196b0 67 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20 69  got;.  assert( i
196c0 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  d );.  assert( o
196d0 66 66 73 65 74 3e 3d 30 20 29 3b 0a 20 20 61 73  ffset>=0 );.  as
196e0 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 0a  sert( amt>0 );..
196f0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
19700 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
19710 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20  (not a journal, 
19720 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f  master-journal o
19730 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65  r temp.  ** file
19740 29 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e 20  ), the bytes in 
19750 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67  the locking rang
19760 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62  e should never b
19770 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
19780 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73  n. */.#if 0.  as
19790 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e  sert( pFile->pUn
197a0 75 73 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c  used==0.       |
197b0 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e  | offset>=PENDIN
197c0 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20  G_BYTE+512.     
197d0 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c    || offset+amt<
197e0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20  =PENDING_BYTE . 
197f0 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20   );.#endif..#if 
19800 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
19810 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c  SIZE>0.  /* Deal
19820 20 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f 66   with as much of
19830 20 74 68 69 73 20 72 65 61 64 20 72 65 71 75 65   this read reque
19840 73 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62  st as possible b
19850 79 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20  y transfering.  
19860 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ** data from the
19870 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20   memory mapping 
19880 75 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20  using memcpy(). 
19890 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74   */.  if( offset
198a0 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65  <pFile->mmapSize
198b0 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73   ){.    if( offs
198c0 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d  et+amt <= pFile-
198d0 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20  >mmapSize ){.   
198e0 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20     memcpy(pBuf, 
198f0 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e  &((u8 *)(pFile->
19900 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66  pMapRegion))[off
19910 73 65 74 5d 2c 20 61 6d 74 29 3b 0a 20 20 20 20  set], amt);.    
19920 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19930 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OK;.    }else{. 
19940 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d       int nCopy =
19950 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
19960 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20   - offset;.     
19970 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26 28   memcpy(pBuf, &(
19980 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d  (u8 *)(pFile->pM
19990 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65  apRegion))[offse
199a0 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20  t], nCopy);.    
199b0 20 20 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a    pBuf = &((u8 *
199c0 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20  )pBuf)[nCopy];. 
199d0 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70       amt -= nCop
199e0 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20  y;.      offset 
199f0 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a  += nCopy;.    }.
19a00 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 67 6f    }.#endif..  go
19a10 74 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28  t = seekAndRead(
19a20 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70  pFile, offset, p
19a30 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 69 66 28  Buf, amt);.  if(
19a40 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20 20 20   got==amt ){.   
19a50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19a60 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 67  K;.  }else if( g
19a70 6f 74 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6c  ot<0 ){.    /* l
19a80 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20  astErrno set by 
19a90 73 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20  seekAndRead */. 
19aa0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
19ab0 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20 7d  _IOERR_READ;.  }
19ac0 65 6c 73 65 7b 0a 20 20 20 20 73 74 6f 72 65 4c  else{.    storeL
19ad0 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
19ae0 30 29 3b 20 20 20 2f 2a 20 6e 6f 74 20 61 20 73  0);   /* not a s
19af0 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20  ystem error */. 
19b00 20 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72     /* Unread par
19b10 74 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  ts of the buffer
19b20 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69   must be zero-fi
19b30 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  lled */.    mems
19b40 65 74 28 26 28 28 63 68 61 72 2a 29 70 42 75 66  et(&((char*)pBuf
19b50 29 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67  )[got], 0, amt-g
19b60 6f 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ot);.    return 
19b70 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
19b80 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a  RT_READ;.  }.}..
19b90 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
19ba0 20 73 65 65 6b 20 74 68 65 20 66 69 6c 65 2d 64   seek the file-d
19bb0 65 73 63 72 69 70 74 6f 72 20 70 61 73 73 65 64  escriptor passed
19bc0 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
19bd0 67 75 6d 65 6e 74 20 74 6f 0a 2a 2a 20 61 62 73  gument to.** abs
19be0 6f 6c 75 74 65 20 6f 66 66 73 65 74 20 69 4f 66  olute offset iOf
19bf0 66 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74 20  f, then attempt 
19c00 74 6f 20 77 72 69 74 65 20 6e 42 75 66 20 62 79  to write nBuf by
19c10 74 65 73 20 6f 66 20 64 61 74 61 20 66 72 6f 6d  tes of data from
19c20 0a 2a 2a 20 70 42 75 66 20 74 6f 20 69 74 2e 20  .** pBuf to it. 
19c30 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
19c40 72 73 2c 20 72 65 74 75 72 6e 20 2d 31 20 61 6e  rs, return -1 an
19c50 64 20 73 65 74 20 2a 70 69 45 72 72 6e 6f 2e 20  d set *piErrno. 
19c60 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 72  Otherwise, .** r
19c70 65 74 75 72 6e 20 74 68 65 20 61 63 74 75 61 6c  eturn the actual
19c80 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
19c90 20 77 72 69 74 74 65 6e 20 28 77 68 69 63 68 20   written (which 
19ca0 6d 61 79 20 62 65 20 6c 65 73 73 20 74 68 61 6e  may be less than
19cb0 0a 2a 2a 20 6e 42 75 66 29 2e 0a 2a 2f 0a 73 74  .** nBuf)..*/.st
19cc0 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64  atic int seekAnd
19cd0 57 72 69 74 65 46 64 28 0a 20 20 69 6e 74 20 66  WriteFd(.  int f
19ce0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
19cf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
19d00 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  le descriptor to
19d10 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69   write to */.  i
19d20 36 34 20 69 4f 66 66 2c 20 20 20 20 20 20 20 20  64 iOff,        
19d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19d40 2a 20 46 69 6c 65 20 6f 66 66 73 65 74 20 74 6f  * File offset to
19d50 20 62 65 67 69 6e 20 77 72 69 74 69 6e 67 20 61   begin writing a
19d60 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  t */.  const voi
19d70 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
19d80 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 64         /* Copy d
19d90 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20 62 75  ata from this bu
19da0 66 66 65 72 20 74 6f 20 74 68 65 20 66 69 6c 65  ffer to the file
19db0 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 75 66 2c 20   */.  int nBuf, 
19dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19dd0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
19de0 20 62 75 66 66 65 72 20 70 42 75 66 20 69 6e 20   buffer pBuf in 
19df0 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  bytes */.  int *
19e00 70 69 45 72 72 6e 6f 20 20 20 20 20 20 20 20 20  piErrno         
19e10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
19e20 54 3a 20 45 72 72 6f 72 20 6e 75 6d 62 65 72 20  T: Error number 
19e30 69 66 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  if error occurs 
19e40 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
19e50 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
19e60 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
19e70 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 79 73   returned by sys
19e80 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20 61  tem call */..  a
19e90 73 73 65 72 74 28 20 6e 42 75 66 3d 3d 28 6e 42  ssert( nBuf==(nB
19ea0 75 66 26 30 78 31 66 66 66 66 29 20 29 3b 0a 20  uf&0x1ffff) );. 
19eb0 20 61 73 73 65 72 74 28 20 66 64 3e 32 20 29 3b   assert( fd>2 );
19ec0 0a 20 20 61 73 73 65 72 74 28 20 70 69 45 72 72  .  assert( piErr
19ed0 6e 6f 21 3d 30 20 29 3b 0a 20 20 6e 42 75 66 20  no!=0 );.  nBuf 
19ee0 26 3d 20 30 78 31 66 66 66 66 3b 0a 20 20 54 49  &= 0x1ffff;.  TI
19ef0 4d 45 52 5f 53 54 41 52 54 3b 0a 0a 23 69 66 20  MER_START;..#if 
19f00 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
19f10 44 29 0a 20 20 64 6f 7b 20 72 63 20 3d 20 28 69  D).  do{ rc = (i
19f20 6e 74 29 6f 73 50 77 72 69 74 65 28 66 64 2c 20  nt)osPwrite(fd, 
19f30 70 42 75 66 2c 20 6e 42 75 66 2c 20 69 4f 66 66  pBuf, nBuf, iOff
19f40 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20  ); }while( rc<0 
19f50 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  && errno==EINTR 
19f60 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  );.#elif defined
19f70 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20  (USE_PREAD64).  
19f80 64 6f 7b 20 72 63 20 3d 20 28 69 6e 74 29 6f 73  do{ rc = (int)os
19f90 50 77 72 69 74 65 36 34 28 66 64 2c 20 70 42 75  Pwrite64(fd, pBu
19fa0 66 2c 20 6e 42 75 66 2c 20 69 4f 66 66 29 3b 7d  f, nBuf, iOff);}
19fb0 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
19fc0 72 72 6e 6f 3d 3d 45 49 4e 54 52 29 3b 0a 23 65  rrno==EINTR);.#e
19fd0 6c 73 65 0a 20 20 64 6f 7b 0a 20 20 20 20 69 36  lse.  do{.    i6
19fe0 34 20 69 53 65 65 6b 20 3d 20 6c 73 65 65 6b 28  4 iSeek = lseek(
19ff0 66 64 2c 20 69 4f 66 66 2c 20 53 45 45 4b 5f 53  fd, iOff, SEEK_S
1a000 45 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  ET);.    Simulat
1a010 65 49 4f 45 72 72 6f 72 28 20 69 53 65 65 6b 20  eIOError( iSeek 
1a020 3d 20 2d 31 20 29 3b 0a 20 20 20 20 69 66 28 20  = -1 );.    if( 
1a030 69 53 65 65 6b 3c 30 20 29 7b 0a 20 20 20 20 20  iSeek<0 ){.     
1a040 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
1a050 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1a060 20 72 63 20 3d 20 6f 73 57 72 69 74 65 28 66 64   rc = osWrite(fd
1a070 2c 20 70 42 75 66 2c 20 6e 42 75 66 29 3b 0a 20  , pBuf, nBuf);. 
1a080 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26   }while( rc<0 &&
1a090 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
1a0a0 0a 23 65 6e 64 69 66 0a 0a 20 20 54 49 4d 45 52  .#endif..  TIMER
1a0b0 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 28  _END;.  OSTRACE(
1a0c0 28 22 57 52 49 54 45 20 20 20 25 2d 33 64 20 25  ("WRITE   %-3d %
1a0d0 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22  5d %7lld %llu\n"
1a0e0 2c 20 66 64 2c 20 72 63 2c 20 69 4f 66 66 2c 20  , fd, rc, iOff, 
1a0f0 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b  TIMER_ELAPSED));
1a100 0a 0a 20 20 69 66 28 20 72 63 3c 30 20 29 20 2a  ..  if( rc<0 ) *
1a110 70 69 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  piErrno = errno;
1a120 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1a130 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20  ../*.** Seek to 
1a140 74 68 65 20 6f 66 66 73 65 74 20 69 6e 20 69 64  the offset in id
1a150 2d 3e 6f 66 66 73 65 74 20 74 68 65 6e 20 72 65  ->offset then re
1a160 61 64 20 63 6e 74 20 62 79 74 65 73 20 69 6e 74  ad cnt bytes int
1a170 6f 20 70 42 75 66 2e 0a 2a 2a 20 52 65 74 75 72  o pBuf..** Retur
1a180 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
1a190 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72  bytes actually r
1a1a0 65 61 64 2e 20 20 55 70 64 61 74 65 20 74 68 65  ead.  Update the
1a1b0 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54   offset..**.** T
1a1c0 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67  o avoid stomping
1a1d0 20 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65   the errno value
1a1e0 20 6f 6e 20 61 20 66 61 69 6c 65 64 20 77 72 69   on a failed wri
1a1f0 74 65 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f  te the lastErrno
1a200 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
1a210 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
1a220 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
1a230 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 75 6e   seekAndWrite(un
1a240 69 78 46 69 6c 65 20 2a 69 64 2c 20 69 36 34 20  ixFile *id, i64 
1a250 6f 66 66 73 65 74 2c 20 63 6f 6e 73 74 20 76 6f  offset, const vo
1a260 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e  id *pBuf, int cn
1a270 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 65 65  t){.  return see
1a280 6b 41 6e 64 57 72 69 74 65 46 64 28 69 64 2d 3e  kAndWriteFd(id->
1a290 68 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c  h, offset, pBuf,
1a2a0 20 63 6e 74 2c 20 26 69 64 2d 3e 6c 61 73 74 45   cnt, &id->lastE
1a2b0 72 72 6e 6f 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rrno);.}.../*.**
1a2c0 20 57 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d   Write data from
1a2d0 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61   a buffer into a
1a2e0 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53   file.  Return S
1a2f0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
1a300 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f  ess.** or some o
1a310 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
1a320 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73  on failure..*/.s
1a330 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 57 72  tatic int unixWr
1a340 69 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ite(.  sqlite3_f
1a350 69 6c 65 20 2a 69 64 2c 20 0a 20 20 63 6f 6e 73  ile *id, .  cons
1a360 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20  t void *pBuf, . 
1a370 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69   int amt,.  sqli
1a380 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74  te3_int64 offset
1a390 20 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20   .){.  unixFile 
1a3a0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
1a3b0 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 77 72  le*)id;.  int wr
1a3c0 6f 74 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  ote = 0;.  asser
1a3d0 74 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65 72  t( id );.  asser
1a3e0 74 28 20 61 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f  t( amt>0 );..  /
1a3f0 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 64  * If this is a d
1a400 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f  atabase file (no
1a410 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73  t a journal, mas
1a420 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74  ter-journal or t
1a430 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20  emp.  ** file), 
1a440 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65  the bytes in the
1a450 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 73   locking range s
1a460 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20 72  hould never be r
1a470 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20  ead or written. 
1a480 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72  */.#if 0.  asser
1a490 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65  t( pFile->pUnuse
1a4a0 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f  d==0.       || o
1a4b0 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42  ffset>=PENDING_B
1a4c0 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20 7c  YTE+512.       |
1a4d0 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45  | offset+amt<=PE
1a4e0 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b  NDING_BYTE .  );
1a4f0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
1a500 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
1a510 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e  * If we are doin
1a520 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65  g a normal write
1a530 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 66   to a database f
1a540 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64 20  ile (as opposed 
1a550 74 6f 0a 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20  to.  ** doing a 
1a560 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
1a570 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20  back or a write 
1a580 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68  to some file oth
1a590 65 72 20 74 68 61 6e 20 61 0a 20 20 2a 2a 20 6e  er than a.  ** n
1a5a0 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20 66  ormal database f
1a5b0 69 6c 65 29 20 74 68 65 6e 20 72 65 63 6f 72 64  ile) then record
1a5c0 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
1a5d0 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  he database.  **
1a5e0 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20 49   has changed.  I
1a5f0 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
1a600 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6d 6f 64  n counter is mod
1a610 69 66 69 65 64 2c 20 72 65 63 6f 72 64 20 74 68  ified, record th
1a620 61 74 0a 20 20 2a 2a 20 66 61 63 74 20 74 6f 6f  at.  ** fact too
1a630 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
1a640 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
1a650 65 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  e ){.    pFile->
1a660 64 62 55 70 64 61 74 65 20 3d 20 31 3b 20 20 2f  dbUpdate = 1;  /
1a670 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 68  * The database h
1a680 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
1a690 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 66 66 73   */.    if( offs
1a6a0 65 74 3c 3d 32 34 20 26 26 20 6f 66 66 73 65 74  et<=24 && offset
1a6b0 2b 61 6d 74 3e 3d 32 37 20 29 7b 0a 20 20 20 20  +amt>=27 ){.    
1a6c0 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20    int rc;.      
1a6d0 63 68 61 72 20 6f 6c 64 43 6e 74 72 5b 34 5d 3b  char oldCntr[4];
1a6e0 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
1a6f0 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
1a700 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 65 6b  .      rc = seek
1a710 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20 32  AndRead(pFile, 2
1a720 34 2c 20 6f 6c 64 43 6e 74 72 2c 20 34 29 3b 0a  4, oldCntr, 4);.
1a730 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1a740 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
1a750 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 34 20        if( rc!=4 
1a760 7c 7c 20 6d 65 6d 63 6d 70 28 6f 6c 64 43 6e 74  || memcmp(oldCnt
1a770 72 2c 20 26 28 28 63 68 61 72 2a 29 70 42 75 66  r, &((char*)pBuf
1a780 29 5b 32 34 2d 6f 66 66 73 65 74 5d 2c 20 34 29  )[24-offset], 4)
1a790 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=0 ){.        p
1a7a0 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43  File->transCntrC
1a7b0 68 6e 67 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65  hng = 1;  /* The
1a7c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1a7d0 6e 74 65 72 20 68 61 73 20 63 68 61 6e 67 65 64  nter has changed
1a7e0 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
1a7f0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  }.  }.#endif..#i
1a800 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1a810 5f 4d 4d 41 50 5f 52 45 41 44 57 52 49 54 45 29  _MMAP_READWRITE)
1a820 20 26 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   && SQLITE_MAX_M
1a830 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20  MAP_SIZE>0.  /* 
1a840 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75 63  Deal with as muc
1a850 68 20 6f 66 20 74 68 69 73 20 77 72 69 74 65 20  h of this write 
1a860 72 65 71 75 65 73 74 20 61 73 20 70 6f 73 73 69  request as possi
1a870 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72 69  ble by transferi
1a880 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f  ng.  ** data fro
1a890 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70  m the memory map
1a8a0 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70  ping using memcp
1a8b0 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f  y().  */.  if( o
1a8c0 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61  ffset<pFile->mma
1a8d0 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28  pSize ){.    if(
1a8e0 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70   offset+amt <= p
1a8f0 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
1a900 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  {.      memcpy(&
1a910 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70  ((u8 *)(pFile->p
1a920 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73  MapRegion))[offs
1a930 65 74 5d 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b  et], pBuf, amt);
1a940 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1a950 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
1a960 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43  se{.      int nC
1a970 6f 70 79 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  opy = pFile->mma
1a980 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a  pSize - offset;.
1a990 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28 28        memcpy(&((
1a9a0 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61  u8 *)(pFile->pMa
1a9b0 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74  pRegion))[offset
1a9c0 5d 2c 20 70 42 75 66 2c 20 6e 43 6f 70 79 29 3b  ], pBuf, nCopy);
1a9d0 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 28  .      pBuf = &(
1a9e0 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70  (u8 *)pBuf)[nCop
1a9f0 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d  y];.      amt -=
1aa00 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66   nCopy;.      of
1aa10 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20  fset += nCopy;. 
1aa20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1aa30 20 0a 20 20 77 68 69 6c 65 28 20 28 77 72 6f 74   .  while( (wrot
1aa40 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65  e = seekAndWrite
1aa50 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20  (pFile, offset, 
1aa60 70 42 75 66 2c 20 61 6d 74 29 29 3c 61 6d 74 20  pBuf, amt))<amt 
1aa70 26 26 20 77 72 6f 74 65 3e 30 20 29 7b 0a 20 20  && wrote>0 ){.  
1aa80 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a    amt -= wrote;.
1aa90 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 77 72      offset += wr
1aaa0 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20  ote;.    pBuf = 
1aab0 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77  &((char*)pBuf)[w
1aac0 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d  rote];.  }.  Sim
1aad0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 28 20 77  ulateIOError(( w
1aae0 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74 3d 31  rote=(-1), amt=1
1aaf0 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44   ));.  SimulateD
1ab00 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28 20 77  iskfullError(( w
1ab10 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20 29 29  rote=0, amt=1 ))
1ab20 3b 0a 0a 20 20 69 66 28 20 61 6d 74 3e 77 72 6f  ;..  if( amt>wro
1ab30 74 65 20 29 7b 0a 20 20 20 20 69 66 28 20 77 72  te ){.    if( wr
1ab40 6f 74 65 3c 30 20 26 26 20 70 46 69 6c 65 2d 3e  ote<0 && pFile->
1ab50 6c 61 73 74 45 72 72 6e 6f 21 3d 45 4e 4f 53 50  lastErrno!=ENOSP
1ab60 43 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c 61  C ){.      /* la
1ab70 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73  stErrno set by s
1ab80 65 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20  eekAndWrite */. 
1ab90 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1aba0 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a  TE_IOERR_WRITE;.
1abb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1abc0 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
1abd0 70 46 69 6c 65 2c 20 30 29 3b 20 2f 2a 20 6e 6f  pFile, 0); /* no
1abe0 74 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72  t a system error
1abf0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
1ac00 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
1ac10 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
1ac20 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1ac30 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
1ac40 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74  ST./*.** Count t
1ac50 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c  he number of ful
1ac60 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61  lsyncs and norma
1ac70 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20 69  l syncs.  This i
1ac80 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a 2a  s used to test.*
1ac90 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e 64  * that syncs and
1aca0 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f   fullsyncs are o
1acb0 63 63 75 72 72 69 6e 67 20 61 74 20 74 68 65 20  ccurring at the 
1acc0 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a  right times..*/.
1acd0 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63  int sqlite3_sync
1ace0 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20  _count = 0;.int 
1acf0 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
1ad00 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
1ad10 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 64 6f 20  if../*.** We do 
1ad20 6e 6f 74 20 74 72 75 73 74 20 73 79 73 74 65 6d  not trust system
1ad30 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20 77  s to provide a w
1ad40 6f 72 6b 69 6e 67 20 66 64 61 74 61 73 79 6e 63  orking fdatasync
1ad50 28 29 2e 20 20 53 6f 6d 65 20 64 6f 2e 0a 2a 2a  ().  Some do..**
1ad60 20 4f 74 68 65 72 73 20 64 6f 20 6e 6f 2e 20 20   Others do no.  
1ad70 54 6f 20 62 65 20 73 61 66 65 2c 20 77 65 20 77  To be safe, we w
1ad80 69 6c 6c 20 73 74 69 63 6b 20 77 69 74 68 20 74  ill stick with t
1ad90 68 65 20 28 73 6c 69 67 68 74 6c 79 20 73 6c 6f  he (slightly slo
1ada0 77 65 72 29 0a 2a 2a 20 66 73 79 6e 63 28 29 2e  wer).** fsync().
1adb0 20 49 66 20 79 6f 75 20 6b 6e 6f 77 20 74 68 61   If you know tha
1adc0 74 20 79 6f 75 72 20 73 79 73 74 65 6d 20 64 6f  t your system do
1add0 65 73 20 73 75 70 70 6f 72 74 20 66 64 61 74 61  es support fdata
1ade0 73 79 6e 63 28 29 20 63 6f 72 72 65 63 74 6c 79  sync() correctly
1adf0 2c 0a 2a 2a 20 74 68 65 6e 20 73 69 6d 70 6c 79  ,.** then simply
1ae00 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d 44   compile with -D
1ae10 66 64 61 74 61 73 79 6e 63 3d 66 64 61 74 61 73  fdatasync=fdatas
1ae20 79 6e 63 20 6f 72 20 2d 44 48 41 56 45 5f 46 44  ync or -DHAVE_FD
1ae30 41 54 41 53 59 4e 43 0a 2a 2f 0a 23 69 66 20 21  ATASYNC.*/.#if !
1ae40 64 65 66 69 6e 65 64 28 66 64 61 74 61 73 79 6e  defined(fdatasyn
1ae50 63 29 20 26 26 20 21 48 41 56 45 5f 46 44 41 54  c) && !HAVE_FDAT
1ae60 41 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 66  ASYNC.# define f
1ae70 64 61 74 61 73 79 6e 63 20 66 73 79 6e 63 0a 23  datasync fsync.#
1ae80 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  endif../*.** Def
1ae90 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  ine HAVE_FULLFSY
1aea0 4e 43 20 74 6f 20 30 20 6f 72 20 31 20 64 65 70  NC to 0 or 1 dep
1aeb0 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65  ending on whethe
1aec0 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20  r or not.** the 
1aed0 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63 72  F_FULLFSYNC macr
1aee0 6f 20 69 73 20 64 65 66 69 6e 65 64 2e 20 20 46  o is defined.  F
1aef0 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73 20 63 75  _FULLFSYNC is cu
1af00 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20  rrently.** only 
1af10 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63  available on Mac
1af20 20 4f 53 20 58 2e 20 20 42 75 74 20 74 68 61 74   OS X.  But that
1af30 20 63 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a 2a   could change..*
1af40 2f 0a 23 69 66 64 65 66 20 46 5f 46 55 4c 4c 46  /.#ifdef F_FULLF
1af50 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 48 41  SYNC.# define HA
1af60 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a 23  VE_FULLFSYNC 1.#
1af70 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 48 41  else.# define HA
1af80 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a 23  VE_FULLFSYNC 0.#
1af90 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
1afa0 65 20 66 73 79 6e 63 28 29 20 73 79 73 74 65 6d  e fsync() system
1afb0 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 77   call does not w
1afc0 6f 72 6b 20 61 73 20 61 64 76 65 72 74 69 73 65  ork as advertise
1afd0 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69  d on many.** uni
1afe0 78 20 73 79 73 74 65 6d 73 2e 20 20 54 68 65 20  x systems.  The 
1aff0 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65 64  following proced
1b000 75 72 65 20 69 73 20 61 6e 20 61 74 74 65 6d 70  ure is an attemp
1b010 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74 20  t to make.** it 
1b020 77 6f 72 6b 20 62 65 74 74 65 72 2e 0a 2a 2a 0a  work better..**.
1b030 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4e 4f  ** The SQLITE_NO
1b040 5f 53 59 4e 43 20 6d 61 63 72 6f 20 64 69 73 61  _SYNC macro disa
1b050 62 6c 65 73 20 61 6c 6c 20 66 73 79 6e 63 28 29  bles all fsync()
1b060 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 66  s.  This is usef
1b070 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e  ul.** for testin
1b080 67 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74  g when we want t
1b090 6f 20 72 75 6e 20 74 68 72 6f 75 67 68 20 74 68  o run through th
1b0a0 65 20 74 65 73 74 20 73 75 69 74 65 20 71 75 69  e test suite qui
1b0b0 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61 72 65  ckly..** You are
1b0c0 20 73 74 72 6f 6e 67 6c 79 20 61 64 76 69 73 65   strongly advise
1b0d0 64 20 2a 6e 6f 74 2a 20 74 6f 20 64 65 70 6c 6f  d *not* to deplo
1b0e0 79 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f  y with SQLITE_NO
1b0f0 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65 64  _SYNC.** enabled
1b100 2c 20 68 6f 77 65 76 65 72 2c 20 73 69 6e 63 65  , however, since
1b110 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f   with SQLITE_NO_
1b120 53 59 4e 43 20 65 6e 61 62 6c 65 64 2c 20 61 6e  SYNC enabled, an
1b130 20 4f 53 20 63 72 61 73 68 0a 2a 2a 20 6f 72 20   OS crash.** or 
1b140 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 69  power failure wi
1b150 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f 72 72 75 70  ll likely corrup
1b160 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
1b170 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74  ile..**.** SQLit
1b180 65 20 73 65 74 73 20 74 68 65 20 64 61 74 61 4f  e sets the dataO
1b190 6e 6c 79 20 66 6c 61 67 20 69 66 20 74 68 65 20  nly flag if the 
1b1a0 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
1b1b0 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a   is unchanged..*
1b1c0 2a 20 54 68 65 20 69 64 65 61 20 62 65 68 69 6e  * The idea behin
1b1d0 64 20 64 61 74 61 4f 6e 6c 79 20 69 73 20 74 68  d dataOnly is th
1b1e0 61 74 20 69 74 20 73 68 6f 75 6c 64 20 6f 6e 6c  at it should onl
1b1f0 79 20 77 72 69 74 65 20 74 68 65 20 66 69 6c 65  y write the file
1b200 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 74 6f 20 64   content.** to d
1b210 69 73 6b 2c 20 6e 6f 74 20 74 68 65 20 69 6e 6f  isk, not the ino
1b220 64 65 2e 20 20 57 65 20 6f 6e 6c 79 20 73 65 74  de.  We only set
1b230 20 64 61 74 61 4f 6e 6c 79 20 69 66 20 74 68 65   dataOnly if the
1b240 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 0a 2a   file size is .*
1b250 2a 20 75 6e 63 68 61 6e 67 65 64 20 73 69 6e 63  * unchanged sinc
1b260 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  e the file size 
1b270 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 69  is part of the i
1b280 6e 6f 64 65 2e 20 20 48 6f 77 65 76 65 72 2c 20  node.  However, 
1b290 0a 2a 2a 20 54 65 64 20 54 73 27 6f 20 74 65 6c  .** Ted Ts'o tel
1b2a0 6c 73 20 75 73 20 74 68 61 74 20 66 64 61 74 61  ls us that fdata
1b2b0 73 79 6e 63 28 29 20 77 69 6c 6c 20 61 6c 73 6f  sync() will also
1b2c0 20 77 72 69 74 65 20 74 68 65 20 69 6e 6f 64 65   write the inode
1b2d0 20 69 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20   if the.** file 
1b2e0 73 69 7a 65 20 68 61 73 20 63 68 61 6e 67 65 64  size has changed
1b2f0 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 6c  .  The only real
1b300 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
1b310 65 65 6e 20 66 64 61 74 61 73 79 6e 63 28 29 0a  een fdatasync().
1b320 2a 2a 20 61 6e 64 20 66 73 79 6e 63 28 29 2c 20  ** and fsync(), 
1b330 54 65 64 20 74 65 6c 6c 73 20 75 73 2c 20 69 73  Ted tells us, is
1b340 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63 28   that fdatasync(
1b350 29 20 77 69 6c 6c 20 6e 6f 74 20 66 6c 75 73 68  ) will not flush
1b360 20 74 68 65 0a 2a 2a 20 69 6e 6f 64 65 20 69 66   the.** inode if
1b370 20 74 68 65 20 6d 74 69 6d 65 20 6f 72 20 6f 77   the mtime or ow
1b380 6e 65 72 20 6f 72 20 6f 74 68 65 72 20 69 6e 6f  ner or other ino
1b390 64 65 20 61 74 74 72 69 62 75 74 65 73 20 68 61  de attributes ha
1b3a0 76 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 57  ve changed..** W
1b3b0 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75  e only care abou
1b3c0 74 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2c  t the file size,
1b3d0 20 6e 6f 74 20 74 68 65 20 6f 74 68 65 72 20 66   not the other f
1b3e0 69 6c 65 20 61 74 74 72 69 62 75 74 65 73 2c 20  ile attributes, 
1b3f0 73 6f 0a 2a 2a 20 61 73 20 66 61 72 20 61 73 20  so.** as far as 
1b400 53 51 4c 69 74 65 20 69 73 20 63 6f 6e 63 65 72  SQLite is concer
1b410 6e 65 64 2c 20 61 6e 20 66 64 61 74 61 73 79 6e  ned, an fdatasyn
1b420 63 28 29 20 69 73 20 61 6c 77 61 79 73 20 61 64  c() is always ad
1b430 65 71 75 61 74 65 2e 0a 2a 2a 20 53 6f 2c 20 77  equate..** So, w
1b440 65 20 61 6c 77 61 79 73 20 75 73 65 20 66 64 61  e always use fda
1b450 74 61 73 79 6e 63 28 29 20 69 66 20 69 74 20 69  tasync() if it i
1b460 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 67  s available, reg
1b470 61 72 64 6c 65 73 73 20 6f 66 0a 2a 2a 20 74 68  ardless of.** th
1b480 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64  e value of the d
1b490 61 74 61 4f 6e 6c 79 20 66 6c 61 67 2e 0a 2a 2f  ataOnly flag..*/
1b4a0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 75 6c 6c  .static int full
1b4b0 5f 66 73 79 6e 63 28 69 6e 74 20 66 64 2c 20 69  _fsync(int fd, i
1b4c0 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20 69 6e 74  nt fullSync, int
1b4d0 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e   dataOnly){.  in
1b4e0 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  t rc;..  /* The 
1b4f0 66 6f 6c 6c 6f 77 69 6e 67 20 22 69 66 64 65 66  following "ifdef
1b500 2f 65 6c 69 66 2f 65 6c 73 65 2f 22 20 62 6c 6f  /elif/else/" blo
1b510 63 6b 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  ck has the same 
1b520 73 74 72 75 63 74 75 72 65 20 61 73 0a 20 20 2a  structure as.  *
1b530 2a 20 74 68 65 20 6f 6e 65 20 62 65 6c 6f 77 2e  * the one below.
1b540 20 49 74 20 69 73 20 72 65 70 6c 69 63 61 74 65   It is replicate
1b550 64 20 68 65 72 65 20 73 6f 6c 65 6c 79 20 74 6f  d here solely to
1b560 20 61 76 6f 69 64 20 63 6c 75 74 74 65 72 69 6e   avoid clutterin
1b570 67 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 72  g .  ** up the r
1b580 65 61 6c 20 63 6f 64 65 20 77 69 74 68 20 74 68  eal code with th
1b590 65 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54  e UNUSED_PARAMET
1b5a0 45 52 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20 2a  ER() macros..  *
1b5b0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1b5c0 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e 55 53 45 44  NO_SYNC.  UNUSED
1b5d0 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a  _PARAMETER(fd);.
1b5e0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1b5f0 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20  ER(fullSync);.  
1b600 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1b610 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 69  (dataOnly);.#eli
1b620 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  f HAVE_FULLFSYNC
1b630 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1b640 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23  TER(dataOnly);.#
1b650 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41  else.  UNUSED_PA
1b660 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63  RAMETER(fullSync
1b670 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1b680 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b  METER(dataOnly);
1b690 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65  .#endif..  /* Re
1b6a0 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20  cord the number 
1b6b0 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 77 65  of times that we
1b6c0 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73 79   do a normal fsy
1b6d0 6e 63 28 29 20 61 6e 64 20 0a 20 20 2a 2a 20 46  nc() and .  ** F
1b6e0 55 4c 4c 53 59 4e 43 2e 20 20 54 68 69 73 20 69  ULLSYNC.  This i
1b6f0 73 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 65  s used during te
1b700 73 74 69 6e 67 20 74 6f 20 76 65 72 69 66 79 20  sting to verify 
1b710 74 68 61 74 20 74 68 69 73 20 70 72 6f 63 65 64  that this proced
1b720 75 72 65 0a 20 20 2a 2a 20 67 65 74 73 20 63 61  ure.  ** gets ca
1b730 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 63 6f  lled with the co
1b740 72 72 65 63 74 20 61 72 67 75 6d 65 6e 74 73 2e  rrect arguments.
1b750 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
1b760 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 66  ITE_TEST.  if( f
1b770 75 6c 6c 53 79 6e 63 20 29 20 73 71 6c 69 74 65  ullSync ) sqlite
1b780 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74  3_fullsync_count
1b790 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 79  ++;.  sqlite3_sy
1b7a0 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  nc_count++;.#end
1b7b0 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63  if..  /* If we c
1b7c0 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65  ompiled with the
1b7d0 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
1b7e0 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63 69  flag, then synci
1b7f0 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d  ng is a.  ** no-
1b800 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  op.  */.#ifdef S
1b810 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20  QLITE_NO_SYNC.  
1b820 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1b830 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46  #elif HAVE_FULLF
1b840 53 59 4e 43 0a 20 20 69 66 28 20 66 75 6c 6c 53  SYNC.  if( fullS
1b850 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ync ){.    rc = 
1b860 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55  osFcntl(fd, F_FU
1b870 4c 4c 46 53 59 4e 43 2c 20 30 29 3b 0a 20 20 7d  LLFSYNC, 0);.  }
1b880 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31  else{.    rc = 1
1b890 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68  ;.  }.  /* If th
1b8a0 65 20 46 55 4c 4c 46 53 59 4e 43 20 66 61 69 6c  e FULLFSYNC fail
1b8b0 65 64 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  ed, fall back to
1b8c0 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 20 66   attempting an f
1b8d0 73 79 6e 63 28 29 2e 0a 20 20 2a 2a 20 49 74 20  sync()..  ** It 
1b8e0 73 68 6f 75 6c 64 6e 27 74 20 62 65 20 70 6f 73  shouldn't be pos
1b8f0 73 69 62 6c 65 20 66 6f 72 20 66 75 6c 6c 66 73  sible for fullfs
1b900 79 6e 63 20 74 6f 20 66 61 69 6c 20 6f 6e 20 74  ync to fail on t
1b910 68 65 20 6c 6f 63 61 6c 20 0a 20 20 2a 2a 20 66  he local .  ** f
1b920 69 6c 65 20 73 79 73 74 65 6d 20 28 6f 6e 20 4f  ile system (on O
1b930 53 58 29 2c 20 73 6f 20 66 61 69 6c 75 72 65 20  SX), so failure 
1b940 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 46  indicates that F
1b950 55 4c 4c 46 53 59 4e 43 0a 20 20 2a 2a 20 69 73  ULLFSYNC.  ** is
1b960 6e 27 74 20 73 75 70 70 6f 72 74 65 64 20 66 6f  n't supported fo
1b970 72 20 74 68 69 73 20 66 69 6c 65 20 73 79 73 74  r this file syst
1b980 65 6d 2e 20 53 6f 2c 20 61 74 74 65 6d 70 74 20  em. So, attempt 
1b990 61 6e 20 66 73 79 6e 63 20 0a 20 20 2a 2a 20 61  an fsync .  ** a
1b9a0 6e 64 20 28 66 6f 72 20 6e 6f 77 29 20 69 67 6e  nd (for now) ign
1b9b0 6f 72 65 20 74 68 65 20 6f 76 65 72 68 65 61 64  ore the overhead
1b9c0 20 6f 66 20 61 20 73 75 70 65 72 66 6c 75 6f 75   of a superfluou
1b9d0 73 20 66 63 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a  s fcntl call.  .
1b9e0 20 20 2a 2a 20 49 74 27 64 20 62 65 20 62 65 74    ** It'd be bet
1b9f0 74 65 72 20 74 6f 20 64 65 74 65 63 74 20 66 75  ter to detect fu
1ba00 6c 6c 66 73 79 6e 63 20 73 75 70 70 6f 72 74 20  llfsync support 
1ba10 6f 6e 63 65 20 61 6e 64 20 61 76 6f 69 64 20 0a  once and avoid .
1ba20 20 20 2a 2a 20 74 68 65 20 66 63 6e 74 6c 20 63    ** the fcntl c
1ba30 61 6c 6c 20 65 76 65 72 79 20 74 69 6d 65 20 73  all every time s
1ba40 79 6e 63 20 69 73 20 63 61 6c 6c 65 64 2e 0a 20  ync is called.. 
1ba50 20 2a 2f 0a 20 20 69 66 28 20 72 63 20 29 20 72   */.  if( rc ) r
1ba60 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 0a  c = fsync(fd);..
1ba70 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  #elif defined(__
1ba80 41 50 50 4c 45 5f 5f 29 0a 20 20 2f 2a 20 66 64  APPLE__).  /* fd
1ba90 61 74 61 73 79 6e 63 28 29 20 6f 6e 20 48 46 53  atasync() on HFS
1baa0 2b 20 64 6f 65 73 6e 27 74 20 79 65 74 20 66 6c  + doesn't yet fl
1bab0 75 73 68 20 74 68 65 20 66 69 6c 65 20 73 69 7a  ush the file siz
1bac0 65 20 69 66 20 69 74 20 63 68 61 6e 67 65 64 20  e if it changed 
1bad0 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 73  correctly.  ** s
1bae0 6f 20 63 75 72 72 65 6e 74 6c 79 20 77 65 20 64  o currently we d
1baf0 65 66 61 75 6c 74 20 74 6f 20 74 68 65 20 6d 61  efault to the ma
1bb00 63 72 6f 20 74 68 61 74 20 72 65 64 65 66 69 6e  cro that redefin
1bb10 65 73 20 66 64 61 74 61 73 79 6e 63 20 74 6f 20  es fdatasync to 
1bb20 66 73 79 6e 63 0a 20 20 2a 2f 0a 20 20 72 63 20  fsync.  */.  rc 
1bb30 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 23 65 6c  = fsync(fd);.#el
1bb40 73 65 20 0a 20 20 72 63 20 3d 20 66 64 61 74 61  se .  rc = fdata
1bb50 73 79 6e 63 28 66 64 29 3b 0a 23 69 66 20 4f 53  sync(fd);.#if OS
1bb60 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72  _VXWORKS.  if( r
1bb70 63 3d 3d 2d 31 20 26 26 20 65 72 72 6e 6f 3d 3d  c==-1 && errno==
1bb80 45 4e 4f 54 53 55 50 20 29 7b 0a 20 20 20 20 72  ENOTSUP ){.    r
1bb90 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 20  c = fsync(fd);. 
1bba0 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f   }.#endif /* OS_
1bbb0 56 58 57 4f 52 4b 53 20 2a 2f 0a 23 65 6e 64 69  VXWORKS */.#endi
1bbc0 66 20 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54  f /* ifdef SQLIT
1bbd0 45 5f 4e 4f 5f 53 59 4e 43 20 65 6c 69 66 20 48  E_NO_SYNC elif H
1bbe0 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 2a 2f  AVE_FULLFSYNC */
1bbf0 0a 0a 20 20 69 66 28 20 4f 53 5f 56 58 57 4f 52  ..  if( OS_VXWOR
1bc00 4b 53 20 26 26 20 72 63 21 3d 20 2d 31 20 29 7b  KS && rc!= -1 ){
1bc10 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 7d  .    rc = 0;.  }
1bc20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1bc30 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69  ./*.** Open a fi
1bc40 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  le descriptor to
1bc50 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 63   the directory c
1bc60 6f 6e 74 61 69 6e 69 6e 67 20 66 69 6c 65 20 7a  ontaining file z
1bc70 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20  Filename..** If 
1bc80 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 46 64  successful, *pFd
1bc90 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f   is set to the o
1bca0 70 65 6e 65 64 20 66 69 6c 65 20 64 65 73 63 72  pened file descr
1bcb0 69 70 74 6f 72 20 61 6e 64 0a 2a 2a 20 53 51 4c  iptor and.** SQL
1bcc0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1bcd0 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ed. If an error 
1bce0 6f 63 63 75 72 73 2c 20 65 69 74 68 65 72 20 53  occurs, either S
1bcf0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f  QLITE_NOMEM.** o
1bd00 72 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r SQLITE_CANTOPE
1bd10 4e 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  N is returned an
1bd20 64 20 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f  d *pFd is set to
1bd30 20 61 6e 20 75 6e 64 65 66 69 6e 65 64 0a 2a 2a   an undefined.**
1bd40 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   value..**.** Th
1bd50 65 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65  e directory file
1bd60 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 75   descriptor is u
1bd70 73 65 64 20 66 6f 72 20 6f 6e 6c 79 20 6f 6e 65  sed for only one
1bd80 20 74 68 69 6e 67 20 2d 20 74 6f 0a 2a 2a 20 66   thing - to.** f
1bd90 73 79 6e 63 28 29 20 61 20 64 69 72 65 63 74 6f  sync() a directo
1bda0 72 79 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ry to make sure 
1bdb0 66 69 6c 65 20 63 72 65 61 74 69 6f 6e 20 61 6e  file creation an
1bdc0 64 20 64 65 6c 65 74 69 6f 6e 20 65 76 65 6e 74  d deletion event
1bdd0 73 0a 2a 2a 20 61 72 65 20 66 6c 75 73 68 65 64  s.** are flushed
1bde0 20 74 6f 20 64 69 73 6b 2e 20 20 53 75 63 68 20   to disk.  Such 
1bdf0 66 73 79 6e 63 73 20 61 72 65 20 6e 6f 74 20 6e  fsyncs are not n
1be00 65 65 64 65 64 20 6f 6e 20 6e 65 77 65 72 0a 2a  eeded on newer.*
1be10 2a 20 6a 6f 75 72 6e 61 6c 69 6e 67 20 66 69 6c  * journaling fil
1be20 65 73 79 73 74 65 6d 73 2c 20 62 75 74 20 61 72  esystems, but ar
1be30 65 20 72 65 71 75 69 72 65 64 20 6f 6e 20 6f 6c  e required on ol
1be40 64 65 72 20 66 69 6c 65 73 79 73 74 65 6d 73 2e  der filesystems.
1be50 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1be60 69 6e 65 20 63 61 6e 20 62 65 20 6f 76 65 72 72  ine can be overr
1be70 69 64 64 65 6e 20 75 73 69 6e 67 20 74 68 65 20  idden using the 
1be80 78 53 65 74 53 79 73 43 61 6c 6c 20 69 6e 74 65  xSetSysCall inte
1be90 72 66 61 63 65 2e 0a 2a 2a 20 54 68 65 20 61 62  rface..** The ab
1bea0 69 6c 69 74 79 20 74 6f 20 6f 76 65 72 72 69 64  ility to overrid
1beb0 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
1bec0 61 73 20 61 64 64 65 64 20 69 6e 20 73 75 70 70  as added in supp
1bed0 6f 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68  ort of the.** ch
1bee0 72 6f 6d 69 75 6d 20 73 61 6e 64 62 6f 78 2e 20  romium sandbox. 
1bef0 20 4f 70 65 6e 69 6e 67 20 61 20 64 69 72 65 63   Opening a direc
1bf00 74 6f 72 79 20 69 73 20 61 20 73 65 63 75 72 69  tory is a securi
1bf10 74 79 20 72 69 73 6b 20 28 77 65 20 61 72 65 0a  ty risk (we are.
1bf20 2a 2a 20 74 6f 6c 64 29 20 73 6f 20 6d 61 6b 69  ** told) so maki
1bf30 6e 67 20 69 74 20 6f 76 65 72 72 69 64 65 61 62  ng it overrideab
1bf40 6c 65 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 68  le allows the ch
1bf50 72 6f 6d 69 75 6d 20 73 61 6e 64 62 6f 78 20 74  romium sandbox t
1bf60 6f 0a 2a 2a 20 72 65 70 6c 61 63 65 20 74 68 69  o.** replace thi
1bf70 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61  s routine with a
1bf80 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e   harmless no-op.
1bf90 20 20 54 6f 20 6d 61 6b 65 20 74 68 69 73 20 72    To make this r
1bfa0 6f 75 74 69 6e 65 0a 2a 2a 20 61 20 6e 6f 2d 6f  outine.** a no-o
1bfb0 70 2c 20 72 65 70 6c 61 63 65 20 69 74 20 77 69  p, replace it wi
1bfc0 74 68 20 61 20 73 74 75 62 20 74 68 61 74 20 72  th a stub that r
1bfd0 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
1bfe0 20 62 75 74 20 6c 65 61 76 65 73 0a 2a 2a 20 2a   but leaves.** *
1bff0 70 46 64 20 73 65 74 20 74 6f 20 61 20 6e 65 67  pFd set to a neg
1c000 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a  ative number..**
1c010 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b  .** If SQLITE_OK
1c020 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
1c030 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  e caller is resp
1c040 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 6c 6f 73  onsible for clos
1c050 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20  ing.** the file 
1c060 64 65 73 63 72 69 70 74 6f 72 20 2a 70 46 64 20  descriptor *pFd 
1c070 75 73 69 6e 67 20 63 6c 6f 73 65 28 29 2e 0a 2a  using close()..*
1c080 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65  /.static int ope
1c090 6e 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74  nDirectory(const
1c0a0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
1c0b0 2c 20 69 6e 74 20 2a 70 46 64 29 7b 0a 20 20 69  , int *pFd){.  i
1c0c0 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 66 64 20  nt ii;.  int fd 
1c0d0 3d 20 2d 31 3b 0a 20 20 63 68 61 72 20 7a 44 69  = -1;.  char zDi
1c0e0 72 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41  rname[MAX_PATHNA
1c0f0 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71 6c 69 74 65  ME+1];..  sqlite
1c100 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50  3_snprintf(MAX_P
1c110 41 54 48 4e 41 4d 45 2c 20 7a 44 69 72 6e 61 6d  ATHNAME, zDirnam
1c120 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65 6e 61  e, "%s", zFilena
1c130 6d 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 28 69  me);.  for(ii=(i
1c140 6e 74 29 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61  nt)strlen(zDirna
1c150 6d 65 29 3b 20 69 69 3e 31 20 26 26 20 7a 44 69  me); ii>1 && zDi
1c160 72 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b 20  rname[ii]!='/'; 
1c170 69 69 2d 2d 29 3b 0a 20 20 69 66 28 20 69 69 3e  ii--);.  if( ii>
1c180 30 20 29 7b 0a 20 20 20 20 7a 44 69 72 6e 61 6d  0 ){.    zDirnam
1c190 65 5b 69 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  e[ii] = '\0';.  
1c1a0 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
1c1b0 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52  en(zDirname, O_R
1c1c0 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20  DONLY|O_BINARY, 
1c1d0 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3e 3d  0);.    if( fd>=
1c1e0 30 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41  0 ){.      OSTRA
1c1f0 43 45 28 28 22 4f 50 45 4e 44 49 52 20 25 2d 33  CE(("OPENDIR %-3
1c200 64 20 25 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69  d %s\n", fd, zDi
1c210 72 6e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20  rname));.    }. 
1c220 20 7d 0a 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a   }.  *pFd = fd;.
1c230 20 20 69 66 28 20 66 64 3e 3d 30 20 29 20 72 65    if( fd>=0 ) re
1c240 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1c250 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67    return unixLog
1c260 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
1c270 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65  TOPEN_BKPT, "ope
1c280 6e 44 69 72 65 63 74 6f 72 79 22 2c 20 7a 44 69  nDirectory", zDi
1c290 72 6e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rname);.}../*.**
1c2a0 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77   Make sure all w
1c2b0 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69  rites to a parti
1c2c0 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63  cular file are c
1c2d0 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b  ommitted to disk
1c2e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f  ..**.** If dataO
1c2f0 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68  nly==0 then both
1c300 20 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66   the file itself
1c310 20 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74   and its metadat
1c320 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c  a (file.** size,
1c330 20 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74   access time, et
1c340 63 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20  c) are synced.  
1c350 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74  If dataOnly!=0 t
1c360 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  hen only the.** 
1c370 66 69 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e  file data is syn
1c380 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72  ced..**.** Under
1c390 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65   Unix, also make
1c3a0 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 64   sure that the d
1c3b0 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66  irectory entry f
1c3c0 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68  or the file.** h
1c3d0 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20  as been created 
1c3e0 62 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65  by fsync-ing the
1c3f0 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20   directory that 
1c400 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c  contains the fil
1c410 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e  e..** If we do n
1c420 6f 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77  ot do this and w
1c430 65 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f  e encounter a po
1c440 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65  wer failure, the
1c450 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e   directory.** en
1c460 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  try for the jour
1c470 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78  nal might not ex
1c480 69 73 74 20 61 66 74 65 72 20 77 65 20 72 65 62  ist after we reb
1c490 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a  oot.  The next.*
1c4a0 2a 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65  * SQLite to acce
1c4b0 73 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c  ss the file will
1c4c0 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74   not know that t
1c4d0 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  he journal exist
1c4e0 73 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68  s (because.** th
1c4f0 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72  e directory entr
1c500 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  y for the journa
1c510 6c 20 77 61 73 20 6e 65 76 65 72 20 63 72 65 61  l was never crea
1c520 74 65 64 29 20 61 6e 64 20 74 68 65 20 74 72 61  ted) and the tra
1c530 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c  nsaction.** will
1c540 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d   not roll back -
1c550 20 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e   possibly leadin
1c560 67 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  g to database co
1c570 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  rruption..*/.sta
1c580 74 69 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63  tic int unixSync
1c590 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
1c5a0 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  d, int flags){. 
1c5b0 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46   int rc;.  unixF
1c5c0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
1c5d0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69  ixFile*)id;..  i
1c5e0 6e 74 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20  nt isDataOnly = 
1c5f0 28 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 53 59  (flags&SQLITE_SY
1c600 4e 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20  NC_DATAONLY);.  
1c610 69 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d  int isFullsync =
1c620 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53   (flags&0x0F)==S
1c630 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b  QLITE_SYNC_FULL;
1c640 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
1c650 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  t one of SQLITE_
1c660 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46  SYNC_NORMAL or F
1c670 55 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a  ULL was passed *
1c680 2f 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61 67  /.  assert((flag
1c690 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
1c6a0 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20  SYNC_NORMAL.    
1c6b0 20 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46    || (flags&0x0F
1c6c0 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  )==SQLITE_SYNC_F
1c6d0 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55  ULL.  );..  /* U
1c6e0 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20  nix cannot, but 
1c6f0 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79  some systems may
1c700 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
1c710 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54  ULL from here. T
1c720 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73  his.  ** line is
1c730 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f   to test that do
1c740 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20  ing so does not 
1c750 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65  cause any proble
1c760 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c  ms..  */.  Simul
1c770 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72  ateDiskfullError
1c780 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
1c790 46 55 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72  FULL );..  asser
1c7a0 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
1c7b0 54 52 41 43 45 28 28 22 53 59 4e 43 20 20 20 20  TRACE(("SYNC    
1c7c0 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  %-3d\n", pFile->
1c7d0 68 29 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c  h));.  rc = full
1c7e0 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c  _fsync(pFile->h,
1c7f0 20 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44   isFullsync, isD
1c800 61 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75  ataOnly);.  Simu
1c810 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d  lateIOError( rc=
1c820 31 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  1 );.  if( rc ){
1c830 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72  .    storeLastEr
1c840 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f  rno(pFile, errno
1c850 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e  );.    return un
1c860 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
1c870 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20 22  E_IOERR_FSYNC, "
1c880 66 75 6c 6c 5f 66 73 79 6e 63 22 2c 20 70 46 69  full_fsync", pFi
1c890 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a  le->zPath);.  }.
1c8a0 0a 20 20 2f 2a 20 41 6c 73 6f 20 66 73 79 6e 63  .  /* Also fsync
1c8b0 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 63   the directory c
1c8c0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 66 69  ontaining the fi
1c8d0 6c 65 20 69 66 20 74 68 65 20 44 49 52 53 59 4e  le if the DIRSYN
1c8e0 43 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20 73  C flag.  ** is s
1c8f0 65 74 2e 20 20 54 68 69 73 20 69 73 20 61 20 6f  et.  This is a o
1c900 6e 65 2d 74 69 6d 65 20 6f 63 63 75 72 72 65 6e  ne-time occurren
1c910 63 65 2e 20 20 4d 61 6e 79 20 73 79 73 74 65 6d  ce.  Many system
1c920 73 20 28 65 78 61 6d 70 6c 65 73 3a 20 41 49 58  s (examples: AIX
1c930 29 0a 20 20 2a 2a 20 61 72 65 20 75 6e 61 62 6c  ).  ** are unabl
1c940 65 20 74 6f 20 66 73 79 6e 63 20 61 20 64 69 72  e to fsync a dir
1c950 65 63 74 6f 72 79 2c 20 73 6f 20 69 67 6e 6f 72  ectory, so ignor
1c960 65 20 65 72 72 6f 72 73 20 6f 6e 20 74 68 65 20  e errors on the 
1c970 66 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 69 66  fsync..  */.  if
1c980 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  ( pFile->ctrlFla
1c990 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 49  gs & UNIXFILE_DI
1c9a0 52 53 59 4e 43 20 29 7b 0a 20 20 20 20 69 6e 74  RSYNC ){.    int
1c9b0 20 64 69 72 66 64 3b 0a 20 20 20 20 4f 53 54 52   dirfd;.    OSTR
1c9c0 41 43 45 28 28 22 44 49 52 53 59 4e 43 20 25 73  ACE(("DIRSYNC %s
1c9d0 20 28 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e 63   (have_fullfsync
1c9e0 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64 29  =%d fullsync=%d)
1c9f0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  \n", pFile->zPat
1ca00 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 48  h,.            H
1ca10 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 69  AVE_FULLFSYNC, i
1ca20 73 46 75 6c 6c 73 79 6e 63 29 29 3b 0a 20 20 20  sFullsync));.   
1ca30 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65   rc = osOpenDire
1ca40 63 74 6f 72 79 28 70 46 69 6c 65 2d 3e 7a 50 61  ctory(pFile->zPa
1ca50 74 68 2c 20 26 64 69 72 66 64 29 3b 0a 20 20 20  th, &dirfd);.   
1ca60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1ca70 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66 75 6c 6c  OK ){.      full
1ca80 5f 66 73 79 6e 63 28 64 69 72 66 64 2c 20 30 2c  _fsync(dirfd, 0,
1ca90 20 30 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73   0);.      robus
1caa0 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 64  t_close(pFile, d
1cab0 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  irfd, __LINE__);
1cac0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1cad0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
1cae0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 3b  LITE_CANTOPEN );
1caf0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1cb00 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1cb10 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
1cb20 73 20 26 3d 20 7e 55 4e 49 58 46 49 4c 45 5f 44  s &= ~UNIXFILE_D
1cb30 49 52 53 59 4e 43 3b 0a 20 20 7d 0a 20 20 72 65  IRSYNC;.  }.  re
1cb40 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1cb50 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70  * Truncate an op
1cb60 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65  en file to a spe
1cb70 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73  cified size.*/.s
1cb80 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 54 72  tatic int unixTr
1cb90 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66  uncate(sqlite3_f
1cba0 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6e 42 79  ile *id, i64 nBy
1cbb0 74 65 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  te){.  unixFile 
1cbc0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
1cbd0 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72  le *)id;.  int r
1cbe0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  c;.  assert( pFi
1cbf0 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  le );.  Simulate
1cc00 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
1cc10 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
1cc20 4e 43 41 54 45 20 29 3b 0a 0a 20 20 2f 2a 20 49  NCATE );..  /* I
1cc30 66 20 74 68 65 20 75 73 65 72 20 68 61 73 20 63  f the user has c
1cc40 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68 75 6e  onfigured a chun
1cc50 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  k-size for this 
1cc60 66 69 6c 65 2c 20 74 72 75 6e 63 61 74 65 20 74  file, truncate t
1cc70 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20  he.  ** file so 
1cc80 74 68 61 74 20 69 74 20 63 6f 6e 73 69 73 74 73  that it consists
1cc90 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20 6e   of an integer n
1cca0 75 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b 73 20  umber of chunks 
1ccb0 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61  (i.e. the.  ** a
1ccc0 63 74 75 61 6c 20 66 69 6c 65 20 73 69 7a 65 20  ctual file size 
1ccd0 61 66 74 65 72 20 74 68 65 20 6f 70 65 72 61 74  after the operat
1cce0 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72 67 65  ion may be large
1ccf0 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65  r than the reque
1cd00 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e  sted.  ** size).
1cd10 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
1cd20 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a  e->szChunk>0 ){.
1cd30 20 20 20 20 6e 42 79 74 65 20 3d 20 28 28 6e 42      nByte = ((nB
1cd40 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43  yte + pFile->szC
1cd50 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d  hunk - 1)/pFile-
1cd60 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c  >szChunk) * pFil
1cd70 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a  e->szChunk;.  }.
1cd80 0a 20 20 72 63 20 3d 20 72 6f 62 75 73 74 5f 66  .  rc = robust_f
1cd90 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e  truncate(pFile->
1cda0 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  h, nByte);.  if(
1cdb0 20 72 63 20 29 7b 0a 20 20 20 20 73 74 6f 72 65   rc ){.    store
1cdc0 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
1cdd0 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74   errno);.    ret
1cde0 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  urn unixLogError
1cdf0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52  (SQLITE_IOERR_TR
1ce00 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61  UNCATE, "ftrunca
1ce10 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  te", pFile->zPat
1ce20 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66  h);.  }else{.#if
1ce30 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1ce40 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72  .    /* If we ar
1ce50 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c  e doing a normal
1ce60 20 77 72 69 74 65 20 74 6f 20 61 20 64 61 74 61   write to a data
1ce70 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f 70  base file (as op
1ce80 70 6f 73 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  posed to.    ** 
1ce90 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72  doing a hot-jour
1cea0 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20  nal rollback or 
1ceb0 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20  a write to some 
1cec0 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20  file other than 
1ced0 61 0a 20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20  a.    ** normal 
1cee0 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 61  database file) a
1cef0 6e 64 20 77 65 20 74 72 75 6e 63 61 74 65 20 74  nd we truncate t
1cf00 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20  he file to zero 
1cf10 6c 65 6e 67 74 68 2c 0a 20 20 20 20 2a 2a 20 74  length,.    ** t
1cf20 68 61 74 20 65 66 66 65 63 74 69 76 65 6c 79 20  hat effectively 
1cf30 75 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e  updates the chan
1cf40 67 65 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 69  ge counter.  Thi
1cf50 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e 0a 20  s might happen. 
1cf60 20 20 20 2a 2a 20 77 68 65 6e 20 72 65 73 74 6f     ** when resto
1cf70 72 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20  ring a database 
1cf80 75 73 69 6e 67 20 74 68 65 20 62 61 63 6b 75 70  using the backup
1cf90 20 41 50 49 20 66 72 6f 6d 20 61 20 7a 65 72 6f   API from a zero
1cfa0 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 73  -length.    ** s
1cfb0 6f 75 72 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ource..    */.  
1cfc0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e    if( pFile->inN
1cfd0 6f 72 6d 61 6c 57 72 69 74 65 20 26 26 20 6e 42  ormalWrite && nB
1cfe0 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  yte==0 ){.      
1cff0 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72  pFile->transCntr
1d000 43 68 6e 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Chng = 1;.    }.
1d010 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
1d020 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
1d030 3e 30 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  >0.    /* If the
1d040 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20 74   file was just t
1d050 72 75 6e 63 61 74 65 64 20 74 6f 20 61 20 73 69  runcated to a si
1d060 7a 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  ze smaller than 
1d070 74 68 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20  the currently.  
1d080 20 20 2a 2a 20 6d 61 70 70 65 64 20 72 65 67 69    ** mapped regi
1d090 6f 6e 2c 20 72 65 64 75 63 65 20 74 68 65 20 65  on, reduce the e
1d0a0 66 66 65 63 74 69 76 65 20 6d 61 70 70 69 6e 67  ffective mapping
1d0b0 20 73 69 7a 65 20 61 73 20 77 65 6c 6c 2e 20 53   size as well. S
1d0c0 51 4c 69 74 65 20 77 69 6c 6c 0a 20 20 20 20 2a  QLite will.    *
1d0d0 2a 20 75 73 65 20 72 65 61 64 28 29 20 61 6e 64  * use read() and
1d0e0 20 77 72 69 74 65 28 29 20 74 6f 20 61 63 63 65   write() to acce
1d0f0 73 73 20 64 61 74 61 20 62 65 79 6f 6e 64 20 74  ss data beyond t
1d100 68 69 73 20 70 6f 69 6e 74 20 66 72 6f 6d 20 6e  his point from n
1d110 6f 77 20 6f 6e 2e 20 20 0a 20 20 20 20 2a 2f 0a  ow on.  .    */.
1d120 20 20 20 20 69 66 28 20 6e 42 79 74 65 3c 70 46      if( nByte<pF
1d130 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
1d140 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d  .      pFile->mm
1d150 61 70 53 69 7a 65 20 3d 20 6e 42 79 74 65 3b 0a  apSize = nByte;.
1d160 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
1d170 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d180 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
1d190 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63   Determine the c
1d1a0 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61  urrent size of a
1d1b0 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a   file in bytes.*
1d1c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1d1d0 78 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65  xFileSize(sqlite
1d1e0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20  3_file *id, i64 
1d1f0 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72  *pSize){.  int r
1d200 63 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  c;.  struct stat
1d210 20 62 75 66 3b 0a 20 20 61 73 73 65 72 74 28 20   buf;.  assert( 
1d220 69 64 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73 46  id );.  rc = osF
1d230 73 74 61 74 28 28 28 75 6e 69 78 46 69 6c 65 2a  stat(((unixFile*
1d240 29 69 64 29 2d 3e 68 2c 20 26 62 75 66 29 3b 0a  )id)->h, &buf);.
1d250 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1d260 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28  r( rc=1 );.  if(
1d270 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 74   rc!=0 ){.    st
1d280 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 28 75 6e  oreLastErrno((un
1d290 69 78 46 69 6c 65 2a 29 69 64 2c 20 65 72 72 6e  ixFile*)id, errn
1d2a0 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  o);.    return S
1d2b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
1d2c0 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20  T;.  }.  *pSize 
1d2d0 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a  = buf.st_size;..
1d2e0 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e    /* When openin
1d2f0 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20 64 61  g a zero-size da
1d300 74 61 62 61 73 65 2c 20 74 68 65 20 66 69 6e 64  tabase, the find
1d310 49 6e 6f 64 65 49 6e 66 6f 28 29 20 70 72 6f 63  InodeInfo() proc
1d320 65 64 75 72 65 0a 20 20 2a 2a 20 77 72 69 74 65  edure.  ** write
1d330 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  s a single byte 
1d340 69 6e 74 6f 20 74 68 61 74 20 66 69 6c 65 20 69  into that file i
1d350 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b 20  n order to work 
1d360 61 72 6f 75 6e 64 20 61 20 62 75 67 0a 20 20 2a  around a bug.  *
1d370 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58 20 6d 73  * in the OS-X ms
1d380 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2e 20  dos filesystem. 
1d390 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f   In order to avo
1d3a0 69 64 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68  id problems with
1d3b0 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61 79 65   upper.  ** laye
1d3c0 72 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72  rs, we need to r
1d3d0 65 70 6f 72 74 20 74 68 69 73 20 66 69 6c 65 20  eport this file 
1d3e0 73 69 7a 65 20 61 73 20 7a 65 72 6f 20 65 76 65  size as zero eve
1d3f0 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 0a 20  n though it is. 
1d400 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20 20 20   ** really 1.   
1d410 54 69 63 6b 65 74 20 23 33 32 36 30 2e 0a 20 20  Ticket #3260..  
1d420 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a 65 3d  */.  if( *pSize=
1d430 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d 20 30 3b  =1 ) *pSize = 0;
1d440 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ...  return SQLI
1d450 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51  TE_OK;.}..#if SQ
1d460 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1d470 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
1d480 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
1d490 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20 66 6f  /*.** Handler fo
1d4a0 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20  r proxy-locking 
1d4b0 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76 65 72  file-control ver
1d4c0 62 73 2e 20 20 44 65 66 69 6e 65 64 20 62 65 6c  bs.  Defined bel
1d4d0 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70 72 6f  ow in the.** pro
1d4e0 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 64 69  xying locking di
1d4f0 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  vision..*/.stati
1d500 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c 65 43  c int proxyFileC
1d510 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66  ontrol(sqlite3_f
1d520 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b  ile*,int,void*);
1d530 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20  .#endif../* .** 
1d540 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1d550 20 63 61 6c 6c 65 64 20 74 6f 20 68 61 6e 64 6c   called to handl
1d560 65 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e  e the SQLITE_FCN
1d570 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 0a 2a 2a  TL_SIZE_HINT .**
1d580 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6f 70   file-control op
1d590 65 72 61 74 69 6f 6e 2e 20 20 45 6e 6c 61 72 67  eration.  Enlarg
1d5a0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
1d5b0 6f 20 6e 42 79 74 65 73 20 69 6e 20 73 69 7a 65  o nBytes in size
1d5c0 0a 2a 2a 20 28 72 6f 75 6e 64 65 64 20 75 70 20  .** (rounded up 
1d5d0 74 6f 20 74 68 65 20 6e 65 78 74 20 63 68 75 6e  to the next chun
1d5e0 6b 2d 73 69 7a 65 29 2e 20 20 49 66 20 74 68 65  k-size).  If the
1d5f0 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72   database is alr
1d600 65 61 64 79 0a 2a 2a 20 6e 42 79 74 65 73 20 6f  eady.** nBytes o
1d610 72 20 6c 61 72 67 65 72 2c 20 74 68 69 73 20 72  r larger, this r
1d620 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
1d630 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
1d640 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 75   fcntlSizeHint(u
1d650 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
1d660 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 66  i64 nByte){.  if
1d670 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
1d680 3e 30 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 53  >0 ){.    i64 nS
1d690 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
1d6a0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69          /* Requi
1d6b0 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f  red file size */
1d6c0 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
1d6d0 20 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20   buf;           
1d6e0 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 68 6f     /* Used to ho
1d6f0 6c 64 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73  ld return values
1d700 20 6f 66 20 66 73 74 61 74 28 29 20 2a 2f 0a 20   of fstat() */. 
1d710 20 20 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74    .    if( osFst
1d720 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75  at(pFile->h, &bu
1d730 66 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  f) ){.      retu
1d740 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1d750 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  FSTAT;.    }..  
1d760 20 20 6e 53 69 7a 65 20 3d 20 28 28 6e 42 79 74    nSize = ((nByt
1d770 65 2b 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  e+pFile->szChunk
1d780 2d 31 29 20 2f 20 70 46 69 6c 65 2d 3e 73 7a 43  -1) / pFile->szC
1d790 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73  hunk) * pFile->s
1d7a0 7a 43 68 75 6e 6b 3b 0a 20 20 20 20 69 66 28 20  zChunk;.    if( 
1d7b0 6e 53 69 7a 65 3e 28 69 36 34 29 62 75 66 2e 73  nSize>(i64)buf.s
1d7c0 74 5f 73 69 7a 65 20 29 7b 0a 0a 23 69 66 20 64  t_size ){..#if d
1d7d0 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49  efined(HAVE_POSI
1d7e0 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20  X_FALLOCATE) && 
1d7f0 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f  HAVE_POSIX_FALLO
1d800 43 41 54 45 0a 20 20 20 20 20 20 2f 2a 20 54 68  CATE.      /* Th
1d810 65 20 63 6f 64 65 20 62 65 6c 6f 77 20 69 73 20  e code below is 
1d820 68 61 6e 64 6c 69 6e 67 20 74 68 65 20 72 65 74  handling the ret
1d830 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 6f 73 46  urn value of osF
1d840 61 6c 6c 6f 63 61 74 65 28 29 20 0a 20 20 20 20  allocate() .    
1d850 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20    ** correctly. 
1d860 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28  posix_fallocate(
1d870 29 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20  ) is defined to 
1d880 22 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 6f 6e  "returns zero on
1d890 20 73 75 63 63 65 73 73 2c 20 0a 20 20 20 20 20   success, .     
1d8a0 20 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 20   ** or an error 
1d8b0 6e 75 6d 62 65 72 20 6f 6e 20 20 66 61 69 6c 75  number on  failu
1d8c0 72 65 22 2e 20 53 65 65 20 74 68 65 20 6d 61 6e  re". See the man
1d8d0 70 61 67 65 20 66 6f 72 20 64 65 74 61 69 6c 73  page for details
1d8e0 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 65  . */.      int e
1d8f0 72 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20  rr;.      do{.  
1d900 20 20 20 20 20 20 65 72 72 20 3d 20 6f 73 46 61        err = osFa
1d910 6c 6c 6f 63 61 74 65 28 70 46 69 6c 65 2d 3e 68  llocate(pFile->h
1d920 2c 20 62 75 66 2e 73 74 5f 73 69 7a 65 2c 20 6e  , buf.st_size, n
1d930 53 69 7a 65 2d 62 75 66 2e 73 74 5f 73 69 7a 65  Size-buf.st_size
1d940 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  );.      }while(
1d950 20 65 72 72 3d 3d 45 49 4e 54 52 20 29 3b 0a 20   err==EINTR );. 
1d960 20 20 20 20 20 69 66 28 20 65 72 72 20 29 20 72       if( err ) r
1d970 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1d980 52 52 5f 57 52 49 54 45 3b 0a 23 65 6c 73 65 0a  RR_WRITE;.#else.
1d990 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
1d9a0 4f 53 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  OS does not have
1d9b0 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65   posix_fallocate
1d9c0 28 29 2c 20 66 61 6b 65 20 69 74 2e 20 57 72 69  (), fake it. Wri
1d9d0 74 65 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 73  te a .      ** s
1d9e0 69 6e 67 6c 65 20 62 79 74 65 20 74 6f 20 74 68  ingle byte to th
1d9f0 65 20 6c 61 73 74 20 62 79 74 65 20 69 6e 20 65  e last byte in e
1da00 61 63 68 20 62 6c 6f 63 6b 20 74 68 61 74 20 66  ach block that f
1da10 61 6c 6c 73 20 65 6e 74 69 72 65 6c 79 0a 20 20  alls entirely.  
1da20 20 20 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68      ** within th
1da30 65 20 65 78 74 65 6e 64 65 64 20 72 65 67 69 6f  e extended regio
1da40 6e 2e 20 54 68 65 6e 2c 20 69 66 20 72 65 71 75  n. Then, if requ
1da50 69 72 65 64 2c 20 61 20 73 69 6e 67 6c 65 20 62  ired, a single b
1da60 79 74 65 0a 20 20 20 20 20 20 2a 2a 20 61 74 20  yte.      ** at 
1da70 6f 66 66 73 65 74 20 28 6e 53 69 7a 65 2d 31 29  offset (nSize-1)
1da80 2c 20 74 6f 20 73 65 74 20 74 68 65 20 73 69 7a  , to set the siz
1da90 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f  e of the file co
1daa0 72 72 65 63 74 6c 79 2e 0a 20 20 20 20 20 20 2a  rrectly..      *
1dab0 2a 20 54 68 69 73 20 69 73 20 61 20 73 69 6d 69  * This is a simi
1dac0 6c 61 72 20 74 65 63 68 6e 69 71 75 65 20 74 6f  lar technique to
1dad0 20 74 68 61 74 20 75 73 65 64 20 62 79 20 67 6c   that used by gl
1dae0 69 62 63 20 6f 6e 20 73 79 73 74 65 6d 73 0a 20  ibc on systems. 
1daf0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 20       ** that do 
1db00 6e 6f 74 20 68 61 76 65 20 61 20 72 65 61 6c 20  not have a real 
1db10 66 61 6c 6c 6f 63 61 74 65 28 29 20 63 61 6c 6c  fallocate() call
1db20 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1db30 20 69 6e 74 20 6e 42 6c 6b 20 3d 20 62 75 66 2e   int nBlk = buf.
1db40 73 74 5f 62 6c 6b 73 69 7a 65 3b 20 20 2f 2a 20  st_blksize;  /* 
1db50 46 69 6c 65 2d 73 79 73 74 65 6d 20 62 6c 6f 63  File-system bloc
1db60 6b 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20  k size */.      
1db70 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 20  int nWrite = 0; 
1db80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1db90 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77  umber of bytes w
1dba0 72 69 74 74 65 6e 20 62 79 20 73 65 65 6b 41 6e  ritten by seekAn
1dbb0 64 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20  dWrite */.      
1dbc0 69 36 34 20 69 57 72 69 74 65 3b 20 20 20 20 20  i64 iWrite;     
1dbd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1dbe0 65 78 74 20 6f 66 66 73 65 74 20 74 6f 20 77 72  ext offset to wr
1dbf0 69 74 65 20 74 6f 20 2a 2f 0a 0a 20 20 20 20 20  ite to */..     
1dc00 20 69 57 72 69 74 65 20 3d 20 28 62 75 66 2e 73   iWrite = (buf.s
1dc10 74 5f 73 69 7a 65 2f 6e 42 6c 6b 29 2a 6e 42 6c  t_size/nBlk)*nBl
1dc20 6b 20 2b 20 6e 42 6c 6b 20 2d 20 31 3b 0a 20 20  k + nBlk - 1;.  
1dc30 20 20 20 20 61 73 73 65 72 74 28 20 69 57 72 69      assert( iWri
1dc40 74 65 3e 3d 62 75 66 2e 73 74 5f 73 69 7a 65 20  te>=buf.st_size 
1dc50 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1dc60 20 28 28 69 57 72 69 74 65 2b 31 29 25 6e 42 6c   ((iWrite+1)%nBl
1dc70 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66  k)==0 );.      f
1dc80 6f 72 28 2f 2a 6e 6f 2d 6f 70 2a 2f 3b 20 69 57  or(/*no-op*/; iW
1dc90 72 69 74 65 3c 6e 53 69 7a 65 2b 6e 42 6c 6b 2d  rite<nSize+nBlk-
1dca0 31 3b 20 69 57 72 69 74 65 2b 3d 6e 42 6c 6b 20  1; iWrite+=nBlk 
1dcb0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
1dcc0 57 72 69 74 65 3e 3d 6e 53 69 7a 65 20 29 20 69  Write>=nSize ) i
1dcd0 57 72 69 74 65 20 3d 20 6e 53 69 7a 65 20 2d 20  Write = nSize - 
1dce0 31 3b 0a 20 20 20 20 20 20 20 20 6e 57 72 69 74  1;.        nWrit
1dcf0 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65  e = seekAndWrite
1dd00 28 70 46 69 6c 65 2c 20 69 57 72 69 74 65 2c 20  (pFile, iWrite, 
1dd10 22 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  "", 1);.        
1dd20 69 66 28 20 6e 57 72 69 74 65 21 3d 31 20 29 20  if( nWrite!=1 ) 
1dd30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1dd40 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 20  ERR_WRITE;.     
1dd50 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
1dd60 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f    }..#if SQLITE_
1dd70 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
1dd80 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d 6d 61    if( pFile->mma
1dd90 70 53 69 7a 65 4d 61 78 3e 30 20 26 26 20 6e 42  pSizeMax>0 && nB
1dda0 79 74 65 3e 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  yte>pFile->mmapS
1ddb0 69 7a 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ize ){.    int r
1ddc0 63 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65  c;.    if( pFile
1ddd0 2d 3e 73 7a 43 68 75 6e 6b 3c 3d 30 20 29 7b 0a  ->szChunk<=0 ){.
1dde0 20 20 20 20 20 20 69 66 28 20 72 6f 62 75 73 74        if( robust
1ddf0 5f 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65  _ftruncate(pFile
1de00 2d 3e 68 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20  ->h, nByte) ){. 
1de10 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
1de20 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72  Errno(pFile, err
1de30 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  no);.        ret
1de40 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  urn unixLogError
1de50 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52  (SQLITE_IOERR_TR
1de60 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61  UNCATE, "ftrunca
1de70 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  te", pFile->zPat
1de80 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  h);.      }.    
1de90 7d 0a 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78  }..    rc = unix
1dea0 4d 61 70 66 69 6c 65 28 70 46 69 6c 65 2c 20 6e  Mapfile(pFile, n
1deb0 42 79 74 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Byte);.    retur
1dec0 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
1ded0 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
1dee0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
1def0 66 20 2a 70 41 72 67 20 69 73 20 69 6e 69 74 69  f *pArg is initi
1df00 61 6c 6c 79 20 6e 65 67 61 74 69 76 65 20 74 68  ally negative th
1df10 65 6e 20 74 68 69 73 20 69 73 20 61 20 71 75 65  en this is a que
1df20 72 79 2e 20 20 53 65 74 20 2a 70 41 72 67 20 74  ry.  Set *pArg t
1df30 6f 0a 2a 2a 20 31 20 6f 72 20 30 20 64 65 70 65  o.** 1 or 0 depe
1df40 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72  nding on whether
1df50 20 6f 72 20 6e 6f 74 20 62 69 74 20 6d 61 73 6b   or not bit mask
1df60 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46   of pFile->ctrlF
1df70 6c 61 67 73 20 69 73 20 73 65 74 2e 0a 2a 2a 0a  lags is set..**.
1df80 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20 30  ** If *pArg is 0
1df90 20 6f 72 20 31 2c 20 74 68 65 6e 20 63 6c 65 61   or 1, then clea
1dfa0 72 20 6f 72 20 73 65 74 20 74 68 65 20 6d 61 73  r or set the mas
1dfb0 6b 20 62 69 74 20 6f 66 20 70 46 69 6c 65 2d 3e  k bit of pFile->
1dfc0 63 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74  ctrlFlags..*/.st
1dfd0 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 4d 6f  atic void unixMo
1dfe0 64 65 42 69 74 28 75 6e 69 78 46 69 6c 65 20 2a  deBit(unixFile *
1dff0 70 46 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20  pFile, unsigned 
1e000 63 68 61 72 20 6d 61 73 6b 2c 20 69 6e 74 20 2a  char mask, int *
1e010 70 41 72 67 29 7b 0a 20 20 69 66 28 20 2a 70 41  pArg){.  if( *pA
1e020 72 67 3c 30 20 29 7b 0a 20 20 20 20 2a 70 41 72  rg<0 ){.    *pAr
1e030 67 20 3d 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c  g = (pFile->ctrl
1e040 46 6c 61 67 73 20 26 20 6d 61 73 6b 29 21 3d 30  Flags & mask)!=0
1e050 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 2a  ;.  }else if( (*
1e060 70 41 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20  pArg)==0 ){.    
1e070 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
1e080 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c   &= ~mask;.  }el
1e090 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63  se{.    pFile->c
1e0a0 74 72 6c 46 6c 61 67 73 20 7c 3d 20 6d 61 73 6b  trlFlags |= mask
1e0b0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  ;.  }.}../* Forw
1e0c0 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ard declaration 
1e0d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1e0e0 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e  ixGetTempname(in
1e0f0 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
1e100 75 66 29 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f  uf);../*.** Info
1e110 72 6d 61 74 69 6f 6e 20 61 6e 64 20 63 6f 6e 74  rmation and cont
1e120 72 6f 6c 20 6f 66 20 61 6e 20 6f 70 65 6e 20 66  rol of an open f
1e130 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  ile handle..*/.s
1e140 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69  tatic int unixFi
1e150 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65  leControl(sqlite
1e160 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
1e170 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  op, void *pArg){
1e180 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
1e190 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
1e1a0 69 64 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  id;.  switch( op
1e1b0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
1e1c0 49 54 45 5f 46 43 4e 54 4c 5f 57 41 4c 5f 42 4c  ITE_FCNTL_WAL_BL
1e1d0 4f 43 4b 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  OCK: {.      /* 
1e1e0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
1e1f0 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 42 4c 4f   |= UNIXFILE_BLO
1e200 43 4b 3b 20 2f 2f 20 44 65 66 65 72 72 65 64 20  CK; // Deferred 
1e210 66 65 61 74 75 72 65 20 2a 2f 0a 20 20 20 20 20  feature */.     
1e220 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1e230 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1e240 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c  e SQLITE_FCNTL_L
1e250 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20  OCKSTATE: {.    
1e260 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20    *(int*)pArg = 
1e270 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
1e280 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1e290 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1e2a0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1e2b0 46 43 4e 54 4c 5f 4c 41 53 54 5f 45 52 52 4e 4f  FCNTL_LAST_ERRNO
1e2c0 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a  : {.      *(int*
1e2d0 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c  )pArg = pFile->l
1e2e0 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  astErrno;.      
1e2f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e300 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e310 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48   SQLITE_FCNTL_CH
1e320 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20  UNK_SIZE: {.    
1e330 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b    pFile->szChunk
1e340 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b   = *(int *)pArg;
1e350 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1e360 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1e370 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1e380 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20  CNTL_SIZE_HINT: 
1e390 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a  {.      int rc;.
1e3a0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1e3b0 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
1e3c0 20 20 20 20 20 20 72 63 20 3d 20 66 63 6e 74 6c        rc = fcntl
1e3d0 53 69 7a 65 48 69 6e 74 28 70 46 69 6c 65 2c 20  SizeHint(pFile, 
1e3e0 2a 28 69 36 34 20 2a 29 70 41 72 67 29 3b 0a 20  *(i64 *)pArg);. 
1e3f0 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
1e400 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
1e410 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1e420 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1e430 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53  QLITE_FCNTL_PERS
1e440 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20  IST_WAL: {.     
1e450 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 70 46 69   unixModeBit(pFi
1e460 6c 65 2c 20 55 4e 49 58 46 49 4c 45 5f 50 45 52  le, UNIXFILE_PER
1e470 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a 29  SIST_WAL, (int*)
1e480 70 41 72 67 29 3b 0a 20 20 20 20 20 20 72 65 74  pArg);.      ret
1e490 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1e4a0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1e4b0 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52  LITE_FCNTL_POWER
1e4c0 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 20  SAFE_OVERWRITE: 
1e4d0 7b 0a 20 20 20 20 20 20 75 6e 69 78 4d 6f 64 65  {.      unixMode
1e4e0 42 69 74 28 70 46 69 6c 65 2c 20 55 4e 49 58 46  Bit(pFile, UNIXF
1e4f0 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a 29  ILE_PSOW, (int*)
1e500 70 41 72 67 29 3b 0a 20 20 20 20 20 20 72 65 74  pArg);.      ret
1e510 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1e520 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1e530 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41  LITE_FCNTL_VFSNA
1e540 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 63 68  ME: {.      *(ch
1e550 61 72 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69  ar**)pArg = sqli
1e560 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
1e570 2c 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 7a  , pFile->pVfs->z
1e580 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Name);.      ret
1e590 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1e5a0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1e5b0 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46  LITE_FCNTL_TEMPF
1e5c0 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20  ILENAME: {.     
1e5d0 20 63 68 61 72 20 2a 7a 54 46 69 6c 65 20 3d 20   char *zTFile = 
1e5e0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
1e5f0 28 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d  ( pFile->pVfs->m
1e600 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20 20  xPathname );.   
1e610 20 20 20 69 66 28 20 7a 54 46 69 6c 65 20 29 7b     if( zTFile ){
1e620 0a 20 20 20 20 20 20 20 20 75 6e 69 78 47 65 74  .        unixGet
1e630 54 65 6d 70 6e 61 6d 65 28 70 46 69 6c 65 2d 3e  Tempname(pFile->
1e640 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
1e650 2c 20 7a 54 46 69 6c 65 29 3b 0a 20 20 20 20 20  , zTFile);.     
1e660 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67     *(char**)pArg
1e670 20 3d 20 7a 54 46 69 6c 65 3b 0a 20 20 20 20 20   = zTFile;.     
1e680 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
1e690 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1e6a0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1e6b0 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f 56 45 44  _FCNTL_HAS_MOVED
1e6c0 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a  : {.      *(int*
1e6d0 29 70 41 72 67 20 3d 20 66 69 6c 65 48 61 73 4d  )pArg = fileHasM
1e6e0 6f 76 65 64 28 70 46 69 6c 65 29 3b 0a 20 20 20  oved(pFile);.   
1e6f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1e700 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69 66 20 53  _OK;.    }.#if S
1e710 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
1e720 49 5a 45 3e 30 0a 20 20 20 20 63 61 73 65 20 53  IZE>0.    case S
1e730 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50  QLITE_FCNTL_MMAP
1e740 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 69  _SIZE: {.      i
1e750 36 34 20 6e 65 77 4c 69 6d 69 74 20 3d 20 2a 28  64 newLimit = *(
1e760 69 36 34 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  i64*)pArg;.     
1e770 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1e780 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  _OK;.      if( n
1e790 65 77 4c 69 6d 69 74 3e 73 71 6c 69 74 65 33 47  ewLimit>sqlite3G
1e7a0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d  lobalConfig.mxMm
1e7b0 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65  ap ){.        ne
1e7c0 77 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33  wLimit = sqlite3
1e7d0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d  GlobalConfig.mxM
1e7e0 6d 61 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  map;.      }.   
1e7f0 20 20 20 2a 28 69 36 34 2a 29 70 41 72 67 20 3d     *(i64*)pArg =
1e800 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
1e810 4d 61 78 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  Max;.      if( n
1e820 65 77 4c 69 6d 69 74 3e 3d 30 20 26 26 20 6e 65  ewLimit>=0 && ne
1e830 77 4c 69 6d 69 74 21 3d 70 46 69 6c 65 2d 3e 6d  wLimit!=pFile->m
1e840 6d 61 70 53 69 7a 65 4d 61 78 20 26 26 20 70 46  mapSizeMax && pF
1e850 69 6c 65 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d  ile->nFetchOut==
1e860 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  0 ){.        pFi
1e870 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20  le->mmapSizeMax 
1e880 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 20 20  = newLimit;.    
1e890 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d      if( pFile->m
1e8a0 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20  mapSize>0 ){.   
1e8b0 20 20 20 20 20 20 20 75 6e 69 78 55 6e 6d 61 70         unixUnmap
1e8c0 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20 20  file(pFile);.   
1e8d0 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
1e8e0 4d 61 70 66 69 6c 65 28 70 46 69 6c 65 2c 20 2d  Mapfile(pFile, -
1e8f0 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  1);.        }.  
1e900 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
1e910 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23 65 6e  rn rc;.    }.#en
1e920 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
1e930 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54  E_DEBUG.    /* T
1e940 68 65 20 70 61 67 65 72 20 63 61 6c 6c 73 20 74  he pager calls t
1e950 68 69 73 20 6d 65 74 68 6f 64 20 74 6f 20 73 69  his method to si
1e960 67 6e 61 6c 20 74 68 61 74 20 69 74 20 68 61 73  gnal that it has
1e970 20 64 6f 6e 65 0a 20 20 20 20 2a 2a 20 61 20 72   done.    ** a r
1e980 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 74 68 61 74  ollback and that
1e990 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1e9a0 20 74 68 65 72 65 66 6f 72 65 20 75 6e 63 68 61   therefore uncha
1e9b0 6e 67 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20  nged and.    ** 
1e9c0 69 74 20 68 65 6e 63 65 20 69 74 20 69 73 20 4f  it hence it is O
1e9d0 4b 20 66 6f 72 20 74 68 65 20 74 72 61 6e 73 61  K for the transa
1e9e0 63 74 69 6f 6e 20 63 68 61 6e 67 65 20 63 6f 75  ction change cou
1e9f0 6e 74 65 72 20 74 6f 20 62 65 0a 20 20 20 20 2a  nter to be.    *
1ea00 2a 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 20  * unchanged..   
1ea10 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1ea20 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43  ITE_FCNTL_DB_UNC
1ea30 48 41 4e 47 45 44 3a 20 7b 0a 20 20 20 20 20 20  HANGED: {.      
1ea40 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
1ea50 3e 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a 20  >dbUpdate = 0;. 
1ea60 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1ea70 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e  TE_OK;.    }.#en
1ea80 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  dif.#if SQLITE_E
1ea90 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1eaa0 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
1eab0 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20 63 61  _APPLE__).    ca
1eac0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1ead0 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
1eae0 45 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  E:.    case SQLI
1eaf0 54 45 5f 46 43 4e 54 4c 5f 47 45 54 5f 4c 4f 43  TE_FCNTL_GET_LOC
1eb00 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20  KPROXYFILE: {.  
1eb10 20 20 20 20 72 65 74 75 72 6e 20 70 72 6f 78 79      return proxy
1eb20 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f  FileControl(id,o
1eb30 70 2c 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a 23  p,pArg);.    }.#
1eb40 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1eb50 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1eb60 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28  TYLE && defined(
1eb70 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20  __APPLE__) */.  
1eb80 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1eb90 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f  E_NOTFOUND;.}../
1eba0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1ebb0 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62  sector size in b
1ebc0 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65  ytes of the unde
1ebd0 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76  rlying block dev
1ebe0 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73  ice for.** the s
1ebf0 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54  pecified file. T
1ec00 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c  his is almost al
1ec10 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2c 20  ways 512 bytes, 
1ec20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61  but may be.** la
1ec30 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65  rger for some de
1ec40 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  vices..**.** SQL
1ec50 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73  ite code assumes
1ec60 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   this function c
1ec70 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61  annot fail. It a
1ec80 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74  lso assumes that
1ec90 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73  .** if two files
1eca0 20 61 72 65 20 63 72 65 61 74 65 64 20 69 6e 20   are created in 
1ecb0 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79  the same file-sy
1ecc0 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28  stem directory (
1ecd0 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61  i.e..** a databa
1ece0 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e  se and its journ
1ecf0 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74 68  al file) that th
1ed00 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69  e sector size wi
1ed10 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d  ll be the.** sam
1ed20 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 23  e for both..*/.#
1ed30 69 66 6e 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f  ifndef __QNXNTO_
1ed40 5f 20 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  _ .static int un
1ed50 69 78 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c  ixSectorSize(sql
1ed60 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73  ite3_file *NotUs
1ed70 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ed){.  UNUSED_PA
1ed80 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
1ed90 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1eda0 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52  E_DEFAULT_SECTOR
1edb0 5f 53 49 5a 45 3b 0a 7d 0a 23 65 6e 64 69 66 0a  _SIZE;.}.#endif.
1edc0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
1edd0 77 69 6e 67 20 76 65 72 73 69 6f 6e 20 6f 66 20  wing version of 
1ede0 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28 29  unixSectorSize()
1edf0 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 66 6f   is optimized fo
1ee00 72 20 51 4e 58 2e 0a 2a 2f 0a 23 69 66 64 65 66  r QNX..*/.#ifdef
1ee10 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 23 69 6e 63   __QNXNTO__.#inc
1ee20 6c 75 64 65 20 3c 73 79 73 2f 64 63 6d 64 5f 62  lude <sys/dcmd_b
1ee30 6c 6b 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  lk.h>.#include <
1ee40 73 79 73 2f 73 74 61 74 76 66 73 2e 68 3e 0a 73  sys/statvfs.h>.s
1ee50 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65  tatic int unixSe
1ee60 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33  ctorSize(sqlite3
1ee70 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e  _file *id){.  un
1ee80 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
1ee90 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
1eea0 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 65 63 74   if( pFile->sect
1eeb0 6f 72 53 69 7a 65 20 3d 3d 20 30 20 29 7b 0a 20  orSize == 0 ){. 
1eec0 20 20 20 73 74 72 75 63 74 20 73 74 61 74 76 66     struct statvf
1eed0 73 20 66 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20  s fsInfo;.      
1eee0 20 0a 20 20 20 20 2f 2a 20 53 65 74 20 64 65 66   .    /* Set def
1eef0 61 75 6c 74 73 20 66 6f 72 20 6e 6f 6e 2d 73 75  aults for non-su
1ef00 70 70 6f 72 74 65 64 20 66 69 6c 65 73 79 73 74  pported filesyst
1ef10 65 6d 73 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65  ems */.    pFile
1ef20 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 53  ->sectorSize = S
1ef30 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45  QLITE_DEFAULT_SE
1ef40 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 20 20 70  CTOR_SIZE;.    p
1ef50 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72  File->deviceChar
1ef60 61 63 74 65 72 69 73 74 69 63 73 20 3d 20 30 3b  acteristics = 0;
1ef70 0a 20 20 20 20 69 66 28 20 66 73 74 61 74 76 66  .    if( fstatvf
1ef80 73 28 70 46 69 6c 65 2d 3e 68 2c 20 26 66 73 49  s(pFile->h, &fsI
1ef90 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 20 7b 0a 20  nfo) == -1 ) {. 
1efa0 20 20 20 20 20 72 65 74 75 72 6e 20 70 46 69 6c       return pFil
1efb0 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20  e->sectorSize;. 
1efc0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 73     }..    if( !s
1efd0 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 62  trcmp(fsInfo.f_b
1efe0 61 73 65 74 79 70 65 2c 20 22 74 6d 70 22 29 20  asetype, "tmp") 
1eff0 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ) {.      pFile-
1f000 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73  >sectorSize = fs
1f010 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20  Info.f_bsize;.  
1f020 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63      pFile->devic
1f030 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1f040 20 3d 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54   =.        SQLIT
1f050 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 34 4b  E_IOCAP_ATOMIC4K
1f060 20 7c 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20   |       /* All 
1f070 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 77  ram filesystem w
1f080 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63  rites are atomic
1f090 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49   */.        SQLI
1f0a0 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
1f0b0 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f  PEND |    /* gro
1f0c0 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f  wing the file do
1f0d0 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74  es not occur unt
1f0e0 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  il.             
1f0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f100 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
1f110 77 72 69 74 65 20 73 75 63 63 65 65 64 73 20 2a  write succeeds *
1f120 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  /.        SQLITE
1f130 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
1f140 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72  L |     /* The r
1f150 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61  am filesystem ha
1f160 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e  s no write behin
1f170 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
1f180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f190 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74          ** so it
1f1a0 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20   is ordered */. 
1f1b0 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65         0;.    }e
1f1c0 6c 73 65 20 69 66 28 20 73 74 72 73 74 72 28 66  lse if( strstr(f
1f1d0 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65  sInfo.f_basetype
1f1e0 2c 20 22 65 74 66 73 22 29 20 29 7b 0a 20 20 20  , "etfs") ){.   
1f1f0 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72     pFile->sector
1f200 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f  Size = fsInfo.f_
1f210 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69  bsize;.      pFi
1f220 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63  le->deviceCharac
1f230 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20  teristics =.    
1f240 20 20 20 20 2f 2a 20 65 74 66 73 20 63 6c 75 73      /* etfs clus
1f250 74 65 72 20 73 69 7a 65 20 77 72 69 74 65 73 20  ter size writes 
1f260 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20  are atomic */.  
1f270 20 20 20 20 20 20 28 70 46 69 6c 65 2d 3e 73 65        (pFile->se
1f280 63 74 6f 72 53 69 7a 65 20 2f 20 35 31 32 20 2a  ctorSize / 512 *
1f290 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54   SQLITE_IOCAP_AT
1f2a0 4f 4d 49 43 35 31 32 29 20 7c 0a 20 20 20 20 20  OMIC512) |.     
1f2b0 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
1f2c0 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20  SAFE_APPEND |   
1f2d0 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20   /* growing the 
1f2e0 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63  file does not oc
1f2f0 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20  cur until.      
1f300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f320 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73 75 63  ** the write suc
1f330 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20  ceeds */.       
1f340 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45   SQLITE_IOCAP_SE
1f350 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f  QUENTIAL |     /
1f360 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79  * The ram filesy
1f370 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74  stem has no writ
1f380 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20  e behind.       
1f390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1f3b0 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72  * so it is order
1f3c0 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b  ed */.        0;
1f3d0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21  .    }else if( !
1f3e0 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f  strcmp(fsInfo.f_
1f3f0 62 61 73 65 74 79 70 65 2c 20 22 71 6e 78 36 22  basetype, "qnx6"
1f400 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
1f410 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66  ->sectorSize = f
1f420 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20  sInfo.f_bsize;. 
1f430 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69       pFile->devi
1f440 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1f450 73 20 3d 0a 20 20 20 20 20 20 20 20 53 51 4c 49  s =.        SQLI
1f460 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 20  TE_IOCAP_ATOMIC 
1f470 7c 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c  |         /* All
1f480 20 66 69 6c 65 73 79 73 74 65 6d 20 77 72 69 74   filesystem writ
1f490 65 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f  es are atomic */
1f4a0 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
1f4b0 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
1f4c0 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e  D |    /* growin
1f4d0 67 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20  g the file does 
1f4e0 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a  not occur until.
1f4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f510 20 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69        ** the wri
1f520 74 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20  te succeeds */. 
1f530 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
1f540 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c  CAP_SEQUENTIAL |
1f550 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20       /* The ram 
1f560 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e  filesystem has n
1f570 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20  o write behind. 
1f580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5a0 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73       ** so it is
1f5b0 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20   ordered */.    
1f5c0 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65      0;.    }else
1f5d0 20 69 66 28 20 21 73 74 72 63 6d 70 28 66 73 49   if( !strcmp(fsI
1f5e0 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20  nfo.f_basetype, 
1f5f0 22 71 6e 78 34 22 29 20 29 7b 0a 20 20 20 20 20  "qnx4") ){.     
1f600 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
1f610 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73  ze = fsInfo.f_bs
1f620 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  ize;.      pFile
1f630 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
1f640 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20  ristics =.      
1f650 20 20 2f 2a 20 66 75 6c 6c 20 62 69 74 73 65 74    /* full bitset
1f660 20 6f 66 20 61 74 6f 6d 69 63 73 20 66 72 6f 6d   of atomics from
1f670 20 6d 61 78 20 73 65 63 74 6f 72 20 73 69 7a 65   max sector size
1f680 20 61 6e 64 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a   and smaller */.
1f690 20 20 20 20 20 20 20 20 28 28 70 46 69 6c 65 2d          ((pFile-
1f6a0 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20 35 31  >sectorSize / 51
1f6b0 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  2 * SQLITE_IOCAP
1f6c0 5f 41 54 4f 4d 49 43 35 31 32 29 20 3c 3c 20 31  _ATOMIC512) << 1
1f6d0 29 20 2d 20 32 20 7c 0a 20 20 20 20 20 20 20 20  ) - 2 |.        
1f6e0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
1f6f0 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a  UENTIAL |     /*
1f700 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73   The ram filesys
1f710 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65  tem has no write
1f720 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20   behind.        
1f730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1f750 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65   so it is ordere
1f760 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a  d */.        0;.
1f770 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
1f780 72 73 74 72 28 66 73 49 6e 66 6f 2e 66 5f 62 61  rstr(fsInfo.f_ba
1f790 73 65 74 79 70 65 2c 20 22 64 6f 73 22 29 20 29  setype, "dos") )
1f7a0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
1f7b0 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e  ectorSize = fsIn
1f7c0 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20  fo.f_bsize;.    
1f7d0 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43    pFile->deviceC
1f7e0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d  haracteristics =
1f7f0 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 75 6c 6c  .        /* full
1f800 20 62 69 74 73 65 74 20 6f 66 20 61 74 6f 6d 69   bitset of atomi
1f810 63 73 20 66 72 6f 6d 20 6d 61 78 20 73 65 63 74  cs from max sect
1f820 6f 72 20 73 69 7a 65 20 61 6e 64 20 73 6d 61 6c  or size and smal
1f830 6c 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 28  ler */.        (
1f840 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69  (pFile->sectorSi
1f850 7a 65 20 2f 20 35 31 32 20 2a 20 53 51 4c 49 54  ze / 512 * SQLIT
1f860 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31  E_IOCAP_ATOMIC51
1f870 32 29 20 3c 3c 20 31 29 20 2d 20 32 20 7c 0a 20  2) << 1) - 2 |. 
1f880 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
1f890 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c  CAP_SEQUENTIAL |
1f8a0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20       /* The ram 
1f8b0 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e  filesystem has n
1f8c0 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20  o write behind. 
1f8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8f0 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73       ** so it is
1f900 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20   ordered */.    
1f910 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65      0;.    }else
1f920 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64  {.      pFile->d
1f930 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1f940 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53  tics =.        S
1f950 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
1f960 49 43 35 31 32 20 7c 20 20 20 20 20 20 2f 2a 20  IC512 |      /* 
1f970 62 6c 6f 63 6b 73 20 61 72 65 20 61 74 6f 6d 69  blocks are atomi
1f980 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c  c */.        SQL
1f990 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
1f9a0 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72  PPEND |    /* gr
1f9b0 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64  owing the file d
1f9c0 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e  oes not occur un
1f9d0 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20  til.            
1f9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9f0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
1fa00 20 77 72 69 74 65 20 73 75 63 63 65 65 64 73 20   write succeeds 
1fa10 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20  */.        0;.  
1fa20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 4c 61 73    }.  }.  /* Las
1fa30 74 20 63 68 61 6e 63 65 20 76 65 72 69 66 69 63  t chance verific
1fa40 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73  ation.  If the s
1fa50 65 63 74 6f 72 20 73 69 7a 65 20 69 73 6e 27 74  ector size isn't
1fa60 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 35   a multiple of 5
1fa70 31 32 0a 20 20 2a 2a 20 74 68 65 6e 20 69 74 20  12.  ** then it 
1fa80 69 73 6e 27 74 20 76 61 6c 69 64 2e 2a 2f 0a 20  isn't valid.*/. 
1fa90 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 65 63 74   if( pFile->sect
1faa0 6f 72 53 69 7a 65 20 25 20 35 31 32 20 21 3d 20  orSize % 512 != 
1fab0 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  0 ){.    pFile->
1fac0 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
1fad0 73 74 69 63 73 20 3d 20 30 3b 0a 20 20 20 20 70  stics = 0;.    p
1fae0 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
1faf0 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
1fb00 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20  T_SECTOR_SIZE;. 
1fb10 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 46 69 6c   }.  return pFil
1fb20 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 7d  e->sectorSize;.}
1fb30 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 5f 51 4e 58  .#endif /* __QNX
1fb40 4e 54 4f 5f 5f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  NTO__ */../*.** 
1fb50 52 65 74 75 72 6e 20 74 68 65 20 64 65 76 69 63  Return the devic
1fb60 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
1fb70 73 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a  s for the file..
1fb80 2a 2a 0a 2a 2a 20 54 68 69 73 20 56 46 53 20 69  **.** This VFS i
1fb90 73 20 73 65 74 20 75 70 20 74 6f 20 72 65 74 75  s set up to retu
1fba0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rn SQLITE_IOCAP_
1fbb0 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
1fbc0 49 54 45 20 62 79 20 64 65 66 61 75 6c 74 2e 0a  ITE by default..
1fbd0 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74  ** However, that
1fbe0 20 63 68 6f 69 63 65 20 69 73 20 63 6f 6e 74 72   choice is contr
1fbf0 6f 76 65 72 73 69 61 6c 20 73 69 6e 63 65 20 74  oversial since t
1fc00 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65 20 75  echnically the u
1fc10 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 66 69 6c  nderlying.** fil
1fc20 65 20 73 79 73 74 65 6d 20 64 6f 65 73 20 6e 6f  e system does no
1fc30 74 20 61 6c 77 61 79 73 20 70 72 6f 76 69 64 65  t always provide
1fc40 20 70 6f 77 65 72 73 61 66 65 20 6f 76 65 72 77   powersafe overw
1fc50 72 69 74 65 73 2e 20 20 28 49 6e 20 6f 74 68 65  rites.  (In othe
1fc60 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 66 74 65  r.** words, afte
1fc70 72 20 61 20 70 6f 77 65 72 2d 6c 6f 73 73 20 65  r a power-loss e
1fc80 76 65 6e 74 2c 20 70 61 72 74 73 20 6f 66 20 74  vent, parts of t
1fc90 68 65 20 66 69 6c 65 20 74 68 61 74 20 77 65 72  he file that wer
1fca0 65 20 6e 65 76 65 72 0a 2a 2a 20 77 72 69 74 74  e never.** writt
1fcb0 65 6e 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20  en might end up 
1fcc0 62 65 69 6e 67 20 61 6c 74 65 72 65 64 2e 29 20  being altered.) 
1fcd0 20 48 6f 77 65 76 65 72 2c 20 6e 6f 6e 2d 50 53   However, non-PS
1fce0 4f 57 20 62 65 68 61 76 69 6f 72 20 69 73 20 76  OW behavior is v
1fcf0 65 72 79 2c 0a 2a 2a 20 76 65 72 79 20 72 61 72  ery,.** very rar
1fd00 65 2e 20 20 41 6e 64 20 61 73 73 65 72 74 69 6e  e.  And assertin
1fd10 67 20 50 53 4f 57 20 6d 61 6b 65 73 20 61 20 6c  g PSOW makes a l
1fd20 61 72 67 65 20 72 65 64 75 63 74 69 6f 6e 20 69  arge reduction i
1fd30 6e 20 74 68 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20  n the amount.** 
1fd40 6f 66 20 72 65 71 75 69 72 65 64 20 49 2f 4f 20  of required I/O 
1fd50 66 6f 72 20 6a 6f 75 72 6e 61 6c 69 6e 67 2c 20  for journaling, 
1fd60 73 69 6e 63 65 20 61 20 6c 6f 74 20 6f 66 20 70  since a lot of p
1fd70 61 64 64 69 6e 67 20 69 73 20 65 6c 69 6d 69 6e  adding is elimin
1fd80 61 74 65 64 2e 0a 2a 2a 20 20 48 65 6e 63 65 2c  ated..**  Hence,
1fd90 20 77 68 69 6c 65 20 50 4f 57 45 52 53 41 46 45   while POWERSAFE
1fda0 5f 4f 56 45 52 57 52 49 54 45 20 69 73 20 6f 6e  _OVERWRITE is on
1fdb0 20 62 79 20 64 65 66 61 75 6c 74 2c 20 74 68 65   by default, the
1fdc0 72 65 20 69 73 20 61 20 66 69 6c 65 2d 63 6f 6e  re is a file-con
1fdd0 74 72 6f 6c 0a 2a 2a 20 61 76 61 69 6c 61 62 6c  trol.** availabl
1fde0 65 20 74 6f 20 74 75 72 6e 20 69 74 20 6f 66 66  e to turn it off
1fdf0 20 61 6e 64 20 55 52 49 20 71 75 65 72 79 20 70   and URI query p
1fe00 61 72 61 6d 65 74 65 72 20 61 76 61 69 6c 61 62  arameter availab
1fe10 6c 65 20 74 6f 20 74 75 72 6e 20 69 74 20 6f 66  le to turn it of
1fe20 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  f..*/.static int
1fe30 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72 61   unixDeviceChara
1fe40 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69 74  cteristics(sqlit
1fe50 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20  e3_file *id){.  
1fe60 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d 20 28 75  unixFile *p = (u
1fe70 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
1fe80 6e 74 20 72 63 20 3d 20 30 3b 0a 23 69 66 64 65  nt rc = 0;.#ifde
1fe90 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 20 20 69  f __QNXNTO__.  i
1fea0 66 28 20 70 2d 3e 73 65 63 74 6f 72 53 69 7a 65  f( p->sectorSize
1feb0 3d 3d 30 20 29 20 75 6e 69 78 53 65 63 74 6f 72  ==0 ) unixSector
1fec0 53 69 7a 65 28 69 64 29 3b 0a 20 20 72 63 20 3d  Size(id);.  rc =
1fed0 20 70 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63   p->deviceCharac
1fee0 74 65 72 69 73 74 69 63 73 3b 0a 23 65 6e 64 69  teristics;.#endi
1fef0 66 0a 20 20 69 66 28 20 70 2d 3e 63 74 72 6c 46  f.  if( p->ctrlF
1ff00 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
1ff10 50 53 4f 57 20 29 7b 0a 20 20 20 20 72 63 20 7c  PSOW ){.    rc |
1ff20 3d 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50  = SQLITE_IOCAP_P
1ff30 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
1ff40 54 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  TE;.  }.  return
1ff50 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66   rc;.}..#if !def
1ff60 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1ff70 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f  _WAL) || SQLITE_
1ff80 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
1ff90 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1ffa0 65 20 73 79 73 74 65 6d 20 70 61 67 65 20 73 69  e system page si
1ffb0 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ze..**.** This f
1ffc0 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e  unction should n
1ffd0 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 64 69 72  ot be called dir
1ffe0 65 63 74 6c 79 20 62 79 20 6f 74 68 65 72 20 63  ectly by other c
1fff0 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65  ode in this file
20000 2e 20 0a 2a 2a 20 49 6e 73 74 65 61 64 2c 20 69  . .** Instead, i
20010 74 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  t should be call
20020 65 64 20 76 69 61 20 6d 61 63 72 6f 20 6f 73 47  ed via macro osG
20030 65 74 70 61 67 65 73 69 7a 65 28 29 2e 0a 2a 2f  etpagesize()..*/
20040 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
20050 47 65 74 70 61 67 65 73 69 7a 65 28 76 6f 69 64  Getpagesize(void
20060 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  ){.#if OS_VXWORK
20070 53 0a 20 20 72 65 74 75 72 6e 20 31 30 32 34 3b  S.  return 1024;
20080 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 5f  .#elif defined(_
20090 42 53 44 5f 53 4f 55 52 43 45 29 0a 20 20 72 65  BSD_SOURCE).  re
200a0 74 75 72 6e 20 67 65 74 70 61 67 65 73 69 7a 65  turn getpagesize
200b0 28 29 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75  ();.#else.  retu
200c0 72 6e 20 28 69 6e 74 29 73 79 73 63 6f 6e 66 28  rn (int)sysconf(
200d0 5f 53 43 5f 50 41 47 45 53 49 5a 45 29 3b 0a 23  _SC_PAGESIZE);.#
200e0 65 6e 64 69 66 0a 7d 0a 0a 23 65 6e 64 69 66 20  endif.}..#endif 
200f0 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
20100 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20  TE_OMIT_WAL) || 
20110 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
20120 53 49 5a 45 3e 30 20 2a 2f 0a 0a 23 69 66 6e 64  SIZE>0 */..#ifnd
20130 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
20140 41 4c 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74  AL../*.** Object
20150 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65   used to represe
20160 6e 74 20 61 6e 20 73 68 61 72 65 64 20 6d 65 6d  nt an shared mem
20170 6f 72 79 20 62 75 66 66 65 72 2e 20 20 0a 2a 2a  ory buffer.  .**
20180 0a 2a 2a 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c  .** When multipl
20190 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20 72 65  e threads all re
201a0 66 65 72 65 6e 63 65 20 74 68 65 20 73 61 6d 65  ference the same
201b0 20 77 61 6c 2d 69 6e 64 65 78 2c 20 65 61 63 68   wal-index, each
201c0 20 74 68 72 65 61 64 0a 2a 2a 20 68 61 73 20 69   thread.** has i
201d0 74 73 20 6f 77 6e 20 75 6e 69 78 53 68 6d 20 6f  ts own unixShm o
201e0 62 6a 65 63 74 2c 20 62 75 74 20 74 68 65 79 20  bject, but they 
201f0 61 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 61 20 73  all point to a s
20200 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65 0a 2a  ingle instance.*
20210 2a 20 6f 66 20 74 68 69 73 20 75 6e 69 78 53 68  * of this unixSh
20220 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 2e 20 20 49  mNode object.  I
20230 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 65  n other words, e
20240 61 63 68 20 77 61 6c 2d 69 6e 64 65 78 20 69 73  ach wal-index is
20250 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 6c 79 20   opened.** only 
20260 6f 6e 63 65 20 70 65 72 20 70 72 6f 63 65 73 73  once per process
20270 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 75 6e 69  ..**.** Each uni
20280 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20  xShmNode object 
20290 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20  is connected to 
202a0 61 20 73 69 6e 67 6c 65 20 75 6e 69 78 49 6e 6f  a single unixIno
202b0 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a  deInfo object..*
202c0 2a 20 57 65 20 63 6f 75 6c 64 20 63 6f 61 6c 65  * We could coale
202d0 73 63 65 20 74 68 69 73 20 6f 62 6a 65 63 74 20  sce this object 
202e0 69 6e 74 6f 20 75 6e 69 78 49 6e 6f 64 65 49 6e  into unixInodeIn
202f0 66 6f 2c 20 62 75 74 20 74 68 61 74 20 77 6f 75  fo, but that wou
20300 6c 64 20 6d 65 61 6e 0a 2a 2a 20 65 76 65 72 79  ld mean.** every
20310 20 6f 70 65 6e 20 66 69 6c 65 20 74 68 61 74 20   open file that 
20320 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 73 68 61  does not use sha
20330 72 65 64 20 6d 65 6d 6f 72 79 20 28 69 6e 20 6f  red memory (in o
20340 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 6f 73 74  ther words, most
20350 0a 2a 2a 20 6f 70 65 6e 20 66 69 6c 65 73 29 20  .** open files) 
20360 77 6f 75 6c 64 20 68 61 76 65 20 74 6f 20 63 61  would have to ca
20370 72 72 79 20 61 72 6f 75 6e 64 20 74 68 69 73 20  rry around this 
20380 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f  extra informatio
20390 6e 2e 20 20 53 6f 0a 2a 2a 20 74 68 65 20 75 6e  n.  So.** the un
203a0 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
203b0 63 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  ct contains a po
203c0 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 75 6e  inter to this un
203d0 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
203e0 0a 2a 2a 20 61 6e 64 20 74 68 65 20 75 6e 69 78  .** and the unix
203f0 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69  ShmNode object i
20400 73 20 63 72 65 61 74 65 64 20 6f 6e 6c 79 20 77  s created only w
20410 68 65 6e 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a  hen needed..**.*
20420 2a 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  * unixMutexHeld(
20430 29 20 6d 75 73 74 20 62 65 20 74 72 75 65 20 77  ) must be true w
20440 68 65 6e 20 63 72 65 61 74 69 6e 67 20 6f 72 20  hen creating or 
20450 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20 74 68  destroying.** th
20460 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 77 68 69  is object or whi
20470 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  le reading or wr
20480 69 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  iting the follow
20490 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a  ing fields:.**.*
204a0 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a 0a 2a  *      nRef.**.*
204b0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
204c0 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2d  fields are read-
204d0 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20 6f  only after the o
204e0 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64  bject is created
204f0 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20 66 69  :.** .**      fi
20500 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65 6e  d.**      zFilen
20510 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72  ame.**.** Either
20520 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6d 75 74   unixShmNode.mut
20530 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20  ex must be held 
20540 6f 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e  or unixShmNode.n
20550 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 75 6e  Ref==0 and.** un
20560 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73  ixMutexHeld() is
20570 20 74 72 75 65 20 77 68 65 6e 20 72 65 61 64 69   true when readi
20580 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e  ng or writing an
20590 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a 2a  y other field.**
205a0 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
205b0 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e  re..*/.struct un
205c0 69 78 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 75 6e  ixShmNode {.  un
205d0 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
205e0 6f 64 65 3b 20 20 20 20 20 2f 2a 20 75 6e 69 78  ode;     /* unix
205f0 49 6e 6f 64 65 49 6e 66 6f 20 74 68 61 74 20 6f  InodeInfo that o
20600 77 6e 73 20 74 68 69 73 20 53 48 4d 20 6e 6f 64  wns this SHM nod
20610 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d  e */.  sqlite3_m
20620 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20 20  utex *mutex;    
20630 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61 63    /* Mutex to ac
20640 63 65 73 73 20 74 68 69 73 20 6f 62 6a 65 63 74  cess this object
20650 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
20660 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
20670 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
20680 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a  mmapped file */.
20690 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20 20 20    int h;        
206a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
206b0 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  Open file descri
206c0 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  ptor */.  int sz
206d0 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  Region;         
206e0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
206f0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
20700 67 69 6f 6e 73 20 2a 2f 0a 20 20 75 31 36 20 6e  gions */.  u16 n
20710 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  Region;         
20720 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
20730 20 61 72 72 61 79 20 61 70 52 65 67 69 6f 6e 20   array apRegion 
20740 2a 2f 0a 20 20 75 38 20 69 73 52 65 61 64 6f 6e  */.  u8 isReadon
20750 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ly;             
20760 2f 2a 20 54 72 75 65 20 69 66 20 72 65 61 64 2d  /* True if read-
20770 6f 6e 6c 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a  only */.  char *
20780 2a 61 70 52 65 67 69 6f 6e 3b 20 20 20 20 20 20  *apRegion;      
20790 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
207a0 20 6d 61 70 70 65 64 20 73 68 61 72 65 64 2d 6d   mapped shared-m
207b0 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f  emory regions */
207c0 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
207d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
207e0 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 53   Number of unixS
207f0 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74  hm objects point
20800 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20  ing to this */. 
20810 20 75 6e 69 78 53 68 6d 20 2a 70 46 69 72 73 74   unixShm *pFirst
20820 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
20830 6c 6c 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63  ll unixShm objec
20840 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ts pointing to t
20850 68 69 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  his */.#ifdef SQ
20860 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20  LITE_DEBUG.  u8 
20870 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20  exclMask;       
20880 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
20890 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  of exclusive loc
208a0 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20  ks held */.  u8 
208b0 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20  sharedMask;     
208c0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
208d0 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  of shared locks 
208e0 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20 6e 65 78  held */.  u8 nex
208f0 74 53 68 6d 49 64 3b 20 20 20 20 20 20 20 20 20  tShmId;         
20900 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 76 61       /* Next ava
20910 69 6c 61 62 6c 65 20 75 6e 69 78 53 68 6d 2e 69  ilable unixShm.i
20920 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69  d value */.#endi
20930 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75  f.};../*.** Stru
20940 63 74 75 72 65 20 75 73 65 64 20 69 6e 74 65 72  cture used inter
20950 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20 56 46  nally by this VF
20960 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20  S to record the 
20970 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f  state of an.** o
20980 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  pen shared memor
20990 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  y connection..**
209a0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
209b0 67 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e 69  g fields are ini
209c0 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68  tialized when th
209d0 69 73 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65  is object is cre
209e0 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20  ated and.** are 
209f0 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61  read-only therea
20a00 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 75  fter:.**.**    u
20a10 6e 69 78 53 68 6d 2e 70 46 69 6c 65 0a 2a 2a 20  nixShm.pFile.** 
20a20 20 20 20 75 6e 69 78 53 68 6d 2e 69 64 0a 2a 2a     unixShm.id.**
20a30 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66 69  .** All other fi
20a40 65 6c 64 73 20 61 72 65 20 72 65 61 64 2f 77 72  elds are read/wr
20a50 69 74 65 2e 20 20 54 68 65 20 75 6e 69 78 53 68  ite.  The unixSh
20a60 6d 2e 70 46 69 6c 65 2d 3e 6d 75 74 65 78 20 6d  m.pFile->mutex m
20a70 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77  ust be held.** w
20a80 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20 61  hile accessing a
20a90 6e 79 20 72 65 61 64 2f 77 72 69 74 65 20 66 69  ny read/write fi
20aa0 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  elds..*/.struct 
20ab0 75 6e 69 78 53 68 6d 20 7b 0a 20 20 75 6e 69 78  unixShm {.  unix
20ac0 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
20ad0 65 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e  e;     /* The un
20ae0 64 65 72 6c 79 69 6e 67 20 75 6e 69 78 53 68 6d  derlying unixShm
20af0 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  Node object */. 
20b00 20 75 6e 69 78 53 68 6d 20 2a 70 4e 65 78 74 3b   unixShm *pNext;
20b10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
20b20 65 78 74 20 75 6e 69 78 53 68 6d 20 77 69 74 68  ext unixShm with
20b30 20 74 68 65 20 73 61 6d 65 20 75 6e 69 78 53 68   the same unixSh
20b40 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68 61  mNode */.  u8 ha
20b50 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20  sMutex;         
20b60 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
20b70 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 75 6e 69   holding the uni
20b80 78 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a  xShmNode mutex *
20b90 2f 0a 20 20 75 38 20 69 64 3b 20 20 20 20 20 20  /.  u8 id;      
20ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20bb0 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63 6f 6e  * Id of this con
20bc0 6e 65 63 74 69 6f 6e 20 77 69 74 68 69 6e 20 69  nection within i
20bd0 74 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  ts unixShmNode *
20be0 2f 0a 20 20 75 31 36 20 73 68 61 72 65 64 4d 61  /.  u16 sharedMa
20bf0 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  sk;            /
20c00 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64  * Mask of shared
20c10 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20   locks held */. 
20c20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20   u16 exclMask;  
20c30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
20c40 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65  ask of exclusive
20c50 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 7d   locks held */.}
20c60 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e  ;../*.** Constan
20c70 74 73 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  ts used for lock
20c80 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55  ing.*/.#define U
20c90 4e 49 58 5f 53 48 4d 5f 42 41 53 45 20 20 20 28  NIX_SHM_BASE   (
20ca0 28 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e  (22+SQLITE_SHM_N
20cb0 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20 20 20 20  LOCK)*4)        
20cc0 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20 62   /* first lock b
20cd0 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55  yte */.#define U
20ce0 4e 49 58 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28  NIX_SHM_DMS    (
20cf0 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2b 53 51  UNIX_SHM_BASE+SQ
20d00 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20  LITE_SHM_NLOCK) 
20d10 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77 69 74   /* deadman swit
20d20 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  ch */../*.** App
20d30 6c 79 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72  ly posix advisor
20d40 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20  y locks for all 
20d50 62 79 74 65 73 20 66 72 6f 6d 20 6f 66 73 74 20  bytes from ofst 
20d60 74 68 72 6f 75 67 68 20 6f 66 73 74 2b 6e 2d 31  through ofst+n-1
20d70 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73 20 62 6c  ..**.** Locks bl
20d80 6f 63 6b 20 69 66 20 74 68 65 20 6d 61 73 6b 20  ock if the mask 
20d90 69 73 20 65 78 61 63 74 6c 79 20 55 4e 49 58 5f  is exactly UNIX_
20da0 53 48 4d 5f 43 20 61 6e 64 20 61 72 65 20 6e 6f  SHM_C and are no
20db0 6e 2d 62 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 74  n-blocking.** ot
20dc0 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
20dd0 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 53 79  ic int unixShmSy
20de0 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 75 6e 69 78  stemLock(.  unix
20df0 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20  File *pFile,    
20e00 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 6e 65     /* Open conne
20e10 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 57 41 4c  ction to the WAL
20e20 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6c   file */.  int l
20e30 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20 20 20  ockType,        
20e40 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c 20 46 5f    /* F_UNLCK, F_
20e50 52 44 4c 43 4b 2c 20 6f 72 20 46 5f 57 52 4c 43  RDLCK, or F_WRLC
20e60 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c  K */.  int ofst,
20e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20e80 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   First byte of t
20e90 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65  he locking range
20ea0 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20 20 20 20   */.  int n     
20eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20ec0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
20ed0 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20  to lock */.){.  
20ee0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
20ef0 6d 4e 6f 64 65 3b 20 2f 2a 20 41 70 70 6c 79 20  mNode; /* Apply 
20f00 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70  locks to this op
20f10 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  en shared-memory
20f20 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 73 74   segment */.  st
20f30 72 75 63 74 20 66 6c 6f 63 6b 20 66 3b 20 20 20  ruct flock f;   
20f40 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 73 69       /* The posi
20f50 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 69  x advisory locki
20f60 6e 67 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ng structure */.
20f70 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
20f80 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65 73 75  E_OK;    /* Resu
20f90 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 66 63 6e  lt code form fcn
20fa0 74 6c 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63  tl() */..  /* Ac
20fb0 63 65 73 73 20 74 6f 20 74 68 65 20 75 6e 69 78  cess to the unix
20fc0 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69  ShmNode object i
20fd0 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62 79 20  s serialized by 
20fe0 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20  the caller */.  
20ff0 70 53 68 6d 4e 6f 64 65 20 3d 20 70 46 69 6c 65  pShmNode = pFile
21000 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  ->pInode->pShmNo
21010 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  de;.  assert( sq
21020 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
21030 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
21040 29 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  ) || pShmNode->n
21050 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Ref==0 );..  /* 
21060 53 68 61 72 65 64 20 6c 6f 63 6b 73 20 6e 65 76  Shared locks nev
21070 65 72 20 73 70 61 6e 20 6d 6f 72 65 20 74 68 61  er span more tha
21080 6e 20 6f 6e 65 20 62 79 74 65 20 2a 2f 0a 20 20  n one byte */.  
21090 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20  assert( n==1 || 
210a0 6c 6f 63 6b 54 79 70 65 21 3d 46 5f 52 44 4c 43  lockType!=F_RDLC
210b0 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 73  K );..  /* Locks
210c0 20 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67   are within rang
210d0 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e  e */.  assert( n
210e0 3e 3d 31 20 26 26 20 6e 3c 53 51 4c 49 54 45 5f  >=1 && n<SQLITE_
210f0 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20  SHM_NLOCK );..  
21100 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e  if( pShmNode->h>
21110 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6b  =0 ){.    int lk
21120 54 79 70 65 3b 0a 20 20 20 20 2f 2a 20 49 6e 69  Type;.    /* Ini
21130 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b  tialize the lock
21140 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a  ing parameters *
21150 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 66 2c  /.    memset(&f,
21160 20 30 2c 20 73 69 7a 65 6f 66 28 66 29 29 3b 0a   0, sizeof(f));.
21170 20 20 20 20 66 2e 6c 5f 74 79 70 65 20 3d 20 6c      f.l_type = l
21180 6f 63 6b 54 79 70 65 3b 0a 20 20 20 20 66 2e 6c  ockType;.    f.l
21190 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
211a0 45 54 3b 0a 20 20 20 20 66 2e 6c 5f 73 74 61 72  ET;.    f.l_star
211b0 74 20 3d 20 6f 66 73 74 3b 0a 20 20 20 20 66 2e  t = ofst;.    f.
211c0 6c 5f 6c 65 6e 20 3d 20 6e 3b 0a 0a 20 20 20 20  l_len = n;..    
211d0 6c 6b 54 79 70 65 20 3d 20 28 70 46 69 6c 65 2d  lkType = (pFile-
211e0 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  >ctrlFlags & UNI
211f0 58 46 49 4c 45 5f 42 4c 4f 43 4b 29 21 3d 30 20  XFILE_BLOCK)!=0 
21200 3f 20 46 5f 53 45 54 4c 4b 57 20 3a 20 46 5f 53  ? F_SETLKW : F_S
21210 45 54 4c 4b 3b 0a 20 20 20 20 72 63 20 3d 20 6f  ETLK;.    rc = o
21220 73 46 63 6e 74 6c 28 70 53 68 6d 4e 6f 64 65 2d  sFcntl(pShmNode-
21230 3e 68 2c 20 6c 6b 54 79 70 65 2c 20 26 66 29 3b  >h, lkType, &f);
21240 0a 20 20 20 20 72 63 20 3d 20 28 72 63 21 3d 28  .    rc = (rc!=(
21250 2d 31 29 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  -1)) ? SQLITE_OK
21260 20 3a 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   : SQLITE_BUSY;.
21270 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46      pFile->ctrlF
21280 6c 61 67 73 20 26 3d 20 7e 55 4e 49 58 46 49 4c  lags &= ~UNIXFIL
21290 45 5f 42 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 20 20  E_BLOCK;.  }..  
212a0 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 67 6c  /* Update the gl
212b0 6f 62 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 20  obal lock state 
212c0 61 6e 64 20 64 6f 20 64 65 62 75 67 20 74 72 61  and do debug tra
212d0 63 69 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20 53  cing */.#ifdef S
212e0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b 20  QLITE_DEBUG.  { 
212f0 75 31 36 20 6d 61 73 6b 3b 0a 20 20 4f 53 54 52  u16 mask;.  OSTR
21300 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 22  ACE(("SHM-LOCK "
21310 29 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 6f 66 73  ));.  mask = ofs
21320 74 3e 33 31 20 3f 20 30 78 66 66 66 66 20 3a 20  t>31 ? 0xffff : 
21330 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20  (1<<(ofst+n)) - 
21340 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 69 66 28  (1<<ofst);.  if(
21350 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
21360 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79  {.    if( lockTy
21370 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe==F_UNLCK ){. 
21380 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 75       OSTRACE(("u
21390 6e 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66  nlock %d ok", of
213a0 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d  st));.      pShm
213b0 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26  Node->exclMask &
213c0 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70  = ~mask;.      p
213d0 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d  ShmNode->sharedM
213e0 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
213f0 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b    }else if( lock
21400 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b  Type==F_RDLCK ){
21410 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
21420 22 72 65 61 64 2d 6c 6f 63 6b 20 25 64 20 6f 6b  "read-lock %d ok
21430 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20  ", ofst));.     
21440 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d   pShmNode->exclM
21450 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
21460 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68      pShmNode->sh
21470 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  aredMask |= mask
21480 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
21490 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54     assert( lockT
214a0 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a  ype==F_WRLCK );.
214b0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
214c0 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 6f 6b  write-lock %d ok
214d0 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20  ", ofst));.     
214e0 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d   pShmNode->exclM
214f0 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
21500 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61     pShmNode->sha
21510 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  redMask &= ~mask
21520 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
21530 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70  .    if( lockTyp
21540 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20  e==F_UNLCK ){.  
21550 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e      OSTRACE(("un
21560 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65 64 22 2c  lock %d failed",
21570 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d 65 6c   ofst));.    }el
21580 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d  se if( lockType=
21590 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_RDLCK ){.    
215a0 20 20 4f 53 54 52 41 43 45 28 28 22 72 65 61 64    OSTRACE(("read
215b0 2d 6c 6f 63 6b 20 66 61 69 6c 65 64 22 29 29 3b  -lock failed"));
215c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
215d0 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79    assert( lockTy
215e0 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20  pe==F_WRLCK );. 
215f0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 77       OSTRACE(("w
21600 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 66 61 69  rite-lock %d fai
21610 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20  led", ofst));.  
21620 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43    }.  }.  OSTRAC
21630 45 28 28 22 20 2d 20 61 66 74 65 72 77 61 72 64  E((" - afterward
21640 73 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a  s %03x,%03x\n",.
21650 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e             pShmN
21660 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c  ode->sharedMask,
21670 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d   pShmNode->exclM
21680 61 73 6b 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  ask));.  }.#endi
21690 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20  f..  return rc; 
216a0 20 20 20 20 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a         .}../*.**
216b0 20 52 65 74 75 72 6e 20 74 68 65 20 6d 69 6e 69   Return the mini
216c0 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 33 32  mum number of 32
216d0 4b 42 20 73 68 6d 20 72 65 67 69 6f 6e 73 20 74  KB shm regions t
216e0 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 6d 61  hat should be ma
216f0 70 70 65 64 20 61 74 0a 2a 2a 20 61 20 74 69 6d  pped at.** a tim
21700 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  e, assuming that
21710 20 65 61 63 68 20 6d 61 70 70 69 6e 67 20 6d 75   each mapping mu
21720 73 74 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72  st be an integer
21730 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65   multiple of the
21740 0a 2a 2a 20 63 75 72 72 65 6e 74 20 73 79 73 74  .** current syst
21750 65 6d 20 70 61 67 65 2d 73 69 7a 65 2e 0a 2a 2a  em page-size..**
21760 0a 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 74 68 69  .** Usually, thi
21770 73 20 69 73 20 31 2e 20 54 68 65 20 65 78 63 65  s is 1. The exce
21780 70 74 69 6f 6e 20 73 65 65 6d 73 20 74 6f 20 62  ption seems to b
21790 65 20 73 79 73 74 65 6d 73 20 74 68 61 74 20 61  e systems that a
217a0 72 65 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a 2a  re configured.**
217b0 20 74 6f 20 75 73 65 20 36 34 4b 42 20 70 61 67   to use 64KB pag
217c0 65 73 20 2d 20 69 6e 20 74 68 69 73 20 63 61 73  es - in this cas
217d0 65 20 65 61 63 68 20 6d 61 70 70 69 6e 67 20 6d  e each mapping m
217e0 75 73 74 20 63 6f 76 65 72 20 61 74 20 6c 65 61  ust cover at lea
217f0 73 74 20 74 77 6f 0a 2a 2a 20 73 68 6d 20 72 65  st two.** shm re
21800 67 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  gions..*/.static
21810 20 69 6e 74 20 75 6e 69 78 53 68 6d 52 65 67 69   int unixShmRegi
21820 6f 6e 50 65 72 4d 61 70 28 76 6f 69 64 29 7b 0a  onPerMap(void){.
21830 20 20 69 6e 74 20 73 68 6d 73 7a 20 3d 20 33 32    int shmsz = 32
21840 2a 31 30 32 34 3b 20 20 20 20 20 20 20 20 20 20  *1024;          
21850 20 20 2f 2a 20 53 48 4d 20 72 65 67 69 6f 6e 20    /* SHM region 
21860 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67  size */.  int pg
21870 73 7a 20 3d 20 6f 73 47 65 74 70 61 67 65 73 69  sz = osGetpagesi
21880 7a 65 28 29 3b 20 20 20 2f 2a 20 53 79 73 74 65  ze();   /* Syste
21890 6d 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20  m page size */. 
218a0 20 61 73 73 65 72 74 28 20 28 28 70 67 73 7a 2d   assert( ((pgsz-
218b0 31 29 26 70 67 73 7a 29 3d 3d 30 20 29 3b 20 20  1)&pgsz)==0 );  
218c0 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 6d 75   /* Page size mu
218d0 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  st be a power of
218e0 20 32 20 2a 2f 0a 20 20 69 66 28 20 70 67 73 7a   2 */.  if( pgsz
218f0 3c 73 68 6d 73 7a 20 29 20 72 65 74 75 72 6e 20  <shmsz ) return 
21900 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 67 73 7a  1;.  return pgsz
21910 2f 73 68 6d 73 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  /shmsz;.}../*.**
21920 20 50 75 72 67 65 20 74 68 65 20 75 6e 69 78 53   Purge the unixS
21930 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74 20  hmNodeList list 
21940 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 77  of all entries w
21950 69 74 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e  ith unixShmNode.
21960 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54  nRef==0..**.** T
21970 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46 53  his is not a VFS
21980 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d   shared-memory m
21990 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20 75  ethod; it is a u
219a0 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 20  tility function 
219b0 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53  called.** by VFS
219c0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d   shared-memory m
219d0 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69  ethods..*/.stati
219e0 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 50 75  c void unixShmPu
219f0 72 67 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  rge(unixFile *pF
21a00 64 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64  d){.  unixShmNod
21a10 65 20 2a 70 20 3d 20 70 46 64 2d 3e 70 49 6e 6f  e *p = pFd->pIno
21a20 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20  de->pShmNode;.  
21a30 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65  assert( unixMute
21a40 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28  xHeld() );.  if(
21a50 20 70 20 26 26 20 70 2d 3e 6e 52 65 66 3d 3d 30   p && p->nRef==0
21a60 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 68 6d   ){.    int nShm
21a70 50 65 72 4d 61 70 20 3d 20 75 6e 69 78 53 68 6d  PerMap = unixShm
21a80 52 65 67 69 6f 6e 50 65 72 4d 61 70 28 29 3b 0a  RegionPerMap();.
21a90 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 61      int i;.    a
21aa0 73 73 65 72 74 28 20 70 2d 3e 70 49 6e 6f 64 65  ssert( p->pInode
21ab0 3d 3d 70 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b  ==pFd->pInode );
21ac0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
21ad0 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65 78  ex_free(p->mutex
21ae0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
21af0 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b  i<p->nRegion; i+
21b00 3d 6e 53 68 6d 50 65 72 4d 61 70 29 7b 0a 20 20  =nShmPerMap){.  
21b10 20 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20      if( p->h>=0 
21b20 29 7b 0a 20 20 20 20 20 20 20 20 6f 73 4d 75 6e  ){.        osMun
21b30 6d 61 70 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b  map(p->apRegion[
21b40 69 5d 2c 20 70 2d 3e 73 7a 52 65 67 69 6f 6e 29  i], p->szRegion)
21b50 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
21b60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
21b70 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b  ree(p->apRegion[
21b80 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
21b90 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
21ba0 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e 29  ree(p->apRegion)
21bb0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d  ;.    if( p->h>=
21bc0 30 20 29 7b 0a 20 20 20 20 20 20 72 6f 62 75 73  0 ){.      robus
21bd0 74 5f 63 6c 6f 73 65 28 70 46 64 2c 20 70 2d 3e  t_close(pFd, p->
21be0 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
21bf0 20 20 20 20 70 2d 3e 68 20 3d 20 2d 31 3b 0a 20      p->h = -1;. 
21c00 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 49 6e 6f     }.    p->pIno
21c10 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 30  de->pShmNode = 0
21c20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
21c30 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ee(p);.  }.}../*
21c40 0a 2a 2a 20 4f 70 65 6e 20 61 20 73 68 61 72 65  .** Open a share
21c50 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73  d-memory area as
21c60 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6f 70  sociated with op
21c70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
21c80 20 70 44 62 46 64 2e 20 20 0a 2a 2a 20 54 68 69   pDbFd.  .** Thi
21c90 73 20 70 61 72 74 69 63 75 6c 61 72 20 69 6d 70  s particular imp
21ca0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73  lementation uses
21cb0 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 73 2e 0a   mmapped files..
21cc0 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 75  **.** The file u
21cd0 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
21ce0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69   shared-memory i
21cf0 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69  s in the same di
21d00 72 65 63 74 6f 72 79 0a 2a 2a 20 61 73 20 74 68  rectory.** as th
21d10 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  e open database 
21d20 66 69 6c 65 20 61 6e 64 20 68 61 73 20 74 68 65  file and has the
21d30 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68   same name as th
21d40 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 0a  e open database.
21d50 2a 2a 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  ** file with the
21d60 20 22 2d 73 68 6d 22 20 73 75 66 66 69 78 20 61   "-shm" suffix a
21d70 64 64 65 64 2e 20 20 46 6f 72 20 65 78 61 6d 70  dded.  For examp
21d80 6c 65 2c 20 69 66 20 74 68 65 20 64 61 74 61 62  le, if the datab
21d90 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 22  ase file.** is "
21da0 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66  /home/user1/conf
21db0 69 67 2e 64 62 22 20 74 68 65 6e 20 74 68 65 20  ig.db" then the 
21dc0 66 69 6c 65 20 74 68 61 74 20 69 73 20 63 72 65  file that is cre
21dd0 61 74 65 64 20 61 6e 64 20 6d 6d 61 70 70 65 64  ated and mmapped
21de0 0a 2a 2a 20 66 6f 72 20 73 68 61 72 65 64 20 6d  .** for shared m
21df0 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 63 61  emory will be ca
21e00 6c 6c 65 64 20 22 2f 68 6f 6d 65 2f 75 73 65 72  lled "/home/user
21e10 31 2f 63 6f 6e 66 69 67 2e 64 62 2d 73 68 6d 22  1/config.db-shm"
21e20 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74 68 65  .  .**.** Anothe
21e30 72 20 61 70 70 72 6f 61 63 68 20 74 6f 20 69 73  r approach to is
21e40 20 74 6f 20 75 73 65 20 66 69 6c 65 73 20 69 6e   to use files in
21e50 20 2f 64 65 76 2f 73 68 6d 20 6f 72 20 2f 64 65   /dev/shm or /de
21e60 76 2f 74 6d 70 20 6f 72 20 61 6e 0a 2a 2a 20 73  v/tmp or an.** s
21e70 6f 6d 65 20 6f 74 68 65 72 20 74 6d 70 66 73 20  ome other tmpfs 
21e80 6d 6f 75 6e 74 2e 20 42 75 74 20 69 66 20 61 20  mount. But if a 
21e90 66 69 6c 65 20 69 6e 20 61 20 64 69 66 66 65 72  file in a differ
21ea0 65 6e 74 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a  ent directory.**
21eb0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
21ec0 73 65 20 66 69 6c 65 20 69 73 20 75 73 65 64 2c  se file is used,
21ed0 20 74 68 65 6e 20 64 69 66 66 65 72 69 6e 67 20   then differing 
21ee0 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f  access permissio
21ef0 6e 73 0a 2a 2a 20 6f 72 20 61 20 63 68 72 6f 6f  ns.** or a chroo
21f00 74 28 29 20 6d 69 67 68 74 20 63 61 75 73 65 20  t() might cause 
21f10 74 77 6f 20 64 69 66 66 65 72 65 6e 74 20 70 72  two different pr
21f20 6f 63 65 73 73 65 73 20 6f 6e 20 74 68 65 20 73  ocesses on the s
21f30 61 6d 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ame.** database 
21f40 74 6f 20 65 6e 64 20 75 70 20 75 73 69 6e 67 20  to end up using 
21f50 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65 73 20  different files 
21f60 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  for shared memor
21f70 79 20 2d 20 0a 2a 2a 20 6d 65 61 6e 69 6e 67 20  y - .** meaning 
21f80 74 68 61 74 20 74 68 65 69 72 20 6d 65 6d 6f 72  that their memor
21f90 79 20 77 6f 75 6c 64 20 6e 6f 74 20 72 65 61 6c  y would not real
21fa0 6c 79 20 62 65 20 73 68 61 72 65 64 20 2d 20 72  ly be shared - r
21fb0 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 69 6e 20 64  esulting.** in d
21fc0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
21fd0 6f 6e 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73  on.  Nevertheles
21fe0 73 2c 20 74 68 69 73 20 74 6d 70 66 73 20 66 69  s, this tmpfs fi
21ff0 6c 65 20 75 73 61 67 65 0a 2a 2a 20 63 61 6e 20  le usage.** can 
22000 62 65 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f  be enabled at co
22010 6d 70 69 6c 65 2d 74 69 6d 65 20 75 73 69 6e 67  mpile-time using
22020 20 2d 44 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49   -DSQLITE_SHM_DI
22030 52 45 43 54 4f 52 59 3d 22 2f 64 65 76 2f 73 68  RECTORY="/dev/sh
22040 6d 22 0a 2a 2a 20 6f 72 20 74 68 65 20 65 71 75  m".** or the equ
22050 69 76 61 6c 65 6e 74 2e 20 20 54 68 65 20 75 73  ivalent.  The us
22060 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f  e of the SQLITE_
22070 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f  SHM_DIRECTORY co
22080 6d 70 69 6c 65 2d 74 69 6d 65 0a 2a 2a 20 6f 70  mpile-time.** op
22090 74 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 20  tion results in 
220a0 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
220b0 62 75 69 6c 64 20 6f 66 20 53 51 4c 69 74 65 3b  build of SQLite;
220c0 20 20 62 75 69 6c 64 73 20 6f 66 20 53 51 4c 69    builds of SQLi
220d0 74 65 0a 2a 2a 20 74 68 61 74 20 77 69 74 68 20  te.** that with 
220e0 64 69 66 66 65 72 69 6e 67 20 53 51 4c 49 54 45  differing SQLITE
220f0 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 73  _SHM_DIRECTORY s
22100 65 74 74 69 6e 67 73 20 61 74 74 65 6d 70 74 20  ettings attempt 
22110 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 73 61  to use the.** sa
22120 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  me database file
22130 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
22140 65 2c 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  e, database corr
22150 75 70 74 69 6f 6e 20 77 69 6c 6c 20 6c 69 6b 65  uption will like
22160 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 54 68  ly.** result. Th
22170 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  e SQLITE_SHM_DIR
22180 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74  ECTORY compile-t
22190 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 63 6f  ime option is co
221a0 6e 73 69 64 65 72 65 64 0a 2a 2a 20 22 75 6e 73  nsidered.** "uns
221b0 75 70 70 6f 72 74 65 64 22 20 61 6e 64 20 6d 61  upported" and ma
221c0 79 20 67 6f 20 61 77 61 79 20 69 6e 20 61 20 66  y go away in a f
221d0 75 74 75 72 65 20 53 51 4c 69 74 65 20 72 65 6c  uture SQLite rel
221e0 65 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ease..**.** When
221f0 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73   opening a new s
22200 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
22210 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69  e, if no other i
22220 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74  nstances of that
22230 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72  .** file are cur
22240 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20  rently open, in 
22250 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20  this process or 
22260 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  in other process
22270 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  es, then.** the 
22280 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75  file must be tru
22290 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c  ncated to zero l
222a0 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69 74  ength or have it
222b0 73 20 68 65 61 64 65 72 20 63 6c 65 61 72 65 64  s header cleared
222c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f  ..**.** If the o
222d0 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
222e0 20 66 69 6c 65 20 28 70 44 62 46 64 29 20 69 73   file (pDbFd) is
222f0 20 75 73 69 6e 67 20 74 68 65 20 22 75 6e 69 78   using the "unix
22300 2d 65 78 63 6c 22 20 56 46 53 0a 2a 2a 20 74 68  -excl" VFS.** th
22310 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6e  at means that an
22320 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
22330 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
22340 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
22350 0a 2a 2a 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  .** that no othe
22360 72 20 70 72 6f 63 65 73 73 65 73 20 61 72 65 20  r processes are 
22370 61 62 6c 65 20 74 6f 20 72 65 61 64 20 6f 72 20  able to read or 
22380 77 72 69 74 65 20 74 68 65 20 64 61 74 61 62 61  write the databa
22390 73 65 2e 20 20 49 6e 0a 2a 2a 20 74 68 61 74 20  se.  In.** that 
223a0 63 61 73 65 2c 20 77 65 20 64 6f 20 6e 6f 74 20  case, we do not 
223b0 72 65 61 6c 6c 79 20 6e 65 65 64 20 73 68 61 72  really need shar
223c0 65 64 20 6d 65 6d 6f 72 79 2e 20 20 4e 6f 20 73  ed memory.  No s
223d0 68 61 72 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20  hared memory.** 
223e0 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2e  file is created.
223f0 20 20 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d    The shared mem
22400 6f 72 79 20 77 69 6c 6c 20 62 65 20 73 69 6d 75  ory will be simu
22410 6c 61 74 65 64 20 77 69 74 68 20 68 65 61 70 20  lated with heap 
22420 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  memory..*/.stati
22430 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 53 68  c int unixOpenSh
22440 61 72 65 64 4d 65 6d 6f 72 79 28 75 6e 69 78 46  aredMemory(unixF
22450 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20 20 73  ile *pDbFd){.  s
22460 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 2a 70  truct unixShm *p
22470 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
22480 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * The connection
22490 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f   to be opened */
224a0 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 53 68  .  struct unixSh
224b0 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
224c0 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
224d0 79 69 6e 67 20 6d 6d 61 70 70 65 64 20 66 69 6c  ying mmapped fil
224e0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
224f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22500 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
22510 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 69 78 49   code */.  unixI
22520 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
22530 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
22540 65 20 69 6e 6f 64 65 20 6f 66 20 66 64 20 2a 2f  e inode of fd */
22550 0a 20 20 63 68 61 72 20 2a 7a 53 68 6d 46 69 6c  .  char *zShmFil
22560 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
22570 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
22580 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20  e file used for 
22590 53 48 4d 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68  SHM */.  int nSh
225a0 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  mFilename;      
225b0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
225c0 20 6f 66 20 74 68 65 20 53 48 4d 20 66 69 6c 65   of the SHM file
225d0 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  name in bytes */
225e0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
225f0 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65  space for the ne
22600 77 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74  w unixShm object
22610 2e 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74  . */.  p = sqlit
22620 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a  e3_malloc64( siz
22630 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
22640 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   p==0 ) return S
22650 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d  QLITE_NOMEM;.  m
22660 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
22670 6f 66 28 2a 70 29 29 3b 0a 20 20 61 73 73 65 72  of(*p));.  asser
22680 74 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d  t( pDbFd->pShm==
22690 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  0 );..  /* Check
226a0 20 74 6f 20 73 65 65 20 69 66 20 61 20 75 6e 69   to see if a uni
226b0 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20  xShmNode object 
226c0 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 20  already exists. 
226d0 52 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e  Reuse an existin
226e0 67 0a 20 20 2a 2a 20 6f 6e 65 20 69 66 20 70 72  g.  ** one if pr
226f0 65 73 65 6e 74 2e 20 43 72 65 61 74 65 20 61 20  esent. Create a 
22700 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73  new one if neces
22710 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69  sary..  */.  uni
22720 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
22730 20 70 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d   pInode = pDbFd-
22740 3e 70 49 6e 6f 64 65 3b 0a 20 20 70 53 68 6d 4e  >pInode;.  pShmN
22750 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 53  ode = pInode->pS
22760 68 6d 4e 6f 64 65 3b 0a 20 20 69 66 28 20 70 53  hmNode;.  if( pS
22770 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20  hmNode==0 ){.   
22780 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74   struct stat sSt
22790 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  at;             
227a0 20 20 20 20 2f 2a 20 66 73 74 61 74 28 29 20 69      /* fstat() i
227b0 6e 66 6f 20 66 6f 72 20 64 61 74 61 62 61 73 65  nfo for database
227c0 20 66 69 6c 65 20 2a 2f 0a 23 69 66 6e 64 65 66   file */.#ifndef
227d0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
227e0 43 54 4f 52 59 0a 20 20 20 20 63 6f 6e 73 74 20  CTORY.    const 
227f0 63 68 61 72 20 2a 7a 42 61 73 65 50 61 74 68 20  char *zBasePath 
22800 3d 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 3b 0a  = pDbFd->zPath;.
22810 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43  #endif..    /* C
22820 61 6c 6c 20 66 73 74 61 74 28 29 20 74 6f 20 66  all fstat() to f
22830 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 70 65  igure out the pe
22840 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65  rmissions on the
22850 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
22860 49 66 0a 20 20 20 20 2a 2a 20 61 20 6e 65 77 20  If.    ** a new 
22870 2a 2d 73 68 6d 20 66 69 6c 65 20 69 73 20 63 72  *-shm file is cr
22880 65 61 74 65 64 2c 20 61 6e 20 61 74 74 65 6d 70  eated, an attemp
22890 74 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74  t will be made t
228a0 6f 20 63 72 65 61 74 65 20 69 74 0a 20 20 20 20  o create it.    
228b0 2a 2a 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ** with the same
228c0 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 20 20   permissions..  
228d0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 73 46    */.    if( osF
228e0 73 74 61 74 28 70 44 62 46 64 2d 3e 68 2c 20 26  stat(pDbFd->h, &
228f0 73 53 74 61 74 29 20 26 26 20 70 49 6e 6f 64 65  sStat) && pInode
22900 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
22910 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
22920 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
22930 41 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  AT;.      goto s
22940 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
22950 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
22960 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a  E_SHM_DIRECTORY.
22970 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65      nShmFilename
22980 20 3d 20 73 69 7a 65 6f 66 28 53 51 4c 49 54 45   = sizeof(SQLITE
22990 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 29 20  _SHM_DIRECTORY) 
229a0 2b 20 33 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20  + 31;.#else.    
229b0 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 36  nShmFilename = 6
229c0 20 2b 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   + (int)strlen(z
229d0 42 61 73 65 50 61 74 68 29 3b 0a 23 65 6e 64 69  BasePath);.#endi
229e0 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d  f.    pShmNode =
229f0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
22a00 34 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e  4( sizeof(*pShmN
22a10 6f 64 65 29 20 2b 20 6e 53 68 6d 46 69 6c 65 6e  ode) + nShmFilen
22a20 61 6d 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ame );.    if( p
22a30 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20  ShmNode==0 ){.  
22a40 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
22a50 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
22a60 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
22a70 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74      }.    memset
22a80 28 70 53 68 6d 4e 6f 64 65 2c 20 30 2c 20 73 69  (pShmNode, 0, si
22a90 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 2b  zeof(*pShmNode)+
22aa0 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  nShmFilename);. 
22ab0 20 20 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 20     zShmFilename 
22ac0 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c  = pShmNode->zFil
22ad0 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26  ename = (char*)&
22ae0 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a 23 69 66  pShmNode[1];.#if
22af0 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  def SQLITE_SHM_D
22b00 49 52 45 43 54 4f 52 59 0a 20 20 20 20 73 71 6c  IRECTORY.    sql
22b10 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53  ite3_snprintf(nS
22b20 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d  hmFilename, zShm
22b30 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 20 20 20  Filename, .     
22b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b50 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
22b60 54 4f 52 59 20 22 2f 73 71 6c 69 74 65 2d 73 68  TORY "/sqlite-sh
22b70 6d 2d 25 78 2d 25 78 22 2c 0a 20 20 20 20 20 20  m-%x-%x",.      
22b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
22b90 75 33 32 29 73 53 74 61 74 2e 73 74 5f 69 6e 6f  u32)sStat.st_ino
22ba0 2c 20 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f  , (u32)sStat.st_
22bb0 64 65 76 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  dev);.#else.    
22bc0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
22bd0 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a  (nShmFilename, z
22be0 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73  ShmFilename, "%s
22bf0 2d 73 68 6d 22 2c 20 7a 42 61 73 65 50 61 74 68  -shm", zBasePath
22c00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69  );.    sqlite3Fi
22c10 6c 65 53 75 66 66 69 78 33 28 70 44 62 46 64 2d  leSuffix3(pDbFd-
22c20 3e 7a 50 61 74 68 2c 20 7a 53 68 6d 46 69 6c 65  >zPath, zShmFile
22c30 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  name);.#endif.  
22c40 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20    pShmNode->h = 
22c50 2d 31 3b 0a 20 20 20 20 70 44 62 46 64 2d 3e 70  -1;.    pDbFd->p
22c60 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20  Inode->pShmNode 
22c70 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 20 20  = pShmNode;.    
22c80 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65  pShmNode->pInode
22c90 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65   = pDbFd->pInode
22ca0 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ;.    pShmNode->
22cb0 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f  mutex = sqlite3_
22cc0 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
22cd0 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a  TE_MUTEX_FAST);.
22ce0 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
22cf0 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20  ->mutex==0 ){.  
22d00 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
22d10 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
22d20 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
22d30 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
22d40 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
22d50 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ock==0 ){.      
22d60 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20  int openFlags = 
22d70 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41 54  O_RDWR | O_CREAT
22d80 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
22d90 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28  te3_uri_boolean(
22da0 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 22 72  pDbFd->zPath, "r
22db0 65 61 64 6f 6e 6c 79 5f 73 68 6d 22 2c 20 30 29  eadonly_shm", 0)
22dc0 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 65 6e   ){.        open
22dd0 46 6c 61 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59  Flags = O_RDONLY
22de0 3b 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f  ;.        pShmNo
22df0 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3d  de->isReadonly =
22e00 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
22e10 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20    pShmNode->h = 
22e20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 53 68 6d  robust_open(zShm
22e30 46 69 6c 65 6e 61 6d 65 2c 20 6f 70 65 6e 46 6c  Filename, openFl
22e40 61 67 73 2c 20 28 73 53 74 61 74 2e 73 74 5f 6d  ags, (sStat.st_m
22e50 6f 64 65 26 30 37 37 37 29 29 3b 0a 20 20 20 20  ode&0777));.    
22e60 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
22e70 68 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  h<0 ){.        r
22e80 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  c = unixLogError
22e90 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
22ea0 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a  _BKPT, "open", z
22eb0 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ShmFilename);.  
22ec0 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
22ed0 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d  pen_err;.      }
22ee0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
22ef0 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 72 75  is process is ru
22f00 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74 2c 20 6d  nning as root, m
22f10 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
22f20 65 20 53 48 4d 20 66 69 6c 65 0a 20 20 20 20 20  e SHM file.     
22f30 20 2a 2a 20 69 73 20 6f 77 6e 65 64 20 62 79 20   ** is owned by 
22f40 74 68 65 20 73 61 6d 65 20 75 73 65 72 20 74 68  the same user th
22f50 61 74 20 6f 77 6e 73 20 74 68 65 20 6f 72 69 67  at owns the orig
22f60 69 6e 61 6c 20 64 61 74 61 62 61 73 65 2e 20 20  inal database.  
22f70 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20  Otherwise,.     
22f80 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   ** the original
22f90 20 6f 77 6e 65 72 20 77 69 6c 6c 20 6e 6f 74 20   owner will not 
22fa0 62 65 20 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65  be able to conne
22fb0 63 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ct..      */.   
22fc0 20 20 20 72 6f 62 75 73 74 46 63 68 6f 77 6e 28     robustFchown(
22fd0 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73 53 74  pShmNode->h, sSt
22fe0 61 74 2e 73 74 5f 75 69 64 2c 20 73 53 74 61 74  at.st_uid, sStat
22ff0 2e 73 74 5f 67 69 64 29 3b 0a 20 20 0a 20 20 20  .st_gid);.  .   
23000 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
23010 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 70 72  ee if another pr
23020 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67  ocess is holding
23030 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20 73 77   the dead-man sw
23040 69 74 63 68 2e 0a 20 20 20 20 20 20 2a 2a 20 49  itch..      ** I
23050 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65 20  f not, truncate 
23060 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f  the file to zero
23070 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20 20 20   length. .      
23080 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  */.      rc = SQ
23090 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69  LITE_OK;.      i
230a0 66 28 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d  f( unixShmSystem
230b0 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f 57 52  Lock(pDbFd, F_WR
230c0 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d  LCK, UNIX_SHM_DM
230d0 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  S, 1)==SQLITE_OK
230e0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
230f0 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65  robust_ftruncate
23100 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 30 29  (pShmNode->h, 0)
23110 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
23120 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28   = unixLogError(
23130 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
23140 4f 50 45 4e 2c 20 22 66 74 72 75 6e 63 61 74 65  OPEN, "ftruncate
23150 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29  ", zShmFilename)
23160 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
23170 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
23180 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
23190 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
231a0 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44  ShmSystemLock(pD
231b0 62 46 64 2c 20 46 5f 52 44 4c 43 4b 2c 20 55 4e  bFd, F_RDLCK, UN
231c0 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a  IX_SHM_DMS, 1);.
231d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
231e0 28 20 72 63 20 29 20 67 6f 74 6f 20 73 68 6d 5f  ( rc ) goto shm_
231f0 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
23200 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74    }..  /* Make t
23210 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f  he new connectio
23220 6e 20 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65  n a child of the
23230 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a   unixShmNode */.
23240 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20    p->pShmNode = 
23250 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66  pShmNode;.#ifdef
23260 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
23270 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65  p->id = pShmNode
23280 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23  ->nextShmId++;.#
23290 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65  endif.  pShmNode
232a0 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46  ->nRef++;.  pDbF
232b0 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 75  d->pShm = p;.  u
232c0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
232d0 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72  ..  /* The refer
232e0 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53  ence count on pS
232f0 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61  hmNode has alrea
23300 64 79 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e  dy been incremen
23310 74 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74  ted under.  ** t
23320 68 65 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20  he cover of the 
23330 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
23340 20 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20 70   mutex and the p
23350 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a  ointer from the.
23360 20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74    ** new (struct
23370 20 75 6e 69 78 53 68 6d 29 20 6f 62 6a 65 63 74   unixShm) object
23380 20 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65   to the pShmNode
23390 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41   has been set. A
233a0 6c 6c 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  ll that is.  ** 
233b0 6c 65 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f  left to do is to
233c0 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62   link the new ob
233d0 6a 65 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69  ject into the li
233e0 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69  nked list starti
233f0 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e  ng.  ** at pShmN
23400 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69  ode->pFirst. Thi
23410 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77  s must be done w
23420 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  hile holding the
23430 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78   pShmNode->mutex
23440 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20   .  ** mutex..  
23450 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
23460 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
23470 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e  e->mutex);.  p->
23480 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65  pNext = pShmNode
23490 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d  ->pFirst;.  pShm
234a0 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70  Node->pFirst = p
234b0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
234c0 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
234d0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
234e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
234f0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e   /* Jump here on
23500 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68   any error */.sh
23510 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 75 6e  m_open_err:.  un
23520 69 78 53 68 6d 50 75 72 67 65 28 70 44 62 46 64  ixShmPurge(pDbFd
23530 29 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  );       /* This
23540 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d   call frees pShm
23550 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72 65 64  Node if required
23560 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   */.  sqlite3_fr
23570 65 65 28 70 29 3b 0a 20 20 75 6e 69 78 4c 65 61  ee(p);.  unixLea
23580 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74  veMutex();.  ret
23590 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
235a0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
235b0 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61  s called to obta
235c0 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  in a pointer to 
235d0 72 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f  region iRegion o
235e0 66 20 74 68 65 20 0a 2a 2a 20 73 68 61 72 65 64  f the .** shared
235f0 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74  -memory associat
23600 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
23610 62 61 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68  base file fd. Sh
23620 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
23630 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e 75 6d 62  ons .** are numb
23640 65 72 65 64 20 73 74 61 72 74 69 6e 67 20 66 72  ered starting fr
23650 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20 73 68  om zero. Each sh
23660 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
23670 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e 20 0a  on is szRegion .
23680 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
23690 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
236a0 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65  ror occurs, an e
236b0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
236c0 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73  urned and *pp is
236d0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   set to NULL..**
236e0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
236f0 66 20 74 68 65 20 62 45 78 74 65 6e 64 20 70 61  f the bExtend pa
23700 72 61 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64  rameter is 0 and
23710 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
23720 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  hared-memory.** 
23730 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62  region has not b
23740 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 62  een allocated (b
23750 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e  y any client, in
23760 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e  cluding one runn
23770 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61  ing in a.** sepa
23780 72 61 74 65 20 70 72 6f 63 65 73 73 29 2c 20 74  rate process), t
23790 68 65 6e 20 2a 70 70 20 69 73 20 73 65 74 20 74  hen *pp is set t
237a0 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54  o NULL and SQLIT
237b0 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
237c0 66 20 0a 2a 2a 20 62 45 78 74 65 6e 64 20 69 73  f .** bExtend is
237d0 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68   non-zero and th
237e0 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72  e requested shar
237f0 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
23800 20 68 61 73 20 6e 6f 74 20 79 65 74 20 0a 2a 2a   has not yet .**
23810 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
23820 20 69 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64   it is allocated
23830 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
23840 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
23850 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
23860 67 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  gion has already
23870 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
23880 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  or is allocated 
23890 62 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  by.** this call 
238a0 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
238b0 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d  ve, then it is m
238c0 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20  apped into this 
238d0 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a 20 61 64  processes .** ad
238e0 64 72 65 73 73 20 73 70 61 63 65 20 28 69 66 20  dress space (if 
238f0 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
23900 79 29 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74  y), *pp is set t
23910 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d  o point to the m
23920 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79  apped .** memory
23930 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
23940 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
23950 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 4d 61  ic int unixShmMa
23960 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  p(.  sqlite3_fil
23970 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
23980 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f       /* Handle o
23990 70 65 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20  pen on database 
239a0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  file */.  int iR
239b0 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20  egion,          
239c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
239d0 69 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20  ion to retrieve 
239e0 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f  */.  int szRegio
239f0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
23a00 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
23a10 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  regions */.  int
23a20 20 62 45 78 74 65 6e 64 2c 20 20 20 20 20 20 20   bExtend,       
23a30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23a40 54 72 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66  True to extend f
23a50 69 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  ile if necessary
23a60 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74   */.  void volat
23a70 69 6c 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20  ile **pp        
23a80 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61        /* OUT: Ma
23a90 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29  pped memory */.)
23aa0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44  {.  unixFile *pD
23ab0 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  bFd = (unixFile*
23ac0 29 66 64 3b 0a 20 20 75 6e 69 78 53 68 6d 20 2a  )fd;.  unixShm *
23ad0 70 3b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  p;.  unixShmNode
23ae0 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e   *pShmNode;.  in
23af0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
23b00 3b 0a 20 20 69 6e 74 20 6e 53 68 6d 50 65 72 4d  ;.  int nShmPerM
23b10 61 70 20 3d 20 75 6e 69 78 53 68 6d 52 65 67 69  ap = unixShmRegi
23b20 6f 6e 50 65 72 4d 61 70 28 29 3b 0a 20 20 69 6e  onPerMap();.  in
23b30 74 20 6e 52 65 71 52 65 67 69 6f 6e 3b 0a 0a 20  t nReqRegion;.. 
23b40 20 2f 2a 20 49 66 20 74 68 65 20 73 68 61 72 65   /* If the share
23b50 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 68 61  d-memory file ha
23b60 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f  s not yet been o
23b70 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e  pened, open it n
23b80 6f 77 2e 20 2a 2f 0a 20 20 69 66 28 20 70 44 62  ow. */.  if( pDb
23b90 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 7b 0a 20  Fd->pShm==0 ){. 
23ba0 20 20 20 72 63 20 3d 20 75 6e 69 78 4f 70 65 6e     rc = unixOpen
23bb0 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62  SharedMemory(pDb
23bc0 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Fd);.    if( rc!
23bd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
23be0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70  urn rc;.  }..  p
23bf0 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a   = pDbFd->pShm;.
23c00 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e    pShmNode = p->
23c10 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 73 71 6c 69  pShmNode;.  sqli
23c20 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
23c30 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
23c40 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 52 65  ;.  assert( szRe
23c50 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e  gion==pShmNode->
23c60 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68 6d  szRegion || pShm
23c70 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30  Node->nRegion==0
23c80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
23c90 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d  hmNode->pInode==
23ca0 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b  pDbFd->pInode );
23cb0 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
23cc0 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44 62  ode->h>=0 || pDb
23cd0 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  Fd->pInode->bPro
23ce0 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20  cessLock==1 );. 
23cf0 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
23d00 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62 46 64 2d  e->h<0 || pDbFd-
23d10 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73  >pInode->bProces
23d20 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 2f  sLock==0 );..  /
23d30 2a 20 4d 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72  * Minimum number
23d40 20 6f 66 20 72 65 67 69 6f 6e 73 20 72 65 71 75   of regions requ
23d50 69 72 65 64 20 74 6f 20 62 65 20 6d 61 70 70 65  ired to be mappe
23d60 64 2e 20 2a 2f 0a 20 20 6e 52 65 71 52 65 67 69  d. */.  nReqRegi
23d70 6f 6e 20 3d 20 28 28 69 52 65 67 69 6f 6e 2b 6e  on = ((iRegion+n
23d80 53 68 6d 50 65 72 4d 61 70 29 20 2f 20 6e 53 68  ShmPerMap) / nSh
23d90 6d 50 65 72 4d 61 70 29 20 2a 20 6e 53 68 6d 50  mPerMap) * nShmP
23da0 65 72 4d 61 70 3b 0a 0a 20 20 69 66 28 20 70 53  erMap;..  if( pS
23db0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c  hmNode->nRegion<
23dc0 6e 52 65 71 52 65 67 69 6f 6e 20 29 7b 0a 20 20  nReqRegion ){.  
23dd0 20 20 63 68 61 72 20 2a 2a 61 70 4e 65 77 3b 20    char **apNew; 
23de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23df0 20 20 20 20 20 2f 2a 20 4e 65 77 20 61 70 52 65       /* New apRe
23e00 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a  gion[] array */.
23e10 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
23e20 6e 52 65 71 52 65 67 69 6f 6e 2a 73 7a 52 65 67  nReqRegion*szReg
23e30 69 6f 6e 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75  ion;   /* Minimu
23e40 6d 20 72 65 71 75 69 72 65 64 20 66 69 6c 65 20  m required file 
23e50 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 74 72 75  size */.    stru
23e60 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20  ct stat sStat;  
23e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23e80 2a 20 55 73 65 64 20 62 79 20 66 73 74 61 74 28  * Used by fstat(
23e90 29 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f  ) */..    pShmNo
23ea0 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73  de->szRegion = s
23eb0 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20 69 66  zRegion;..    if
23ec0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30  ( pShmNode->h>=0
23ed0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
23ee0 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f   requested regio
23ef0 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20  n is not mapped 
23f00 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
23f10 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63  ses address spac
23f20 65 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 65 63  e..      ** Chec
23f30 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 68  k to see if it h
23f40 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
23f50 64 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20 77  d (i.e. if the w
23f60 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 69 73  al-index file is
23f70 0a 20 20 20 20 20 20 2a 2a 20 6c 61 72 67 65 20  .      ** large 
23f80 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61 69  enough to contai
23f90 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
23fa0 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20 20 20 2a  region)..      *
23fb0 2f 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46 73  /.      if( osFs
23fc0 74 61 74 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  tat(pShmNode->h,
23fd0 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20   &sStat) ){.    
23fe0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
23ff0 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 3b 0a 20  IOERR_SHMSIZE;. 
24000 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70         goto shmp
24010 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  age_out;.      }
24020 0a 20 20 0a 20 20 20 20 20 20 69 66 28 20 73 53  .  .      if( sS
24030 74 61 74 2e 73 74 5f 73 69 7a 65 3c 6e 42 79 74  tat.st_size<nByt
24040 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
24050 54 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65  The requested me
24060 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73  mory region does
24070 20 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 20 62   not exist. If b
24080 45 78 74 65 6e 64 20 69 73 20 73 65 74 20 74 6f  Extend is set to
24090 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 61 6c 73  .        ** fals
240a0 65 2c 20 65 78 69 74 20 65 61 72 6c 79 2e 20 2a  e, exit early. *
240b0 70 70 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74  pp will be set t
240c0 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54  o NULL and SQLIT
240d0 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20  E_OK returned.. 
240e0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
240f0 20 20 69 66 28 20 21 62 45 78 74 65 6e 64 20 29    if( !bExtend )
24100 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
24110 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
24120 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
24130 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 6c   /* Alternativel
24140 79 2c 20 69 66 20 62 45 78 74 65 6e 64 20 69 73  y, if bExtend is
24150 20 74 72 75 65 2c 20 65 78 74 65 6e 64 20 74 68   true, extend th
24160 65 20 66 69 6c 65 2e 20 44 6f 20 74 68 69 73 20  e file. Do this 
24170 62 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 72  by.        ** wr
24180 69 74 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 62  iting a single b
24190 79 74 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  yte to the end o
241a0 66 20 65 61 63 68 20 28 4f 53 29 20 70 61 67 65  f each (OS) page
241b0 20 62 65 69 6e 67 0a 20 20 20 20 20 20 20 20 2a   being.        *
241c0 2a 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 65  * allocated or e
241d0 78 74 65 6e 64 65 64 2e 20 54 65 63 68 6e 69 63  xtended. Technic
241e0 61 6c 6c 79 2c 20 77 65 20 6e 65 65 64 20 6f 6e  ally, we need on
241f0 6c 79 20 77 72 69 74 65 20 74 6f 20 74 68 65 0a  ly write to the.
24200 20 20 20 20 20 20 20 20 2a 2a 20 6c 61 73 74 20          ** last 
24210 70 61 67 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  page in order to
24220 20 65 78 74 65 6e 64 20 74 68 65 20 66 69 6c 65   extend the file
24230 2e 20 42 75 74 20 77 72 69 74 69 6e 67 20 74 6f  . But writing to
24240 20 61 6c 6c 20 6e 65 77 0a 20 20 20 20 20 20 20   all new.       
24250 20 2a 2a 20 70 61 67 65 73 20 66 6f 72 63 65 73   ** pages forces
24260 20 74 68 65 20 4f 53 20 74 6f 20 61 6c 6c 6f 63   the OS to alloc
24270 61 74 65 20 74 68 65 6d 20 69 6d 6d 65 64 69 61  ate them immedia
24280 74 65 6c 79 2c 20 77 68 69 63 68 20 72 65 64 75  tely, which redu
24290 63 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ces.        ** t
242a0 68 65 20 63 68 61 6e 63 65 73 20 6f 66 20 53 49  he chances of SI
242b0 47 42 55 53 20 77 68 69 6c 65 20 61 63 63 65 73  GBUS while acces
242c0 73 69 6e 67 20 74 68 65 20 6d 61 70 70 65 64 20  sing the mapped 
242d0 72 65 67 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e  region later on.
242e0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
242f0 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
24300 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
24310 20 69 6e 74 20 70 67 73 7a 20 3d 20 34 30 39 36   int pgsz = 4096
24320 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
24330 69 50 67 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  iPg;..          
24340 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65 20  /* Write to the 
24350 6c 61 73 74 20 62 79 74 65 20 6f 66 20 65 61 63  last byte of eac
24360 68 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65  h newly allocate
24370 64 20 6f 72 20 65 78 74 65 6e 64 65 64 20 70 61  d or extended pa
24380 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ge */.          
24390 61 73 73 65 72 74 28 20 28 6e 42 79 74 65 20 25  assert( (nByte %
243a0 20 70 67 73 7a 29 3d 3d 30 20 29 3b 0a 20 20 20   pgsz)==0 );.   
243b0 20 20 20 20 20 20 20 66 6f 72 28 69 50 67 3d 28         for(iPg=(
243c0 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 2f 70 67  sStat.st_size/pg
243d0 73 7a 29 3b 20 69 50 67 3c 28 6e 42 79 74 65 2f  sz); iPg<(nByte/
243e0 70 67 73 7a 29 3b 20 69 50 67 2b 2b 29 7b 0a 20  pgsz); iPg++){. 
243f0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 78             int x
24400 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
24410 20 20 69 66 28 20 73 65 65 6b 41 6e 64 57 72 69    if( seekAndWri
24420 74 65 46 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  teFd(pShmNode->h
24430 2c 20 69 50 67 2a 70 67 73 7a 20 2b 20 70 67 73  , iPg*pgsz + pgs
24440 7a 2d 31 2c 20 22 22 2c 20 31 2c 20 26 78 29 21  z-1, "", 1, &x)!
24450 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =1 ){.          
24460 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
24470 7a 46 69 6c 65 20 3d 20 70 53 68 6d 4e 6f 64 65  zFile = pShmNode
24480 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20  ->zFilename;.   
24490 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
244a0 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
244b0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a  ITE_IOERR_SHMSIZ
244c0 45 2c 20 22 77 72 69 74 65 22 2c 20 7a 46 69 6c  E, "write", zFil
244d0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
244e0 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
244f0 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ut;.            
24500 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
24510 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
24520 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
24530 70 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  p the requested 
24540 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e  memory region in
24550 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65  to this processe
24560 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e  s address space.
24570 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d 20   */.    apNew = 
24580 28 63 68 61 72 20 2a 2a 29 73 71 6c 69 74 65 33  (char **)sqlite3
24590 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20  _realloc(.      
245a0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65    pShmNode->apRe
245b0 67 69 6f 6e 2c 20 6e 52 65 71 52 65 67 69 6f 6e  gion, nReqRegion
245c0 2a 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 0a  *sizeof(char *).
245d0 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21      );.    if( !
245e0 61 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72  apNew ){.      r
245f0 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
24600 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
24610 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
24620 20 20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f      }.    pShmNo
24630 64 65 2d 3e 61 70 52 65 67 69 6f 6e 20 3d 20 61  de->apRegion = a
24640 70 4e 65 77 3b 0a 20 20 20 20 77 68 69 6c 65 28  pNew;.    while(
24650 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
24660 6f 6e 3c 6e 52 65 71 52 65 67 69 6f 6e 20 29 7b  on<nReqRegion ){
24670 0a 20 20 20 20 20 20 69 6e 74 20 6e 4d 61 70 20  .      int nMap 
24680 3d 20 73 7a 52 65 67 69 6f 6e 2a 6e 53 68 6d 50  = szRegion*nShmP
24690 65 72 4d 61 70 3b 0a 20 20 20 20 20 20 69 6e 74  erMap;.      int
246a0 20 69 3b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a   i;.      void *
246b0 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66 28 20  pMem;.      if( 
246c0 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29  pShmNode->h>=0 )
246d0 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d  {.        pMem =
246e0 20 6f 73 4d 6d 61 70 28 30 2c 20 6e 4d 61 70 2c   osMmap(0, nMap,
246f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 68  .            pSh
24700 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c  mNode->isReadonl
24710 79 20 3f 20 50 52 4f 54 5f 52 45 41 44 20 3a 20  y ? PROT_READ : 
24720 50 52 4f 54 5f 52 45 41 44 7c 50 52 4f 54 5f 57  PROT_READ|PROT_W
24730 52 49 54 45 2c 20 0a 20 20 20 20 20 20 20 20 20  RITE, .         
24740 20 20 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 70     MAP_SHARED, p
24750 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73 7a 52 65  ShmNode->h, szRe
24760 67 69 6f 6e 2a 28 69 36 34 29 70 53 68 6d 4e 6f  gion*(i64)pShmNo
24770 64 65 2d 3e 6e 52 65 67 69 6f 6e 0a 20 20 20 20  de->nRegion.    
24780 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
24790 66 28 20 70 4d 65 6d 3d 3d 4d 41 50 5f 46 41 49  f( pMem==MAP_FAI
247a0 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  LED ){.         
247b0 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
247c0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
247d0 53 48 4d 4d 41 50 2c 20 22 6d 6d 61 70 22 2c 20  SHMMAP, "mmap", 
247e0 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e  pShmNode->zFilen
247f0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
24800 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
24810 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
24820 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
24830 20 70 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33 5f   pMem = sqlite3_
24840 6d 61 6c 6c 6f 63 36 34 28 73 7a 52 65 67 69 6f  malloc64(szRegio
24850 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  n);.        if( 
24860 70 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pMem==0 ){.     
24870 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
24880 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
24890 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
248a0 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
248b0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4d 65        memset(pMe
248c0 6d 2c 20 30 2c 20 73 7a 52 65 67 69 6f 6e 29 3b  m, 0, szRegion);
248d0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
248e0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 68 6d 50  for(i=0; i<nShmP
248f0 65 72 4d 61 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  erMap; i++){.   
24900 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61       pShmNode->a
24910 70 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65  pRegion[pShmNode
24920 2d 3e 6e 52 65 67 69 6f 6e 2b 69 5d 20 3d 20 26  ->nRegion+i] = &
24930 28 28 63 68 61 72 2a 29 70 4d 65 6d 29 5b 73 7a  ((char*)pMem)[sz
24940 52 65 67 69 6f 6e 2a 69 5d 3b 0a 20 20 20 20 20  Region*i];.     
24950 20 7d 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64   }.      pShmNod
24960 65 2d 3e 6e 52 65 67 69 6f 6e 20 2b 3d 20 6e 53  e->nRegion += nS
24970 68 6d 50 65 72 4d 61 70 3b 0a 20 20 20 20 7d 0a  hmPerMap;.    }.
24980 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74    }..shmpage_out
24990 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  :.  if( pShmNode
249a0 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f  ->nRegion>iRegio
249b0 6e 20 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20 70  n ){.    *pp = p
249c0 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f  ShmNode->apRegio
249d0 6e 5b 69 52 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65  n[iRegion];.  }e
249e0 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30  lse{.    *pp = 0
249f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 68 6d  ;.  }.  if( pShm
24a00 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79  Node->isReadonly
24a10 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
24a20 4b 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  K ) rc = SQLITE_
24a30 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 73 71 6c 69  READONLY;.  sqli
24a40 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
24a50 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
24a60 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
24a70 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
24a80 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f  he lock state fo
24a90 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  r a shared-memor
24aa0 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  y segment..**.**
24ab0 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 72   Note that the r
24ac0 65 6c 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77  elationship betw
24ad0 65 65 6e 20 53 48 41 52 45 64 20 61 6e 64 20 45  een SHAREd and E
24ae0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 69  XCLUSIVE locks i
24af0 73 20 61 20 6c 69 74 74 6c 65 0a 2a 2a 20 64 69  s a little.** di
24b00 66 66 65 72 65 6e 74 20 68 65 72 65 20 74 68 61  fferent here tha
24b10 6e 20 69 6e 20 70 6f 73 69 78 2e 20 20 49 6e 20  n in posix.  In 
24b20 78 53 68 6d 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20  xShmLock(), one 
24b30 63 61 6e 20 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f  can go from unlo
24b40 63 6b 65 64 0a 2a 2a 20 74 6f 20 73 68 61 72 65  cked.** to share
24b50 64 20 61 6e 64 20 62 61 63 6b 20 6f 72 20 66 72  d and back or fr
24b60 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 65  om unlocked to e
24b70 78 63 6c 75 73 69 76 65 20 61 6e 64 20 62 61 63  xclusive and bac
24b80 6b 2e 20 20 42 75 74 20 6f 6e 65 20 6d 61 79 0a  k.  But one may.
24b90 2a 2a 20 6e 6f 74 20 67 6f 20 66 72 6f 6d 20 73  ** not go from s
24ba0 68 61 72 65 64 20 74 6f 20 65 78 63 6c 75 73 69  hared to exclusi
24bb0 76 65 20 6f 72 20 66 72 6f 6d 20 65 78 63 6c 75  ve or from exclu
24bc0 73 69 76 65 20 74 6f 20 73 68 61 72 65 64 2e 0a  sive to shared..
24bd0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
24be0 69 78 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c  ixShmLock(.  sql
24bf0 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
24c00 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
24c10 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67  ase file holding
24c20 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
24c30 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74  ry */.  int ofst
24c40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24c50 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b     /* First lock
24c60 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72   to acquire or r
24c70 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  elease */.  int 
24c80 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
24c90 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
24ca0 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71   of locks to acq
24cb0 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20  uire or release 
24cc0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
24cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ce0 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
24cf0 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29  th the lock */.)
24d00 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44  {.  unixFile *pD
24d10 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  bFd = (unixFile*
24d20 29 66 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e  )fd;      /* Con
24d30 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20  nection holding 
24d40 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
24d50 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20  .  unixShm *p = 
24d60 70 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20  pDbFd->pShm;    
24d70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
24d80 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 65  shared memory be
24d90 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20  ing locked */.  
24da0 75 6e 69 78 53 68 6d 20 2a 70 58 3b 20 20 20 20  unixShm *pX;    
24db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24dc0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
24dd0 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69  ping over all si
24de0 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 75 6e 69 78  blings */.  unix
24df0 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
24e00 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b  e = p->pShmNode;
24e10 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
24e20 69 6e 67 20 66 69 6c 65 20 69 4e 6f 64 65 20 2a  ing file iNode *
24e30 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
24e40 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
24e50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
24e60 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31  ult code */.  u1
24e70 36 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  6 mask;         
24e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e90 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c      /* Mask of l
24ea0 6f 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72 20  ocks to take or 
24eb0 72 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73  release */..  as
24ec0 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d  sert( pShmNode==
24ed0 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pDbFd->pInode->p
24ee0 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73  ShmNode );.  ass
24ef0 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  ert( pShmNode->p
24f00 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49  Inode==pDbFd->pI
24f10 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74  node );.  assert
24f20 28 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66 73  ( ofst>=0 && ofs
24f30 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f  t+n<=SQLITE_SHM_
24f40 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  NLOCK );.  asser
24f50 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73  t( n>=1 );.  ass
24f60 65 72 74 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c  ert( flags==(SQL
24f70 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53  ITE_SHM_LOCK | S
24f80 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
24f90 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67  ).       || flag
24fa0 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c  s==(SQLITE_SHM_L
24fb0 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
24fc0 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20 20  _EXCLUSIVE).    
24fd0 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51     || flags==(SQ
24fe0 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20  LITE_SHM_UNLOCK 
24ff0 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41  | SQLITE_SHM_SHA
25000 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66  RED).       || f
25010 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
25020 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  M_UNLOCK | SQLIT
25030 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
25040 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d   );.  assert( n=
25050 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53  =1 || (flags & S
25060 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53  QLITE_SHM_EXCLUS
25070 49 56 45 29 21 3d 30 20 29 3b 0a 20 20 61 73 73  IVE)!=0 );.  ass
25080 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  ert( pShmNode->h
25090 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49  >=0 || pDbFd->pI
250a0 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
250b0 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  ck==1 );.  asser
250c0 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30  t( pShmNode->h<0
250d0 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64   || pDbFd->pInod
250e0 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
250f0 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20  =0 );..  mask = 
25100 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20  (1<<(ofst+n)) - 
25110 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 61 73 73  (1<<ofst);.  ass
25120 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b  ert( n>1 || mask
25130 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20  ==(1<<ofst) );. 
25140 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
25150 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
25160 75 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c 61  utex);.  if( fla
25170 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f  gs & SQLITE_SHM_
25180 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31  UNLOCK ){.    u1
25190 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f  6 allMask = 0; /
251a0 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20  * Mask of locks 
251b0 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 73  held by siblings
251c0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20   */..    /* See 
251d0 69 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20  if any siblings 
251e0 68 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20 6c  hold this same l
251f0 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70  ock */.    for(p
25200 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  X=pShmNode->pFir
25210 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  st; pX; pX=pX->p
25220 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
25230 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75   pX==p ) continu
25240 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
25250 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26   (pX->exclMask &
25260 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d   (p->exclMask|p-
25270 3e 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30  >sharedMask))==0
25280 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73   );.      allMas
25290 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d  k |= pX->sharedM
252a0 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ask;.    }..    
252b0 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79  /* Unlock the sy
252c0 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73  stem-level locks
252d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61 73   */.    if( (mas
252e0 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20  k & allMask)==0 
252f0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e  ){.      rc = un
25300 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
25310 70 44 62 46 64 2c 20 46 5f 55 4e 4c 43 4b 2c 20  pDbFd, F_UNLCK, 
25320 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41  ofst+UNIX_SHM_BA
25330 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  SE, n);.    }els
25340 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
25350 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a  LITE_OK;.    }..
25360 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20      /* Undo the 
25370 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20  local locks */. 
25380 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
25390 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
253a0 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61  >exclMask &= ~ma
253b0 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61  sk;.      p->sha
253c0 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  redMask &= ~mask
253d0 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65  ;.    } .  }else
253e0 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
253f0 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29  ITE_SHM_SHARED )
25400 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 53 68 61  {.    u16 allSha
25410 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69  red = 0;  /* Uni
25420 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64  on of locks held
25430 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20   by connections 
25440 6f 74 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a  other than "p" *
25450 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f  /..    /* Find o
25460 75 74 20 77 68 69 63 68 20 73 68 61 72 65 64 20  ut which shared 
25470 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64  locks are alread
25480 79 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e  y held by siblin
25490 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20  g connections.. 
254a0 20 20 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62     ** If any sib
254b0 6c 69 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c  ling already hol
254c0 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ds an exclusive 
254d0 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61  lock, go ahead a
254e0 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a  nd return.    **
254f0 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20   SQLITE_BUSY..  
25500 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d    */.    for(pX=
25510 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
25520 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65  ; pX; pX=pX->pNe
25530 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  xt){.      if( (
25540 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d  pX->exclMask & m
25550 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ask)!=0 ){.     
25560 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
25570 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65  USY;.        bre
25580 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
25590 20 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70    allShared |= p
255a0 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20  X->sharedMask;. 
255b0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74     }..    /* Get
255c0 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74   shared locks at
255d0 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65   the system leve
255e0 6c 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  l, if necessary 
255f0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
25600 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25610 20 20 69 66 28 20 28 61 6c 6c 53 68 61 72 65 64    if( (allShared
25620 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20   & mask)==0 ){. 
25630 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
25640 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44  ShmSystemLock(pD
25650 62 46 64 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 66  bFd, F_RDLCK, of
25660 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45  st+UNIX_SHM_BASE
25670 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , n);.      }els
25680 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
25690 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
256a0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
256b0 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 73   Get the local s
256c0 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20  hared locks */. 
256d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
256e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
256f0 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d  >sharedMask |= m
25700 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ask;.    }.  }el
25710 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20  se{.    /* Make 
25720 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20  sure no sibling 
25730 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64  connections hold
25740 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69 6c 6c   locks that will
25750 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20 20   block this.    
25760 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79  ** lock.  If any
25770 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c 49   do, return SQLI
25780 54 45 5f 42 55 53 59 20 72 69 67 68 74 20 61 77  TE_BUSY right aw
25790 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ay..    */.    f
257a0 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e  or(pX=pShmNode->
257b0 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70  pFirst; pX; pX=p
257c0 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  X->pNext){.     
257d0 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61   if( (pX->exclMa
257e0 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c  sk & mask)!=0 ||
257f0 20 28 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b   (pX->sharedMask
25800 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20   & mask)!=0 ){. 
25810 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
25820 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
25830 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
25840 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
25850 47 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76  Get the exclusiv
25860 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73  e locks at the s
25870 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68  ystem level.  Th
25880 65 6e 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  en if successful
25890 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72  .    ** also mar
258a0 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e  k the local conn
258b0 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e 67 20  ection as being 
258c0 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  locked..    */. 
258d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
258e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
258f0 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d   = unixShmSystem
25900 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f 57 52  Lock(pDbFd, F_WR
25910 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53  LCK, ofst+UNIX_S
25920 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20  HM_BASE, n);.   
25930 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
25940 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
25950 61 73 73 65 72 74 28 20 28 70 2d 3e 73 68 61 72  assert( (p->shar
25960 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d  edMask & mask)==
25970 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 );.        p->
25980 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  exclMask |= mask
25990 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
259a0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
259b0 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
259c0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53  de->mutex);.  OS
259d0 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b  TRACE(("SHM-LOCK
259e0 20 73 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25   shmid-%d, pid-%
259f0 64 20 67 6f 74 20 25 30 33 78 2c 25 30 33 78 5c  d got %03x,%03x\
25a00 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
25a10 2d 3e 69 64 2c 20 6f 73 47 65 74 70 69 64 28 30  ->id, osGetpid(0
25a20 29 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b  ), p->sharedMask
25a30 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b  , p->exclMask));
25a40 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25a50 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
25a60 20 61 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65   a memory barrie
25a70 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63  r or memory fenc
25a80 65 20 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f  e on shared memo
25a90 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  ry.  .**.** All 
25aa0 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f 72 65 73  loads and stores
25ab0 20 62 65 67 75 6e 20 62 65 66 6f 72 65 20 74 68   begun before th
25ac0 65 20 62 61 72 72 69 65 72 20 6d 75 73 74 20 63  e barrier must c
25ad0 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a  omplete before.*
25ae0 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74  * any load or st
25af0 6f 72 65 20 62 65 67 75 6e 20 61 66 74 65 72 20  ore begun after 
25b00 74 68 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a  the barrier..*/.
25b10 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
25b20 53 68 6d 42 61 72 72 69 65 72 28 0a 20 20 73 71  ShmBarrier(.  sq
25b30 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20  lite3_file *fd  
25b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25b50 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   Database file h
25b60 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65  olding the share
25b70 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20  d memory */.){. 
25b80 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
25b90 52 28 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  R(fd);.  sqlite3
25ba0 4d 65 6d 6f 72 79 42 61 72 72 69 65 72 28 29 3b  MemoryBarrier();
25bb0 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6d 70           /* comp
25bc0 69 6c 65 72 2d 64 65 66 69 6e 65 64 20 6d 65 6d  iler-defined mem
25bd0 6f 72 79 20 62 61 72 72 69 65 72 20 2a 2f 0a 20  ory barrier */. 
25be0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
25bf0 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
25c00 20 2f 2a 20 41 6c 73 6f 20 6d 75 74 65 78 2c 20   /* Also mutex, 
25c10 66 6f 72 20 72 65 64 75 6e 64 61 6e 63 79 20 2a  for redundancy *
25c20 2f 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  /.  unixLeaveMut
25c30 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ex();.}../*.** C
25c40 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f  lose a connectio
25c50 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f  n to shared-memo
25c60 72 79 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20  ry.  Delete the 
25c70 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73  underlying .** s
25c80 74 6f 72 61 67 65 20 69 66 20 64 65 6c 65 74 65  torage if delete
25c90 46 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a  Flag is true..**
25ca0 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20  .** If there is 
25cb0 6e 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  no shared memory
25cc0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
25cd0 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
25ce0 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75  then this.** rou
25cf0 74 69 6e 65 20 69 73 20 61 20 68 61 72 6d 6c 65  tine is a harmle
25d00 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61  ss no-op..*/.sta
25d10 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 55  tic int unixShmU
25d20 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f  nmap(.  sqlite3_
25d30 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
25d40 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75          /* The u
25d50 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
25d60 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
25d70 20 64 65 6c 65 74 65 46 6c 61 67 20 20 20 20 20   deleteFlag     
25d80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25d90 44 65 6c 65 74 65 20 73 68 61 72 65 64 2d 6d 65  Delete shared-me
25da0 6d 6f 72 79 20 69 66 20 74 72 75 65 20 2a 2f 0a  mory if true */.
25db0 29 7b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b  ){.  unixShm *p;
25dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25dd0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e       /* The conn
25de0 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f  ection to be clo
25df0 73 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  sed */.  unixShm
25e00 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20  Node *pShmNode; 
25e10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
25e20 75 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65  underlying share
25e30 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f  d-memory file */
25e40 0a 20 20 75 6e 69 78 53 68 6d 20 2a 2a 70 70 3b  .  unixShm **pp;
25e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e60 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
25e70 67 20 6f 76 65 72 20 73 69 62 6c 69 6e 67 20 63  g over sibling c
25e80 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  onnections */.  
25e90 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 3b  unixFile *pDbFd;
25ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25eb0 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
25ec0 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
25ed0 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 75  */..  pDbFd = (u
25ee0 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70  nixFile*)fd;.  p
25ef0 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a   = pDbFd->pShm;.
25f00 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
25f10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
25f20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70   pShmNode = p->p
25f30 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 61 73 73 65  ShmNode;..  asse
25f40 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44  rt( pShmNode==pD
25f50 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68  bFd->pInode->pSh
25f60 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72  mNode );.  asser
25f70 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e  t( pShmNode->pIn
25f80 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f  ode==pDbFd->pIno
25f90 64 65 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f  de );..  /* Remo
25fa0 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20  ve connection p 
25fb0 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20  from the set of 
25fc0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f  connections asso
25fd0 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68  ciated.  ** with
25fe0 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73   pShmNode */.  s
25ff0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
26000 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
26010 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70  ex);.  for(pp=&p
26020 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
26030 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20   (*pp)!=p; pp = 
26040 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d  &(*pp)->pNext){}
26050 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78  .  *pp = p->pNex
26060 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68  t;..  /* Free th
26070 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a  e connection p *
26080 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  /.  sqlite3_free
26090 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53  (p);.  pDbFd->pS
260a0 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  hm = 0;.  sqlite
260b0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
260c0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
260d0 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64  .  /* If pShmNod
260e0 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63  e->nRef has reac
260f0 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73  hed 0, then clos
26100 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
26110 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d  .  ** shared-mem
26120 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f  ory file, too */
26130 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
26140 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  x();.  assert( p
26150 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20  ShmNode->nRef>0 
26160 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  );.  pShmNode->n
26170 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68  Ref--;.  if( pSh
26180 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29  mNode->nRef==0 )
26190 7b 0a 20 20 20 20 69 66 28 20 64 65 6c 65 74 65  {.    if( delete
261a0 46 6c 61 67 20 26 26 20 70 53 68 6d 4e 6f 64 65  Flag && pShmNode
261b0 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->h>=0 ){.      
261c0 6f 73 55 6e 6c 69 6e 6b 28 70 53 68 6d 4e 6f 64  osUnlink(pShmNod
261d0 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  e->zFilename);. 
261e0 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 53 68 6d     }.    unixShm
261f0 50 75 72 67 65 28 70 44 62 46 64 29 3b 0a 20 20  Purge(pDbFd);.  
26200 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  }.  unixLeaveMut
26210 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  ex();..  return 
26220 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23  SQLITE_OK;.}...#
26230 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 75 6e  else.# define un
26240 69 78 53 68 6d 4d 61 70 20 20 20 20 20 30 0a 23  ixShmMap     0.#
26250 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4c   define unixShmL
26260 6f 63 6b 20 20 20 20 30 0a 23 20 64 65 66 69 6e  ock    0.# defin
26270 65 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72  e unixShmBarrier
26280 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78   0.# define unix
26290 53 68 6d 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e  ShmUnmap   0.#en
262a0 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53  dif /* #ifndef S
262b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a  QLITE_OMIT_WAL *
262c0 2f 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  /..#if SQLITE_MA
262d0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a  X_MMAP_SIZE>0./*
262e0 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 63 75 72  .** If it is cur
262f0 72 65 6e 74 6c 79 20 6d 65 6d 6f 72 79 20 6d 61  rently memory ma
26300 70 70 65 64 2c 20 75 6e 6d 61 70 20 66 69 6c 65  pped, unmap file
26310 20 70 46 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   pFd..*/.static 
26320 76 6f 69 64 20 75 6e 69 78 55 6e 6d 61 70 66 69  void unixUnmapfi
26330 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  le(unixFile *pFd
26340 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 46 64  ){.  assert( pFd
26350 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29  ->nFetchOut==0 )
26360 3b 0a 20 20 69 66 28 20 70 46 64 2d 3e 70 4d 61  ;.  if( pFd->pMa
26370 70 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 6f  pRegion ){.    o
26380 73 4d 75 6e 6d 61 70 28 70 46 64 2d 3e 70 4d 61  sMunmap(pFd->pMa
26390 70 52 65 67 69 6f 6e 2c 20 70 46 64 2d 3e 6d 6d  pRegion, pFd->mm
263a0 61 70 53 69 7a 65 41 63 74 75 61 6c 29 3b 0a 20  apSizeActual);. 
263b0 20 20 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69     pFd->pMapRegi
263c0 6f 6e 20 3d 20 30 3b 0a 20 20 20 20 70 46 64 2d  on = 0;.    pFd-
263d0 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20  >mmapSize = 0;. 
263e0 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65     pFd->mmapSize
263f0 41 63 74 75 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a  Actual = 0;.  }.
26400 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
26410 20 74 6f 20 73 65 74 20 74 68 65 20 73 69 7a 65   to set the size
26420 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d   of the memory m
26430 61 70 70 69 6e 67 20 6d 61 69 6e 74 61 69 6e 65  apping maintaine
26440 64 20 62 79 20 66 69 6c 65 20 0a 2a 2a 20 64 65  d by file .** de
26450 73 63 72 69 70 74 6f 72 20 70 46 64 20 74 6f 20  scriptor pFd to 
26460 6e 4e 65 77 20 62 79 74 65 73 2e 20 41 6e 79 20  nNew bytes. Any 
26470 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67  existing mapping
26480 20 69 73 20 64 69 73 63 61 72 64 65 64 2e 0a 2a   is discarded..*
26490 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
264a0 75 6c 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ul, this functio
264b0 6e 20 73 65 74 73 20 74 68 65 20 66 6f 6c 6c 6f  n sets the follo
264c0 77 69 6e 67 20 76 61 72 69 61 62 6c 65 73 3a 0a  wing variables:.
264d0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 75 6e 69 78  **.**       unix
264e0 46 69 6c 65 2e 70 4d 61 70 52 65 67 69 6f 6e 0a  File.pMapRegion.
264f0 2a 2a 20 20 20 20 20 20 20 75 6e 69 78 46 69 6c  **       unixFil
26500 65 2e 6d 6d 61 70 53 69 7a 65 0a 2a 2a 20 20 20  e.mmapSize.**   
26510 20 20 20 20 75 6e 69 78 46 69 6c 65 2e 6d 6d 61      unixFile.mma
26520 70 53 69 7a 65 41 63 74 75 61 6c 0a 2a 2a 0a 2a  pSizeActual.**.*
26530 2a 20 49 66 20 75 6e 73 75 63 63 65 73 73 66 75  * If unsuccessfu
26540 6c 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  l, an error mess
26550 61 67 65 20 69 73 20 6c 6f 67 67 65 64 20 76 69  age is logged vi
26560 61 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20  a sqlite3_log() 
26570 61 6e 64 0a 2a 2a 20 74 68 65 20 74 68 72 65 65  and.** the three
26580 20 76 61 72 69 61 62 6c 65 73 20 61 62 6f 76 65   variables above
26590 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 49 6e 20   are zeroed. In 
265a0 74 68 69 73 20 63 61 73 65 20 53 51 4c 69 74 65  this case SQLite
265b0 20 73 68 6f 75 6c 64 0a 2a 2a 20 63 6f 6e 74 69   should.** conti
265c0 6e 75 65 20 61 63 63 65 73 73 69 6e 67 20 74 68  nue accessing th
265d0 65 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  e database using
265e0 20 74 68 65 20 78 52 65 61 64 28 29 20 61 6e 64   the xRead() and
265f0 20 78 57 72 69 74 65 28 29 0a 2a 2a 20 6d 65 74   xWrite().** met
26600 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hods..*/.static 
26610 76 6f 69 64 20 75 6e 69 78 52 65 6d 61 70 66 69  void unixRemapfi
26620 6c 65 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  le(.  unixFile *
26630 70 46 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  pFd,            
26640 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
26650 73 63 72 69 70 74 6f 72 20 6f 62 6a 65 63 74 20  scriptor object 
26660 2a 2f 0a 20 20 69 36 34 20 6e 4e 65 77 20 20 20  */.  i64 nNew   
26670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26680 20 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64       /* Required
26690 20 6d 61 70 70 69 6e 67 20 73 69 7a 65 20 2a 2f   mapping size */
266a0 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
266b0 20 2a 7a 45 72 72 20 3d 20 22 6d 6d 61 70 22 3b   *zErr = "mmap";
266c0 0a 20 20 69 6e 74 20 68 20 3d 20 70 46 64 2d 3e  .  int h = pFd->
266d0 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
266e0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
266f0 64 65 73 63 72 69 70 74 6f 72 20 6f 70 65 6e 20  descriptor open 
26700 6f 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20  on db file */.  
26710 75 38 20 2a 70 4f 72 69 67 20 3d 20 28 75 38 20  u8 *pOrig = (u8 
26720 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f  *)pFd->pMapRegio
26730 6e 3b 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  n;   /* Pointer 
26740 74 6f 20 63 75 72 72 65 6e 74 20 66 69 6c 65 20  to current file 
26750 6d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 69 36 34  mapping */.  i64
26760 20 6e 4f 72 69 67 20 3d 20 70 46 64 2d 3e 6d 6d   nOrig = pFd->mm
26770 61 70 53 69 7a 65 41 63 74 75 61 6c 3b 20 20 20  apSizeActual;   
26780 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 4f 72    /* Size of pOr
26790 69 67 20 72 65 67 69 6f 6e 20 69 6e 20 62 79 74  ig region in byt
267a0 65 73 20 2a 2f 0a 20 20 75 38 20 2a 70 4e 65 77  es */.  u8 *pNew
267b0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
267c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
267d0 4c 6f 63 61 74 69 6f 6e 20 6f 66 20 6e 65 77 20  Location of new 
267e0 6d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  mapping */.  int
267f0 20 66 6c 61 67 73 20 3d 20 50 52 4f 54 5f 52 45   flags = PROT_RE
26800 41 44 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  AD;             
26810 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61    /* Flags to pa
26820 73 73 20 74 6f 20 6d 6d 61 70 28 29 20 2a 2f 0a  ss to mmap() */.
26830 0a 20 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e  .  assert( pFd->
26840 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a  nFetchOut==0 );.
26850 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 70    assert( nNew>p
26860 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 3b 0a  Fd->mmapSize );.
26870 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3c 3d    assert( nNew<=
26880 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  pFd->mmapSizeMax
26890 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e   );.  assert( nN
268a0 65 77 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ew>0 );.  assert
268b0 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41  ( pFd->mmapSizeA
268c0 63 74 75 61 6c 3e 3d 70 46 64 2d 3e 6d 6d 61 70  ctual>=pFd->mmap
268d0 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Size );.  assert
268e0 28 20 4d 41 50 5f 46 41 49 4c 45 44 21 3d 30 20  ( MAP_FAILED!=0 
268f0 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
26900 45 5f 4d 4d 41 50 5f 52 45 41 44 57 52 49 54 45  E_MMAP_READWRITE
26910 0a 20 20 69 66 28 20 28 70 46 64 2d 3e 63 74 72  .  if( (pFd->ctr
26920 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
26930 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 20 29 20 66  E_RDONLY)==0 ) f
26940 6c 61 67 73 20 7c 3d 20 50 52 4f 54 5f 57 52 49  lags |= PROT_WRI
26950 54 45 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  TE;.#endif..  if
26960 28 20 70 4f 72 69 67 20 29 7b 0a 23 69 66 20 48  ( pOrig ){.#if H
26970 41 56 45 5f 4d 52 45 4d 41 50 0a 20 20 20 20 69  AVE_MREMAP.    i
26980 36 34 20 6e 52 65 75 73 65 20 3d 20 70 46 64 2d  64 nReuse = pFd-
26990 3e 6d 6d 61 70 53 69 7a 65 3b 0a 23 65 6c 73 65  >mmapSize;.#else
269a0 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 73  .    const int s
269b0 7a 53 79 73 70 61 67 65 20 3d 20 6f 73 47 65 74  zSyspage = osGet
269c0 70 61 67 65 73 69 7a 65 28 29 3b 0a 20 20 20 20  pagesize();.    
269d0 69 36 34 20 6e 52 65 75 73 65 20 3d 20 28 70 46  i64 nReuse = (pF
269e0 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 26 20 7e 28  d->mmapSize & ~(
269f0 73 7a 53 79 73 70 61 67 65 2d 31 29 29 3b 0a 23  szSyspage-1));.#
26a00 65 6e 64 69 66 0a 20 20 20 20 75 38 20 2a 70 52  endif.    u8 *pR
26a10 65 71 20 3d 20 26 70 4f 72 69 67 5b 6e 52 65 75  eq = &pOrig[nReu
26a20 73 65 5d 3b 0a 0a 20 20 20 20 2f 2a 20 55 6e 6d  se];..    /* Unm
26a30 61 70 20 61 6e 79 20 70 61 67 65 73 20 6f 66 20  ap any pages of 
26a40 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70  the existing map
26a50 70 69 6e 67 20 74 68 61 74 20 63 61 6e 6e 6f 74  ping that cannot
26a60 20 62 65 20 72 65 75 73 65 64 2e 20 2a 2f 0a 20   be reused. */. 
26a70 20 20 20 69 66 28 20 6e 52 65 75 73 65 21 3d 6e     if( nReuse!=n
26a80 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 6f 73  Orig ){.      os
26a90 4d 75 6e 6d 61 70 28 70 52 65 71 2c 20 6e 4f 72  Munmap(pReq, nOr
26aa0 69 67 2d 6e 52 65 75 73 65 29 3b 0a 20 20 20 20  ig-nReuse);.    
26ab0 7d 0a 0a 23 69 66 20 48 41 56 45 5f 4d 52 45 4d  }..#if HAVE_MREM
26ac0 41 50 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73  AP.    pNew = os
26ad0 4d 72 65 6d 61 70 28 70 4f 72 69 67 2c 20 6e 52  Mremap(pOrig, nR
26ae0 65 75 73 65 2c 20 6e 4e 65 77 2c 20 4d 52 45 4d  euse, nNew, MREM
26af0 41 50 5f 4d 41 59 4d 4f 56 45 29 3b 0a 20 20 20  AP_MAYMOVE);.   
26b00 20 7a 45 72 72 20 3d 20 22 6d 72 65 6d 61 70 22   zErr = "mremap"
26b10 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 4e 65 77  ;.#else.    pNew
26b20 20 3d 20 6f 73 4d 6d 61 70 28 70 52 65 71 2c 20   = osMmap(pReq, 
26b30 6e 4e 65 77 2d 6e 52 65 75 73 65 2c 20 66 6c 61  nNew-nReuse, fla
26b40 67 73 2c 20 4d 41 50 5f 53 48 41 52 45 44 2c 20  gs, MAP_SHARED, 
26b50 68 2c 20 6e 52 65 75 73 65 29 3b 0a 20 20 20 20  h, nReuse);.    
26b60 69 66 28 20 70 4e 65 77 21 3d 4d 41 50 5f 46 41  if( pNew!=MAP_FA
26b70 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 69 66  ILED ){.      if
26b80 28 20 70 4e 65 77 21 3d 70 52 65 71 20 29 7b 0a  ( pNew!=pReq ){.
26b90 20 20 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70          osMunmap
26ba0 28 70 4e 65 77 2c 20 6e 4e 65 77 20 2d 20 6e 52  (pNew, nNew - nR
26bb0 65 75 73 65 29 3b 0a 20 20 20 20 20 20 20 20 70  euse);.        p
26bc0 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  New = 0;.      }
26bd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e  else{.        pN
26be0 65 77 20 3d 20 70 4f 72 69 67 3b 0a 20 20 20 20  ew = pOrig;.    
26bf0 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
26c00 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 74 74  ..    /* The att
26c10 65 6d 70 74 20 74 6f 20 65 78 74 65 6e 64 20 74  empt to extend t
26c20 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70  he existing mapp
26c30 69 6e 67 20 66 61 69 6c 65 64 2e 20 46 72 65 65  ing failed. Free
26c40 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   it. */.    if( 
26c50 70 4e 65 77 3d 3d 4d 41 50 5f 46 41 49 4c 45 44  pNew==MAP_FAILED
26c60 20 7c 7c 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20   || pNew==0 ){. 
26c70 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 4f       osMunmap(pO
26c80 72 69 67 2c 20 6e 52 65 75 73 65 29 3b 0a 20 20  rig, nReuse);.  
26c90 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
26ca0 20 70 4e 65 77 20 69 73 20 73 74 69 6c 6c 20 4e   pNew is still N
26cb0 55 4c 4c 2c 20 74 72 79 20 74 6f 20 63 72 65 61  ULL, try to crea
26cc0 74 65 20 61 6e 20 65 6e 74 69 72 65 6c 79 20 6e  te an entirely n
26cd0 65 77 20 6d 61 70 70 69 6e 67 2e 20 2a 2f 0a 20  ew mapping. */. 
26ce0 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
26cf0 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 6d 61      pNew = osMma
26d00 70 28 30 2c 20 6e 4e 65 77 2c 20 66 6c 61 67 73  p(0, nNew, flags
26d10 2c 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 68 2c  , MAP_SHARED, h,
26d20 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   0);.  }..  if( 
26d30 70 4e 65 77 3d 3d 4d 41 50 5f 46 41 49 4c 45 44  pNew==MAP_FAILED
26d40 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30   ){.    pNew = 0
26d50 3b 0a 20 20 20 20 6e 4e 65 77 20 3d 20 30 3b 0a  ;.    nNew = 0;.
26d60 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72      unixLogError
26d70 28 53 51 4c 49 54 45 5f 4f 4b 2c 20 7a 45 72 72  (SQLITE_OK, zErr
26d80 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 0a  , pFd->zPath);..
26d90 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 6d      /* If the mm
26da0 61 70 28 29 20 61 62 6f 76 65 20 66 61 69 6c 65  ap() above faile
26db0 64 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 61  d, assume that a
26dc0 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 6d 6d  ll subsequent mm
26dd0 61 70 28 29 20 63 61 6c 6c 73 0a 20 20 20 20 2a  ap() calls.    *
26de0 2a 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20  * will probably 
26df0 66 61 69 6c 20 74 6f 6f 2e 20 46 61 6c 6c 20 62  fail too. Fall b
26e00 61 63 6b 20 74 6f 20 75 73 69 6e 67 20 78 52 65  ack to using xRe
26e10 61 64 2f 78 57 72 69 74 65 20 65 78 63 6c 75 73  ad/xWrite exclus
26e20 69 76 65 6c 79 0a 20 20 20 20 2a 2a 20 69 6e 20  ively.    ** in 
26e30 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20  this case.  */. 
26e40 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65     pFd->mmapSize
26e50 4d 61 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  Max = 0;.  }.  p
26e60 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d  Fd->pMapRegion =
26e70 20 28 76 6f 69 64 20 2a 29 70 4e 65 77 3b 0a 20   (void *)pNew;. 
26e80 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d   pFd->mmapSize =
26e90 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63   pFd->mmapSizeAc
26ea0 74 75 61 6c 20 3d 20 6e 4e 65 77 3b 0a 7d 0a 0a  tual = nNew;.}..
26eb0 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20 6d 61 70  /*.** Memory map
26ec0 20 6f 72 20 72 65 6d 61 70 20 74 68 65 20 66 69   or remap the fi
26ed0 6c 65 20 6f 70 65 6e 65 64 20 62 79 20 66 69 6c  le opened by fil
26ee0 65 2d 64 65 73 63 72 69 70 74 6f 72 20 70 46 64  e-descriptor pFd
26ef0 20 28 69 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a   (if the file.**
26f00 20 69 73 20 61 6c 72 65 61 64 79 20 6d 61 70 70   is already mapp
26f10 65 64 2c 20 74 68 65 20 65 78 69 73 74 69 6e 67  ed, the existing
26f20 20 6d 61 70 70 69 6e 67 20 69 73 20 72 65 70 6c   mapping is repl
26f30 61 63 65 64 20 62 79 20 74 68 65 20 6e 65 77 29  aced by the new)
26f40 2e 20 4f 72 2c 20 69 66 20 0a 2a 2a 20 74 68 65  . Or, if .** the
26f50 72 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  re already exist
26f60 73 20 61 20 6d 61 70 70 69 6e 67 20 66 6f 72 20  s a mapping for 
26f70 74 68 69 73 20 66 69 6c 65 2c 20 61 6e 64 20 74  this file, and t
26f80 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 0a  here are still .
26f90 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78  ** outstanding x
26fa0 46 65 74 63 68 28 29 20 72 65 66 65 72 65 6e 63  Fetch() referenc
26fb0 65 73 20 74 6f 20 69 74 2c 20 74 68 69 73 20 66  es to it, this f
26fc0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
26fd0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72  op..**.** If par
26fe0 61 6d 65 74 65 72 20 6e 42 79 74 65 20 69 73 20  ameter nByte is 
26ff0 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2c 20 74 68  non-negative, th
27000 65 6e 20 69 74 20 69 73 20 74 68 65 20 72 65 71  en it is the req
27010 75 65 73 74 65 64 20 73 69 7a 65 20 6f 66 20 0a  uested size of .
27020 2a 2a 20 74 68 65 20 6d 61 70 70 69 6e 67 20 74  ** the mapping t
27030 6f 20 63 72 65 61 74 65 2e 20 4f 74 68 65 72 77  o create. Otherw
27040 69 73 65 2c 20 69 66 20 6e 42 79 74 65 20 69 73  ise, if nByte is
27050 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
27060 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 72 65   then the .** re
27070 71 75 65 73 74 65 64 20 73 69 7a 65 20 69 73 20  quested size is 
27080 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
27090 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 54 68  file on disk. Th
270a0 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66  e actual size of
270b0 20 74 68 65 0a 2a 2a 20 63 72 65 61 74 65 64 20   the.** created 
270c0 6d 61 70 70 69 6e 67 20 69 73 20 65 69 74 68 65  mapping is eithe
270d0 72 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  r the requested 
270e0 73 69 7a 65 20 6f 72 20 74 68 65 20 76 61 6c 75  size or the valu
270f0 65 20 63 6f 6e 66 69 67 75 72 65 64 20 0a 2a 2a  e configured .**
27100 20 75 73 69 6e 67 20 53 51 4c 49 54 45 5f 46 43   using SQLITE_FC
27110 4e 54 4c 5f 4d 4d 41 50 5f 4c 49 4d 49 54 2c 20  NTL_MMAP_LIMIT, 
27120 77 68 69 63 68 65 76 65 72 20 69 73 20 73 6d 61  whichever is sma
27130 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  ller..**.** SQLI
27140 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
27150 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  d if no error oc
27160 63 75 72 73 20 28 65 76 65 6e 20 69 66 20 74 68  curs (even if th
27170 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f 74  e mapping is not
27180 0a 2a 2a 20 72 65 63 72 65 61 74 65 64 20 61 73  .** recreated as
27190 20 61 20 72 65 73 75 6c 74 20 6f 66 20 6f 75 74   a result of out
271a0 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
271b0 63 65 73 29 20 6f 72 20 61 6e 20 53 51 4c 69 74  ces) or an SQLit
271c0 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  e error.** code 
271d0 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
271e0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 61 70  atic int unixMap
271f0 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  file(unixFile *p
27200 46 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a  Fd, i64 nByte){.
27210 20 20 69 36 34 20 6e 4d 61 70 20 3d 20 6e 42 79    i64 nMap = nBy
27220 74 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  te;.  int rc;.. 
27230 20 61 73 73 65 72 74 28 20 6e 4d 61 70 3e 3d 30   assert( nMap>=0
27240 20 7c 7c 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f   || pFd->nFetchO
27250 75 74 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ut==0 );.  if( p
27260 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 30 20  Fd->nFetchOut>0 
27270 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
27280 4f 4b 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3c  OK;..  if( nMap<
27290 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  0 ){.    struct 
272a0 73 74 61 74 20 73 74 61 74 62 75 66 3b 20 20 20  stat statbuf;   
272b0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65         /* Low-le
272c0 76 65 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61  vel file informa
272d0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  tion */.    rc =
272e0 20 6f 73 46 73 74 61 74 28 70 46 64 2d 3e 68 2c   osFstat(pFd->h,
272f0 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20 20 20   &statbuf);.    
27300 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
27310 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
27320 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  n SQLITE_IOERR_F
27330 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  STAT;.    }.    
27340 6e 4d 61 70 20 3d 20 73 74 61 74 62 75 66 2e 73  nMap = statbuf.s
27350 74 5f 73 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66  t_size;.  }.  if
27360 28 20 6e 4d 61 70 3e 70 46 64 2d 3e 6d 6d 61 70  ( nMap>pFd->mmap
27370 53 69 7a 65 4d 61 78 20 29 7b 0a 20 20 20 20 6e  SizeMax ){.    n
27380 4d 61 70 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53  Map = pFd->mmapS
27390 69 7a 65 4d 61 78 3b 0a 20 20 7d 0a 0a 20 20 69  izeMax;.  }..  i
273a0 66 28 20 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d  f( nMap!=pFd->mm
273b0 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66  apSize ){.    if
273c0 28 20 6e 4d 61 70 3e 30 20 29 7b 0a 20 20 20 20  ( nMap>0 ){.    
273d0 20 20 75 6e 69 78 52 65 6d 61 70 66 69 6c 65 28    unixRemapfile(
273e0 70 46 64 2c 20 6e 4d 61 70 29 3b 0a 20 20 20 20  pFd, nMap);.    
273f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 6e 69  }else{.      uni
27400 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b  xUnmapfile(pFd);
27410 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
27420 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
27430 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
27440 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
27450 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  >0 */../*.** If 
27460 70 6f 73 73 69 62 6c 65 2c 20 72 65 74 75 72 6e  possible, return
27470 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
27480 6d 61 70 70 69 6e 67 20 6f 66 20 66 69 6c 65 20  mapping of file 
27490 66 64 20 73 74 61 72 74 69 6e 67 20 61 74 20 6f  fd starting at o
274a0 66 66 73 65 74 0a 2a 2a 20 69 4f 66 66 2e 20 54  ffset.** iOff. T
274b0 68 65 20 6d 61 70 70 69 6e 67 20 6d 75 73 74 20  he mapping must 
274c0 62 65 20 76 61 6c 69 64 20 66 6f 72 20 61 74 20  be valid for at 
274d0 6c 65 61 73 74 20 6e 41 6d 74 20 62 79 74 65 73  least nAmt bytes
274e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20  ..**.** If such 
274f0 61 20 70 6f 69 6e 74 65 72 20 63 61 6e 20 62 65  a pointer can be
27500 20 6f 62 74 61 69 6e 65 64 2c 20 73 74 6f 72 65   obtained, store
27510 20 69 74 20 69 6e 20 2a 70 70 20 61 6e 64 20 72   it in *pp and r
27520 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
27530 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f 6e 65 20 63  .** Or, if one c
27540 61 6e 6e 6f 74 20 62 75 74 20 6e 6f 20 65 72 72  annot but no err
27550 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 2a  or occurs, set *
27560 70 70 20 74 6f 20 30 20 61 6e 64 20 72 65 74 75  pp to 0 and retu
27570 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  rn SQLITE_OK..**
27580 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 61 6e 20   Finally, if an 
27590 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72  error does occur
275a0 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69  , return an SQLi
275b0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54  te error code. T
275c0 68 65 20 66 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75  he final.** valu
275d0 65 20 6f 66 20 2a 70 70 20 69 73 20 75 6e 64 65  e of *pp is unde
275e0 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61  fined in this ca
275f0 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  se..**.** If thi
27600 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
27610 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
27620 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  , the caller mus
27630 74 20 65 76 65 6e 74 75 61 6c 6c 79 20 0a 2a 2a  t eventually .**
27640 20 72 65 6c 65 61 73 65 20 74 68 65 20 72 65 66   release the ref
27650 65 72 65 6e 63 65 20 62 79 20 63 61 6c 6c 69 6e  erence by callin
27660 67 20 75 6e 69 78 55 6e 66 65 74 63 68 28 29 2e  g unixUnfetch().
27670 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
27680 6e 69 78 46 65 74 63 68 28 73 71 6c 69 74 65 33  nixFetch(sqlite3
27690 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69  _file *fd, i64 i
276a0 4f 66 66 2c 20 69 6e 74 20 6e 41 6d 74 2c 20 76  Off, int nAmt, v
276b0 6f 69 64 20 2a 2a 70 70 29 7b 0a 23 69 66 20 53  oid **pp){.#if S
276c0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
276d0 49 5a 45 3e 30 0a 20 20 75 6e 69 78 46 69 6c 65  IZE>0.  unixFile
276e0 20 2a 70 46 64 20 3d 20 28 75 6e 69 78 46 69 6c   *pFd = (unixFil
276f0 65 20 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68 65  e *)fd;   /* The
27700 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
27710 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23 65 6e  base file */.#en
27720 64 69 66 0a 20 20 2a 70 70 20 3d 20 30 3b 0a 0a  dif.  *pp = 0;..
27730 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
27740 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28  MAP_SIZE>0.  if(
27750 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61   pFd->mmapSizeMa
27760 78 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  x>0 ){.    if( p
27770 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d  Fd->pMapRegion==
27780 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  0 ){.      int r
27790 63 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65 28  c = unixMapfile(
277a0 70 46 64 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  pFd, -1);.      
277b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
277c0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
277d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 64     }.    if( pFd
277e0 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d 20 69 4f  ->mmapSize >= iO
277f0 66 66 2b 6e 41 6d 74 20 29 7b 0a 20 20 20 20 20  ff+nAmt ){.     
27800 20 2a 70 70 20 3d 20 26 28 28 75 38 20 2a 29 70   *pp = &((u8 *)p
27810 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b  Fd->pMapRegion)[
27820 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20 70 46 64  iOff];.      pFd
27830 2d 3e 6e 46 65 74 63 68 4f 75 74 2b 2b 3b 0a 20  ->nFetchOut++;. 
27840 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
27850 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27860 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  OK;.}../*.** If 
27870 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  the third argume
27880 6e 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20  nt is non-NULL, 
27890 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
278a0 6f 6e 20 72 65 6c 65 61 73 65 73 20 61 20 0a 2a  on releases a .*
278b0 2a 20 72 65 66 65 72 65 6e 63 65 20 6f 62 74 61  * reference obta
278c0 69 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69  ined by an earli
278d0 65 72 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46  er call to unixF
278e0 65 74 63 68 28 29 2e 20 54 68 65 20 73 65 63 6f  etch(). The seco
278f0 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 70  nd.** argument p
27900 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
27910 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 74  nction must be t
27920 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 63  he same as the c
27930 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
27940 61 72 67 75 6d 65 6e 74 20 74 68 61 74 20 77 61  argument that wa
27950 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  s passed to the 
27960 75 6e 69 78 46 65 74 63 68 28 29 20 69 6e 76 6f  unixFetch() invo
27970 63 61 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 4f  cation. .**.** O
27980 72 2c 20 69 66 20 74 68 65 20 74 68 69 72 64 20  r, if the third 
27990 61 72 67 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c  argument is NULL
279a0 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
279b0 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 61  tion is being ca
279c0 6c 6c 65 64 20 0a 2a 2a 20 74 6f 20 69 6e 66 6f  lled .** to info
279d0 72 6d 20 74 68 65 20 56 46 53 20 6c 61 79 65 72  rm the VFS layer
279e0 20 74 68 61 74 2c 20 61 63 63 6f 72 64 69 6e 67   that, according
279f0 20 74 6f 20 50 4f 53 49 58 2c 20 61 6e 79 20 65   to POSIX, any e
27a00 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20  xisting mapping 
27a10 0a 2a 2a 20 6d 61 79 20 6e 6f 77 20 62 65 20 69  .** may now be i
27a20 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c  nvalid and shoul
27a30 64 20 62 65 20 75 6e 6d 61 70 70 65 64 2e 0a 2a  d be unmapped..*
27a40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
27a50 78 55 6e 66 65 74 63 68 28 73 71 6c 69 74 65 33  xUnfetch(sqlite3
27a60 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69  _file *fd, i64 i
27a70 4f 66 66 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 23  Off, void *p){.#
27a80 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
27a90 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78  AP_SIZE>0.  unix
27aa0 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e 69  File *pFd = (uni
27ab0 78 46 69 6c 65 20 2a 29 66 64 3b 20 20 20 2f 2a  xFile *)fd;   /*
27ac0 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
27ad0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
27ae0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
27af0 54 45 52 28 69 4f 66 66 29 3b 0a 0a 20 20 2f 2a  TER(iOff);..  /*
27b00 20 49 66 20 70 3d 3d 30 20 28 75 6e 6d 61 70 20   If p==0 (unmap 
27b10 74 68 65 20 65 6e 74 69 72 65 20 66 69 6c 65 29  the entire file)
27b20 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74   then there must
27b30 20 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69   be no outstandi
27b40 6e 67 20 0a 20 20 2a 2a 20 78 46 65 74 63 68 20  ng .  ** xFetch 
27b50 72 65 66 65 72 65 6e 63 65 73 2e 20 4f 72 2c 20  references. Or, 
27b60 69 66 20 70 21 3d 30 20 28 6d 65 61 6e 69 6e 67  if p!=0 (meaning
27b70 20 69 74 20 69 73 20 61 6e 20 78 46 65 74 63 68   it is an xFetch
27b80 20 72 65 66 65 72 65 6e 63 65 29 2c 0a 20 20 2a   reference),.  *
27b90 2a 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  * then there mus
27ba0 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  t be at least on
27bb0 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 2e 20 20  e outstanding.  
27bc0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 3d  */.  assert( (p=
27bd0 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e 46 65 74 63  =0)==(pFd->nFetc
27be0 68 4f 75 74 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f  hOut==0) );..  /
27bf0 2a 20 49 66 20 70 21 3d 30 2c 20 69 74 20 6d 75  * If p!=0, it mu
27c00 73 74 20 6d 61 74 63 68 20 74 68 65 20 69 4f 66  st match the iOf
27c10 66 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 61 73  f value. */.  as
27c20 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 3d  sert( p==0 || p=
27c30 3d 26 28 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d  =&((u8 *)pFd->pM
27c40 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 20  apRegion)[iOff] 
27c50 29 3b 0a 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  );..  if( p ){. 
27c60 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75     pFd->nFetchOu
27c70 74 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t--;.  }else{.  
27c80 20 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28    unixUnmapfile(
27c90 70 46 64 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  pFd);.  }..  ass
27ca0 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68  ert( pFd->nFetch
27cb0 4f 75 74 3e 3d 30 20 29 3b 0a 23 65 6c 73 65 0a  Out>=0 );.#else.
27cc0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
27cd0 45 52 28 66 64 29 3b 0a 20 20 55 4e 55 53 45 44  ER(fd);.  UNUSED
27ce0 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20  _PARAMETER(p);. 
27cf0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
27d00 52 28 69 4f 66 66 29 3b 0a 23 65 6e 64 69 66 0a  R(iOff);.#endif.
27d10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27d20 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72  OK;.}../*.** Her
27d30 65 20 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65  e ends the imple
27d40 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c  mentation of all
27d50 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65   sqlite3_file me
27d60 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  thods..**.******
27d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27d80 20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c   End sqlite3_fil
27d90 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  e Methods ******
27da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
27dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27e00 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
27e10 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63   This division c
27e20 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69  ontains definiti
27e30 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69  ons of sqlite3_i
27e40 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
27e50 73 20 74 68 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d  s that.** implem
27e60 65 6e 74 20 76 61 72 69 6f 75 73 20 66 69 6c 65  ent various file
27e70 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67   locking strateg
27e80 69 65 73 2e 20 20 49 74 20 61 6c 73 6f 20 63 6f  ies.  It also co
27e90 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f  ntains definitio
27ea0 6e 73 0a 2a 2a 20 6f 66 20 22 66 69 6e 64 65 72  ns.** of "finder
27eb0 22 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 41 20  " functions.  A 
27ec0 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20  finder-function 
27ed0 69 73 20 75 73 65 64 20 74 6f 20 6c 6f 63 61 74  is used to locat
27ee0 65 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  e the appropriat
27ef0 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f  e.** sqlite3_io_
27f00 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 66  methods object f
27f10 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  or a particular 
27f20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
27f30 54 68 65 20 70 41 70 70 44 61 74 61 0a 2a 2a 20  The pAppData.** 
27f40 66 69 65 6c 64 20 6f 66 20 74 68 65 20 73 71 6c  field of the sql
27f50 69 74 65 33 5f 76 66 73 20 56 46 53 20 6f 62 6a  ite3_vfs VFS obj
27f60 65 63 74 73 20 61 72 65 20 69 6e 69 74 69 61 6c  ects are initial
27f70 69 7a 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74  ized to be point
27f80 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 63 6f  ers to.** the co
27f90 72 72 65 63 74 20 66 69 6e 64 65 72 2d 66 75 6e  rrect finder-fun
27fa0 63 74 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 56  ction for that V
27fb0 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 66  FS..**.** Most f
27fc0 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20  inder functions 
27fd0 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
27fe0 20 74 6f 20 61 20 66 69 78 65 64 20 73 71 6c 69   to a fixed sqli
27ff0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a  te3_io_methods.*
28000 2a 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 20 6f  * object.  The o
28010 6e 6c 79 20 69 6e 74 65 72 65 73 74 69 6e 67 20  nly interesting 
28020 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20  finder-function 
28030 69 73 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  is autolockIoFin
28040 64 65 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6c 6f  der, which.** lo
28050 6f 6b 73 20 61 74 20 74 68 65 20 66 69 6c 65 73  oks at the files
28060 79 73 74 65 6d 20 74 79 70 65 20 61 6e 64 20 74  ystem type and t
28070 72 69 65 73 20 74 6f 20 67 75 65 73 73 20 74 68  ries to guess th
28080 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 0a 2a  e best locking.*
28090 2a 20 73 74 72 61 74 65 67 79 20 66 72 6f 6d 20  * strategy from 
280a0 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  that..**.** For 
280b0 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20  finder-function 
280c0 46 2c 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 61  F, two objects a
280d0 72 65 20 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a  re created:.**.*
280e0 2a 20 20 20 20 28 31 29 20 54 68 65 20 72 65 61  *    (1) The rea
280f0 6c 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  l finder-functio
28100 6e 20 6e 61 6d 65 64 20 22 46 49 6d 70 74 28 29  n named "FImpt()
28110 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  "..**.**    (2) 
28120 41 20 63 6f 6e 73 74 61 6e 74 20 70 6f 69 6e 74  A constant point
28130 65 72 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  er to this funct
28140 69 6f 6e 20 6e 61 6d 65 64 20 6a 75 73 74 20 22  ion named just "
28150 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20 70  F"..**.**.** A p
28160 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 46 20  ointer to the F 
28170 70 6f 69 6e 74 65 72 20 69 73 20 75 73 65 64 20  pointer is used 
28180 61 73 20 74 68 65 20 70 41 70 70 44 61 74 61 20  as the pAppData 
28190 76 61 6c 75 65 20 66 6f 72 20 56 46 53 0a 2a 2a  value for VFS.**
281a0 20 6f 62 6a 65 63 74 73 2e 20 20 57 65 20 68 61   objects.  We ha
281b0 76 65 20 74 6f 20 64 6f 20 74 68 69 73 20 69 6e  ve to do this in
281c0 73 74 65 61 64 20 6f 66 20 6c 65 74 74 69 6e 67  stead of letting
281d0 20 70 41 70 70 44 61 74 61 20 70 6f 69 6e 74 0a   pAppData point.
281e0 2a 2a 20 64 69 72 65 63 74 6c 79 20 61 74 20 74  ** directly at t
281f0 68 65 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  he finder-functi
28200 6f 6e 20 73 69 6e 63 65 20 43 39 30 20 72 75 6c  on since C90 rul
28210 65 73 20 70 72 65 76 65 6e 74 20 61 20 76 6f 69  es prevent a voi
28220 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65 20 63 61  d*.** from be ca
28230 73 74 20 69 6e 74 6f 20 61 20 66 75 6e 63 74 69  st into a functi
28240 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a  on pointer..**.*
28250 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74 61 6e  *.** Each instan
28260 63 65 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f  ce of this macro
28270 20 67 65 6e 65 72 61 74 65 73 20 74 77 6f 20 6f   generates two o
28280 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  bjects:.**.**   
28290 2a 20 20 41 20 63 6f 6e 73 74 61 6e 74 20 73 71  *  A constant sq
282a0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
282b0 20 6f 62 6a 65 63 74 20 63 61 6c 6c 20 4d 45 54   object call MET
282c0 48 4f 44 20 74 68 61 74 20 68 61 73 20 6c 6f 63  HOD that has loc
282d0 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 6d 65 74  king.**      met
282e0 68 6f 64 73 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b  hods CLOSE, LOCK
282f0 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c  , UNLOCK, CKRESL
28300 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  OCK..**.**   *  
28310 41 6e 20 49 2f 4f 20 6d 65 74 68 6f 64 20 66 69  An I/O method fi
28320 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 63 61  nder function ca
28330 6c 6c 65 64 20 46 49 4e 44 45 52 20 74 68 61 74  lled FINDER that
28340 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
28350 65 72 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68  er.**      to th
28360 65 20 4d 45 54 48 4f 44 20 6f 62 6a 65 63 74 20  e METHOD object 
28370 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
28380 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65 66 69  bullet..*/.#defi
28390 6e 65 20 49 4f 4d 45 54 48 4f 44 53 28 46 49 4e  ne IOMETHODS(FIN
283a0 44 45 52 2c 4d 45 54 48 4f 44 2c 56 45 52 53 49  DER,METHOD,VERSI
283b0 4f 4e 2c 43 4c 4f 53 45 2c 4c 4f 43 4b 2c 55 4e  ON,CLOSE,LOCK,UN
283c0 4c 4f 43 4b 2c 43 4b 4c 4f 43 4b 2c 53 48 4d 4d  LOCK,CKLOCK,SHMM
283d0 41 50 29 20 20 20 20 20 5c 0a 73 74 61 74 69 63  AP)     \.static
283e0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
283f0 6f 5f 6d 65 74 68 6f 64 73 20 4d 45 54 48 4f 44  o_methods METHOD
28400 20 3d 20 7b 20 20 20 20 20 20 20 20 20 20 20 20   = {            
28410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28420 20 20 20 20 20 20 20 5c 0a 20 20 20 56 45 52 53         \.   VERS
28430 49 4f 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ION,            
28440 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
28450 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ion */          
28460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28470 20 20 20 20 20 20 5c 0a 20 20 20 43 4c 4f 53 45        \.   CLOSE
28480 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28490 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
284a0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
284b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284c0 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 52 65       \.   unixRe
284d0 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ad,             
284e0 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a        /* xRead *
284f0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
28500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28510 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 57 72 69      \.   unixWri
28520 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
28530 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a       /* xWrite *
28540 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
28550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28560 20 20 20 5c 0a 20 20 20 75 6e 69 78 54 72 75 6e     \.   unixTrun
28570 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  cate,           
28580 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65      /* xTruncate
28590 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
285a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285b0 20 20 5c 0a 20 20 20 75 6e 69 78 53 79 6e 63 2c    \.   unixSync,
285c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285d0 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 20 20     /* xSync */  
285e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28600 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 53 69   \.   unixFileSi
28610 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
28620 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a    /* xFileSize *
28630 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
28640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28650 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20 20 20 20 20  \.   LOCK,      
28660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28670 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20 20 20   /* xLock */    
28680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
286a0 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20 20 20 20 20  .   UNLOCK,     
286b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286c0 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20  /* xUnlock */   
286d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
286f0 20 20 20 43 4b 4c 4f 43 4b 2c 20 20 20 20 20 20     CKLOCK,      
28700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28710 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
28720 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20  Lock */         
28730 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
28740 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f    unixFileContro
28750 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  l,            /*
28760 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f   xFileControl */
28770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28780 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
28790 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 2c   unixSectorSize,
287a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
287b0 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 20 20  xSectorSize */  
287c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287d0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
287e0 75 6e 69 78 44 65 76 69 63 65 43 68 61 72 61 63  unixDeviceCharac
287f0 74 65 72 69 73 74 69 63 73 2c 20 20 2f 2a 20 78  teristics,  /* x
28800 44 65 76 69 63 65 43 61 70 61 62 69 6c 69 74 69  DeviceCapabiliti
28810 65 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  es */           
28820 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 53            \.   S
28830 48 4d 4d 41 50 2c 20 20 20 20 20 20 20 20 20 20  HMMAP,          
28840 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
28850 68 6d 4d 61 70 20 2a 2f 20 20 20 20 20 20 20 20  hmMap */        
28860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28870 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
28880 69 78 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20  ixShmLock,      
28890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
288a0 6d 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20  mLock */        
288b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288c0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
288d0 78 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20  xShmBarrier,    
288e0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
288f0 42 61 72 72 69 65 72 20 2a 2f 20 20 20 20 20 20  Barrier */      
28900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28910 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
28920 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20 20 20  ShmUnmap,       
28930 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55          /* xShmU
28940 6e 6d 61 70 20 2a 2f 20 20 20 20 20 20 20 20 20  nmap */         
28950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28960 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46        \.   unixF
28970 65 74 63 68 2c 20 20 20 20 20 20 20 20 20 20 20  etch,           
28980 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68         /* xFetch
28990 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
289a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289b0 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 55 6e       \.   unixUn
289c0 66 65 74 63 68 2c 20 20 20 20 20 20 20 20 20 20  fetch,          
289d0 20 20 20 20 20 20 2f 2a 20 78 55 6e 66 65 74 63        /* xUnfetc
289e0 68 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  h */            
289f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a00 20 20 20 20 5c 0a 7d 3b 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 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a50 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73     \.static cons
28a60 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
28a70 68 6f 64 73 20 2a 46 49 4e 44 45 52 23 23 49 6d  hods *FINDER##Im
28a80 70 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  pl(const char *z
28a90 2c 20 75 6e 69 78 46 69 6c 65 20 2a 70 29 7b 20  , unixFile *p){ 
28aa0 20 20 5c 0a 20 20 55 4e 55 53 45 44 5f 50 41 52    \.  UNUSED_PAR
28ab0 41 4d 45 54 45 52 28 7a 29 3b 20 55 4e 55 53 45  AMETER(z); UNUSE
28ac0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 20  D_PARAMETER(p); 
28ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28af0 20 5c 0a 20 20 72 65 74 75 72 6e 20 26 4d 45 54   \.  return &MET
28b00 48 4f 44 3b 20 20 20 20 20 20 20 20 20 20 20 20  HOD;            
28b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b40 5c 0a 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  \.}             
28b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
28b90 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
28ba0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
28bb0 20 2a 28 2a 63 6f 6e 73 74 20 46 49 4e 44 45 52   *(*const FINDER
28bc0 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e  )(const char*,un
28bd0 69 78 46 69 6c 65 20 2a 70 29 20 20 20 20 5c 0a  ixFile *p)    \.
28be0 20 20 20 20 3d 20 46 49 4e 44 45 52 23 23 49 6d      = FINDER##Im
28bf0 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20  pl;../*.** Here 
28c00 61 72 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73  are all of the s
28c10 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
28c20 73 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 65 61  s objects for ea
28c30 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63  ch of the.** loc
28c40 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e  king strategies.
28c50 20 20 46 75 6e 63 74 69 6f 6e 73 20 74 68 61 74    Functions that
28c60 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 73   return pointers
28c70 20 74 6f 20 74 68 65 73 65 20 6d 65 74 68 6f 64   to these method
28c80 73 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20 63 72  s.** are also cr
28c90 65 61 74 65 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48  eated..*/.IOMETH
28ca0 4f 44 53 28 0a 20 20 70 6f 73 69 78 49 6f 46 69  ODS(.  posixIoFi
28cb0 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
28cc0 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
28cd0 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f  ion name */.  po
28ce0 73 69 78 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  sixIoMethods,   
28cf0 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
28d00 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
28d10 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 33  ject name */.  3
28d20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28d30 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
28d40 65 64 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6d 6d  ed memory and mm
28d50 61 70 20 61 72 65 20 65 6e 61 62 6c 65 64 20 2a  ap are enabled *
28d60 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20  /.  unixClose,  
28d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28d80 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
28d90 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20  /.  unixLock,   
28da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28db0 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
28dc0 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20  .  unixUnlock,  
28dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28de0 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
28df0 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73  /.  unixCheckRes
28e00 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 2f 2a  ervedLock,    /*
28e10 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
28e20 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
28e30 75 6e 69 78 53 68 6d 4d 61 70 20 20 20 20 20 20  unixShmMap      
28e40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
28e50 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  mMap method */.)
28e60 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 6f  .IOMETHODS(.  no
28e70 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20  lockIoFinder,   
28e80 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
28e90 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
28ea0 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  */.  nolockIoMet
28eb0 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 2f  hods,          /
28ec0 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
28ed0 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
28ee0 20 2a 2f 0a 20 20 33 2c 20 20 20 20 20 20 20 20   */.  3,        
28ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f00 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
28f10 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
28f20 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20    nolockClose,  
28f30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
28f40 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
28f50 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20    nolockLock,   
28f60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
28f70 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
28f80 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20   nolockUnlock,  
28f90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
28fa0 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
28fb0 20 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73    nolockCheckRes
28fc0 65 72 76 65 64 4c 6f 63 6b 2c 20 20 2f 2a 20 78  ervedLock,  /* x
28fd0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
28fe0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20  k method */.  0 
28ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29000 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
29010 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49  ap method */.).I
29020 4f 4d 45 54 48 4f 44 53 28 0a 20 20 64 6f 74 6c  OMETHODS(.  dotl
29030 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  ockIoFinder,    
29040 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
29050 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
29060 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68  .  dotlockIoMeth
29070 6f 64 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ods,         /* 
29080 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
29090 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
290a0 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
290b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
290c0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
290d0 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
290e0 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20  dotlockClose,   
290f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
29100 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
29110 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20  dotlockLock,    
29120 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
29130 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64  ck method */.  d
29140 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20  otlockUnlock,   
29150 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
29160 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
29170 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65  dotlockCheckRese
29180 72 76 65 64 4c 6f 63 6b 2c 20 2f 2a 20 78 43 68  rvedLock, /* xCh
29190 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
291a0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20  method */.  0   
291b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291c0 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70        /* xShmMap
291d0 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69   method */.)..#i
291e0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
291f0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f  LOCKING_STYLE.IO
29200 4d 45 54 48 4f 44 53 28 0a 20 20 66 6c 6f 63 6b  METHODS(.  flock
29210 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
29220 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
29230 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
29240 20 20 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73    flockIoMethods
29250 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  ,           /* s
29260 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
29270 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
29280 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
29290 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
292a0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
292b0 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 66   disabled */.  f
292c0 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20  lockClose,      
292d0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
292e0 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66  se method */.  f
292f0 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20  lockLock,       
29300 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
29310 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c  k method */.  fl
29320 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  ockUnlock,      
29330 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
29340 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66  ck method */.  f
29350 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
29360 64 4c 6f 63 6b 2c 20 20 20 2f 2a 20 78 43 68 65  dLock,   /* xChe
29370 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
29380 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20  ethod */.  0    
29390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
293a0 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
293b0 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64  method */.).#end
293c0 69 66 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  if..#if OS_VXWOR
293d0 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  KS.IOMETHODS(.  
293e0 73 65 6d 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  semIoFinder,    
293f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
29400 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
29410 65 20 2a 2f 0a 20 20 73 65 6d 49 6f 4d 65 74 68  e */.  semIoMeth
29420 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ods,            
29430 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
29440 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
29450 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
29460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29470 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
29480 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
29490 2f 0a 20 20 73 65 6d 58 43 6c 6f 73 65 2c 20 20  /.  semXClose,  
294a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
294b0 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
294c0 2f 0a 20 20 73 65 6d 58 4c 6f 63 6b 2c 20 20 20  /.  semXLock,   
294d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
294e0 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
294f0 0a 20 20 73 65 6d 58 55 6e 6c 6f 63 6b 2c 20 20  .  semXUnlock,  
29500 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29510 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
29520 2f 0a 20 20 73 65 6d 58 43 68 65 63 6b 52 65 73  /.  semXCheckRes
29530 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 2f 2a  ervedLock,    /*
29540 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
29550 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
29560 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
29570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
29580 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  mMap method */.)
29590 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
295a0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
295b0 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
295c0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49  _LOCKING_STYLE.I
295d0 4f 4d 45 54 48 4f 44 53 28 0a 20 20 61 66 70 49  OMETHODS(.  afpI
295e0 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
295f0 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
29600 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
29610 0a 20 20 61 66 70 49 6f 4d 65 74 68 6f 64 73 2c  .  afpIoMethods,
29620 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29630 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
29640 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
29650 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
29660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29670 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
29680 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
29690 61 66 70 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  afpClose,       
296a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
296b0 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
296c0 61 66 70 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  afpLock,        
296d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
296e0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61  ck method */.  a
296f0 66 70 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  fpUnlock,       
29700 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
29710 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
29720 61 66 70 43 68 65 63 6b 52 65 73 65 72 76 65 64  afpCheckReserved
29730 4c 6f 63 6b 2c 20 20 20 20 20 2f 2a 20 78 43 68  Lock,     /* xCh
29740 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
29750 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20  method */.  0   
29760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29770 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70        /* xShmMap
29780 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e   method */.).#en
29790 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  dif../*.** The p
297a0 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  roxy locking met
297b0 68 6f 64 20 69 73 20 61 20 22 73 75 70 65 72 2d  hod is a "super-
297c0 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 65 20 73  method" in the s
297d0 65 6e 73 65 20 74 68 61 74 20 69 74 0a 2a 2a 20  ense that it.** 
297e0 6f 70 65 6e 73 20 73 65 63 6f 6e 64 61 72 79 20  opens secondary 
297f0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
29800 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 61   for the conch a
29810 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 6e  nd lock files an
29820 64 0a 2a 2a 20 69 74 20 75 73 65 73 20 70 72 6f  d.** it uses pro
29830 78 79 2c 20 64 6f 74 2d 66 69 6c 65 2c 20 41 46  xy, dot-file, AF
29840 50 2c 20 61 6e 64 20 66 6c 6f 63 6b 28 29 20 6c  P, and flock() l
29850 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f  ocking methods o
29860 6e 20 74 68 6f 73 65 0a 2a 2a 20 73 65 63 6f 6e  n those.** secon
29870 64 61 72 79 20 66 69 6c 65 73 2e 20 20 46 6f 72  dary files.  For
29880 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68   this reason, th
29890 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20  e division that 
298a0 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20 70 72  implements.** pr
298b0 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c  oxy locking is l
298c0 6f 63 61 74 65 64 20 6d 75 63 68 20 66 75 72 74  ocated much furt
298d0 68 65 72 20 64 6f 77 6e 20 69 6e 20 74 68 65 20  her down in the 
298e0 66 69 6c 65 2e 20 20 42 75 74 20 77 65 20 6e 65  file.  But we ne
298f0 65 64 0a 2a 2a 20 74 6f 20 67 6f 20 61 68 65 61  ed.** to go ahea
29900 64 20 61 6e 64 20 64 65 66 69 6e 65 20 74 68 65  d and define the
29910 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
29920 6f 64 73 20 61 6e 64 20 66 69 6e 64 65 72 20 66  ods and finder f
29930 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 70  unction.** for p
29940 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 68 65 72  roxy locking her
29950 65 2e 20 20 53 6f 20 77 65 20 66 6f 72 77 61 72  e.  So we forwar
29960 64 20 64 65 63 6c 61 72 65 20 74 68 65 20 49 2f  d declare the I/
29970 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 23 69  O methods..*/.#i
29980 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
29990 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
299a0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
299b0 59 4c 45 0a 73 74 61 74 69 63 20 69 6e 74 20 70  YLE.static int p
299c0 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69 74 65  roxyClose(sqlite
299d0 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63  3_file*);.static
299e0 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63 6b 28 73   int proxyLock(s
299f0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e  qlite3_file*, in
29a00 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70  t);.static int p
29a10 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  roxyUnlock(sqlit
29a20 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a  e3_file*, int);.
29a30 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
29a40 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
29a50 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  k(sqlite3_file*,
29a60 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48 4f 44   int*);.IOMETHOD
29a70 53 28 0a 20 20 70 72 6f 78 79 49 6f 46 69 6e 64  S(.  proxyIoFind
29a80 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  er,            /
29a90 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
29aa0 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 72 6f 78  n name */.  prox
29ab0 79 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  yIoMethods,     
29ac0 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
29ad0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
29ae0 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20  ct name */.  1, 
29af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b00 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
29b10 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62   memory is disab
29b20 6c 65 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 6c  led */.  proxyCl
29b30 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
29b40 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
29b50 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f  hod */.  proxyLo
29b60 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
29b70 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
29b80 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 55 6e 6c  od */.  proxyUnl
29b90 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
29ba0 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
29bb0 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 68  hod */.  proxyCh
29bc0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
29bd0 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
29be0 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
29bf0 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20  */.  0          
29c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29c10 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64  * xShmMap method
29c20 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a   */.).#endif../*
29c30 20 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e 20 4f 53   nfs lockd on OS
29c40 58 20 31 30 2e 33 2b 20 64 6f 65 73 6e 27 74 20  X 10.3+ doesn't 
29c50 63 6c 65 61 72 20 77 72 69 74 65 20 6c 6f 63 6b  clear write lock
29c60 73 20 77 68 65 6e 20 61 20 72 65 61 64 20 6c 6f  s when a read lo
29c70 63 6b 20 69 73 20 73 65 74 20 2a 2f 0a 23 69 66  ck is set */.#if
29c80 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
29c90 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
29ca0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
29cb0 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  LE.IOMETHODS(.  
29cc0 6e 66 73 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  nfsIoFinder,    
29cd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
29ce0 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
29cf0 6d 65 20 2a 2f 0a 20 20 6e 66 73 49 6f 4d 65 74  me */.  nfsIoMet
29d00 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20  hods,           
29d10 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
29d20 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
29d30 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
29d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d50 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
29d60 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
29d70 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65  d */.  unixClose
29d80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29d90 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
29da0 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b  od */.  unixLock
29db0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29dc0 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
29dd0 6f 64 20 2a 2f 0a 20 20 6e 66 73 55 6e 6c 6f 63  od */.  nfsUnloc
29de0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
29df0 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
29e00 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68  thod */.  unixCh
29e10 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
29e20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65       /* xCheckRe
29e30 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
29e40 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20  d */.  0        
29e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e60 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74    /* xShmMap met
29e70 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
29e80 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
29e90 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
29ea0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
29eb0 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68  _STYLE./* .** Th
29ec0 69 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63  is "finder" func
29ed0 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
29ee0 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62   determine the b
29ef0 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  est locking stra
29f00 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65  tegy .** for the
29f10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 22   database file "
29f20 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20 74  filePath".  It t
29f30 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  hen returns the 
29f40 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
29f50 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61  ds.** object tha
29f60 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61  t implements tha
29f70 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a  t strategy..**.*
29f80 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20 4d 61  * This is for Ma
29f90 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74  cOSX only..*/.st
29fa0 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
29fb0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61  e3_io_methods *a
29fc0 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49  utolockIoFinderI
29fd0 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  mpl(.  const cha
29fe0 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20 20  r *filePath,    
29ff0 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* name of the d
2a000 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2a010 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77    unixFile *pNew
2a020 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 70             /* op
2a030 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20 66  en file object f
2a040 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
2a050 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 61  file */.){.  sta
2a060 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
2a070 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20 20 63   Mapping {.    c
2a080 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
2a090 73 79 73 74 65 6d 3b 20 20 20 20 20 20 20 20 20  system;         
2a0a0 20 20 20 20 20 2f 2a 20 46 69 6c 65 73 79 73 74       /* Filesyst
2a0b0 65 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a 2f 0a  em type name */.
2a0c0 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65      const sqlite
2a0d0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d  3_io_methods *pM
2a0e0 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41 70 70  ethods;   /* App
2a0f0 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67  ropriate locking
2a100 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d 20 61   method */.  } a
2a110 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20  Map[] = {.    { 
2a120 22 68 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78  "hfs",    &posix
2a130 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20  IoMethods },.   
2a140 20 7b 20 22 75 66 73 22 2c 20 20 20 20 26 70 6f   { "ufs",    &po
2a150 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a  sixIoMethods },.
2a160 20 20 20 20 7b 20 22 61 66 70 66 73 22 2c 20 20      { "afpfs",  
2a170 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  &afpIoMethods },
2a180 0a 20 20 20 20 7b 20 22 73 6d 62 66 73 22 2c 20  .    { "smbfs", 
2a190 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d   &afpIoMethods }
2a1a0 2c 0a 20 20 20 20 7b 20 22 77 65 62 64 61 76 22  ,.    { "webdav"
2a1b0 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  , &nolockIoMetho
2a1c0 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c 20 30  ds },.    { 0, 0
2a1d0 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b   }.  };.  int i;
2a1e0 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73  .  struct statfs
2a1f0 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63   fsInfo;.  struc
2a200 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f  t flock lockInfo
2a210 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61  ;..  if( !filePa
2a220 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  th ){.    /* If 
2a230 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74  filePath==NULL t
2a240 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65  hat means we are
2a250 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
2a260 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20  transient file. 
2a270 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20     ** that does 
2a280 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c  not need to be l
2a290 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65  ocked. */.    re
2a2a0 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65  turn &nolockIoMe
2a2b0 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69 66 28  thods;.  }.  if(
2a2c0 20 73 74 61 74 66 73 28 66 69 6c 65 50 61 74 68   statfs(filePath
2a2d0 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31  , &fsInfo) != -1
2a2e0 20 29 7b 0a 20 20 20 20 69 66 28 20 66 73 49 6e   ){.    if( fsIn
2a2f0 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d 4e 54  fo.f_flags & MNT
2a300 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20  _RDONLY ){.     
2a310 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49   return &nolockI
2a320 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a  oMethods;.    }.
2a330 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 61      for(i=0; aMa
2a340 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d  p[i].zFilesystem
2a350 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
2a360 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e  ( strcmp(fsInfo.
2a370 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 61 4d  f_fstypename, aM
2a380 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65  ap[i].zFilesyste
2a390 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  m)==0 ){.       
2a3a0 20 72 65 74 75 72 6e 20 61 4d 61 70 5b 69 5d 2e   return aMap[i].
2a3b0 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 20 20  pMethods;.      
2a3c0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
2a3d0 2a 20 44 65 66 61 75 6c 74 20 63 61 73 65 2e 20  * Default case. 
2a3e0 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67 73 74  Handles, amongst
2a3f0 20 6f 74 68 65 72 73 2c 20 22 6e 66 73 22 2e 0a   others, "nfs"..
2a400 20 20 2a 2a 20 54 65 73 74 20 62 79 74 65 2d 72    ** Test byte-r
2a410 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20  ange lock using 
2a420 66 63 6e 74 6c 28 29 2e 20 49 66 20 74 68 65 20  fcntl(). If the 
2a430 63 61 6c 6c 20 73 75 63 63 65 65 64 73 2c 20 0a  call succeeds, .
2a440 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74    ** assume that
2a450 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
2a460 20 73 75 70 70 6f 72 74 73 20 50 4f 53 49 58 20   supports POSIX 
2a470 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20 20  style locks. .  
2a480 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  */.  lockInfo.l_
2a490 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49  len = 1;.  lockI
2a4a0 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b  nfo.l_start = 0;
2a4b0 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68  .  lockInfo.l_wh
2a4c0 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
2a4d0 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79  .  lockInfo.l_ty
2a4e0 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20  pe = F_RDLCK;.  
2a4f0 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77  if( osFcntl(pNew
2a500 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c  ->h, F_GETLK, &l
2a510 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b  ockInfo)!=-1 ) {
2a520 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
2a530 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e  fsInfo.f_fstypen
2a540 61 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30 20 29  ame, "nfs")==0 )
2a550 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26  {.      return &
2a560 6e 66 73 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  nfsIoMethods;.  
2a570 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
2a580 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f   return &posixIo
2a590 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20  Methods;.    }. 
2a5a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
2a5b0 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74  rn &dotlockIoMet
2a5c0 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  hods;.  }.}.stat
2a5d0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
2a5e0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a  _io_methods .  *
2a5f0 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b  (*const autolock
2a600 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20  IoFinder)(const 
2a610 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29  char*,unixFile*)
2a620 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e   = autolockIoFin
2a630 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66  derImpl;..#endif
2a640 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   /* defined(__AP
2a650 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
2a660 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2a670 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 4f 53  STYLE */..#if OS
2a680 5f 56 58 57 4f 52 4b 53 0a 2f 2a 0a 2a 2a 20 54  _VXWORKS./*.** T
2a690 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e  his "finder" fun
2a6a0 63 74 69 6f 6e 20 66 6f 72 20 56 78 57 6f 72 6b  ction for VxWork
2a6b0 73 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  s checks to see 
2a6c0 69 66 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72  if posix advisor
2a6d0 79 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 77 6f 72  y.** locking wor
2a6e0 6b 73 2e 20 20 49 66 20 69 74 20 64 6f 65 73 2c  ks.  If it does,
2a6f0 20 74 68 65 6e 20 74 68 61 74 20 69 73 20 77 68   then that is wh
2a700 61 74 20 69 73 20 75 73 65 64 2e 20 20 49 66 20  at is used.  If 
2a710 69 74 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 77  it does not.** w
2a720 6f 72 6b 2c 20 74 68 65 6e 20 66 61 6c 6c 62 61  ork, then fallba
2a730 63 6b 20 74 6f 20 6e 61 6d 65 64 20 73 65 6d 61  ck to named sema
2a740 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a  phore locking..*
2a750 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
2a760 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2a770 73 20 2a 76 78 77 6f 72 6b 73 49 6f 46 69 6e 64  s *vxworksIoFind
2a780 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20  erImpl(.  const 
2a790 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20  char *filePath, 
2a7a0 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68     /* name of th
2a7b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2a7c0 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  */.  unixFile *p
2a7d0 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a  New           /*
2a7e0 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 6f   the open file o
2a7f0 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74  bject */.){.  st
2a800 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49  ruct flock lockI
2a810 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c  nfo;..  if( !fil
2a820 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20  ePath ){.    /* 
2a830 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c  If filePath==NUL
2a840 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20  L that means we 
2a850 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
2a860 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c   a transient fil
2a870 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f  e.    ** that do
2a880 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
2a890 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20  e locked. */.   
2a8a0 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49   return &nolockI
2a8b0 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a 20  oMethods;.  }.. 
2a8c0 20 2f 2a 20 54 65 73 74 20 69 66 20 66 63 6e 74   /* Test if fcnt
2a8d0 6c 28 29 20 69 73 20 73 75 70 70 6f 72 74 65 64  l() is supported
2a8e0 20 61 6e 64 20 75 73 65 20 50 4f 53 49 58 20 73   and use POSIX s
2a8f0 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a  tyle locks..  **
2a900 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20   Otherwise fall 
2a910 62 61 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d 65  back to the name
2a920 64 20 73 65 6d 61 70 68 6f 72 65 20 6d 65 74 68  d semaphore meth
2a930 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49  od..  */.  lockI
2a940 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20  nfo.l_len = 1;. 
2a950 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72   lockInfo.l_star
2a960 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66  t = 0;.  lockInf
2a970 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  o.l_whence = SEE
2a980 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66  K_SET;.  lockInf
2a990 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  o.l_type = F_RDL
2a9a0 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74  CK;.  if( osFcnt
2a9b0 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54  l(pNew->h, F_GET
2a9c0 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d  LK, &lockInfo)!=
2a9d0 2d 31 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72  -1 ) {.    retur
2a9e0 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64  n &posixIoMethod
2a9f0 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  s;.  }else{.    
2aa00 72 65 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65 74  return &semIoMet
2aa10 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  hods;.  }.}.stat
2aa20 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
2aa30 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a  _io_methods .  *
2aa40 28 2a 63 6f 6e 73 74 20 76 78 77 6f 72 6b 73 49  (*const vxworksI
2aa50 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63  oFinder)(const c
2aa60 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20  har*,unixFile*) 
2aa70 3d 20 76 78 77 6f 72 6b 73 49 6f 46 69 6e 64 65  = vxworksIoFinde
2aa80 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f  rImpl;..#endif /
2aa90 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a  * OS_VXWORKS */.
2aaa0 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74 72 61  ./*.** An abstra
2aab0 63 74 20 74 79 70 65 20 66 6f 72 20 61 20 70 6f  ct type for a po
2aac0 69 6e 74 65 72 20 74 6f 20 61 6e 20 49 4f 20 6d  inter to an IO m
2aad0 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e  ethod finder fun
2aae0 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64 65  ction:.*/.typede
2aaf0 66 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  f const sqlite3_
2ab00 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66 69  io_methods *(*fi
2ab10 6e 64 65 72 5f 74 79 70 65 29 28 63 6f 6e 73 74  nder_type)(const
2ab20 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a   char*,unixFile*
2ab30 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  );.../**********
2ab40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ab50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ab60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ab70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ab80 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
2ab90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
2aba0 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68  sqlite3_vfs meth
2abb0 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
2abc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2abd0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69  .**.** This divi
2abe0 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68  sion contains th
2abf0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
2ac00 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74   of methods on t
2ac10 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66  he.** sqlite3_vf
2ac20 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a  s object..*/../*
2ac30 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
2ac40 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2ac50 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  he unixFile stru
2ac60 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f  cture pointed to
2ac70 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61 74   by pId..*/.stat
2ac80 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69  ic int fillInUni
2ac90 78 46 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33  xFile(.  sqlite3
2aca0 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
2acb0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76   /* Pointer to v
2acc0 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  fs object */.  i
2acd0 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20 20 20  nt h,           
2ace0 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66         /* Open f
2acf0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
2ad00 66 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65  f file being ope
2ad10 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ned */.  sqlite3
2ad20 5f 66 69 6c 65 20 2a 70 49 64 2c 20 20 20 20 20  _file *pId,     
2ad30 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65   /* Write to the
2ad40 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74   unixFile struct
2ad50 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f  ure here */.  co
2ad60 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
2ad70 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame,  /* Name of
2ad80 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20   the file being 
2ad90 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20  opened */.  int 
2ada0 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20  ctrlFlags       
2adb0 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d      /* Zero or m
2adc0 6f 72 65 20 55 4e 49 58 46 49 4c 45 5f 2a 20 76  ore UNIXFILE_* v
2add0 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f  alues */.){.  co
2ade0 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
2adf0 65 74 68 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e 67  ethods *pLocking
2ae00 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46 69 6c  Style;.  unixFil
2ae10 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78 46  e *pNew = (unixF
2ae20 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e 74  ile *)pId;.  int
2ae30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2ae40 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77  ..  assert( pNew
2ae50 2d 3e 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20 29  ->pInode==NULL )
2ae60 3b 0a 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79 20  ;..  /* Usually 
2ae70 74 68 65 20 70 61 74 68 20 7a 46 69 6c 65 6e 61  the path zFilena
2ae80 6d 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  me should not be
2ae90 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
2aea0 6e 61 6d 65 2e 20 54 68 65 0a 20 20 2a 2a 20 65  name. The.  ** e
2aeb0 78 63 65 70 74 69 6f 6e 20 69 73 20 77 68 65 6e  xception is when
2aec0 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 70 72 6f   opening the pro
2aed0 78 79 20 22 63 6f 6e 63 68 22 20 66 69 6c 65 20  xy "conch" file 
2aee0 69 6e 20 62 75 69 6c 64 73 20 74 68 61 74 0a 20  in builds that. 
2aef0 20 2a 2a 20 69 6e 63 6c 75 64 65 20 74 68 65 20   ** include the 
2af00 73 70 65 63 69 61 6c 20 41 70 70 6c 65 20 6c 6f  special Apple lo
2af10 63 6b 69 6e 67 20 73 74 79 6c 65 73 2e 0a 20 20  cking styles..  
2af20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  */.#if defined(_
2af30 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
2af40 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2af50 4e 47 5f 53 54 59 4c 45 0a 20 20 61 73 73 65 72  NG_STYLE.  asser
2af60 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  t( zFilename==0 
2af70 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d  || zFilename[0]=
2af80 3d 27 2f 27 20 0a 20 20 20 20 7c 7c 20 70 56 66  ='/' .    || pVf
2af90 73 2d 3e 70 41 70 70 44 61 74 61 3d 3d 28 76 6f  s->pAppData==(vo
2afa0 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46  id*)&autolockIoF
2afb0 69 6e 64 65 72 20 29 3b 0a 23 65 6c 73 65 0a 20  inder );.#else. 
2afc0 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61   assert( zFilena
2afd0 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61  me==0 || zFilena
2afe0 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 23 65  me[0]=='/' );.#e
2aff0 6e 64 69 66 0a 0a 20 20 2f 2a 20 4e 6f 20 6c 6f  ndif..  /* No lo
2b000 63 6b 69 6e 67 20 6f 63 63 75 72 73 20 69 6e 20  cking occurs in 
2b010 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20  temporary files 
2b020 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69  */.  assert( zFi
2b030 6c 65 6e 61 6d 65 21 3d 30 20 7c 7c 20 28 63 74  lename!=0 || (ct
2b040 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49  rlFlags & UNIXFI
2b050 4c 45 5f 4e 4f 4c 4f 43 4b 29 21 3d 30 20 29 3b  LE_NOLOCK)!=0 );
2b060 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50  ..  OSTRACE(("OP
2b070 45 4e 20 20 20 20 25 2d 33 64 20 25 73 5c 6e 22  EN    %-3d %s\n"
2b080 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29  , h, zFilename))
2b090 3b 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b  ;.  pNew->h = h;
2b0a0 0a 20 20 70 4e 65 77 2d 3e 70 56 66 73 20 3d 20  .  pNew->pVfs = 
2b0b0 70 56 66 73 3b 0a 20 20 70 4e 65 77 2d 3e 7a 50  pVfs;.  pNew->zP
2b0c0 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b  ath = zFilename;
2b0d0 0a 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61  .  pNew->ctrlFla
2b0e0 67 73 20 3d 20 28 75 38 29 63 74 72 6c 46 6c 61  gs = (u8)ctrlFla
2b0f0 67 73 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  gs;.#if SQLITE_M
2b100 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
2b110 20 70 4e 65 77 2d 3e 6d 6d 61 70 53 69 7a 65 4d   pNew->mmapSizeM
2b120 61 78 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  ax = sqlite3Glob
2b130 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b  alConfig.szMmap;
2b140 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73 71  .#endif.  if( sq
2b150 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61  lite3_uri_boolea
2b160 6e 28 28 28 63 74 72 6c 46 6c 61 67 73 20 26 20  n(((ctrlFlags & 
2b170 55 4e 49 58 46 49 4c 45 5f 55 52 49 29 20 3f 20  UNIXFILE_URI) ? 
2b180 7a 46 69 6c 65 6e 61 6d 65 20 3a 20 30 29 2c 0a  zFilename : 0),.
2b190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b1a0 20 20 20 20 20 20 20 20 20 20 20 22 70 73 6f 77             "psow
2b1b0 22 2c 20 53 51 4c 49 54 45 5f 50 4f 57 45 52 53  ", SQLITE_POWERS
2b1c0 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29 20 29  AFE_OVERWRITE) )
2b1d0 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c  {.    pNew->ctrl
2b1e0 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
2b1f0 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20 20 69 66  E_PSOW;.  }.  if
2b200 28 20 73 74 72 63 6d 70 28 70 56 66 73 2d 3e 7a  ( strcmp(pVfs->z
2b210 4e 61 6d 65 2c 22 75 6e 69 78 2d 65 78 63 6c 22  Name,"unix-excl"
2b220 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77  )==0 ){.    pNew
2b230 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55  ->ctrlFlags |= U
2b240 4e 49 58 46 49 4c 45 5f 45 58 43 4c 3b 0a 20 20  NIXFILE_EXCL;.  
2b250 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  }..#if OS_VXWORK
2b260 53 0a 20 20 70 4e 65 77 2d 3e 70 49 64 20 3d 20  S.  pNew->pId = 
2b270 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49  vxworksFindFileI
2b280 64 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  d(zFilename);.  
2b290 69 66 28 20 70 4e 65 77 2d 3e 70 49 64 3d 3d 30  if( pNew->pId==0
2b2a0 20 29 7b 0a 20 20 20 20 63 74 72 6c 46 6c 61 67   ){.    ctrlFlag
2b2b0 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 4e 4f  s |= UNIXFILE_NO
2b2c0 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53  LOCK;.    rc = S
2b2d0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
2b2e0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 63  .#endif..  if( c
2b2f0 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
2b300 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 29 7b 0a 20 20  ILE_NOLOCK ){.  
2b310 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20    pLockingStyle 
2b320 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  = &nolockIoMetho
2b330 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ds;.  }else{.   
2b340 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
2b350 20 28 2a 2a 28 66 69 6e 64 65 72 5f 74 79 70 65   (**(finder_type
2b360 2a 29 70 56 66 73 2d 3e 70 41 70 70 44 61 74 61  *)pVfs->pAppData
2b370 29 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65  )(zFilename, pNe
2b380 77 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  w);.#if SQLITE_E
2b390 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2b3a0 59 4c 45 0a 20 20 20 20 2f 2a 20 43 61 63 68 65  YLE.    /* Cache
2b3b0 20 7a 46 69 6c 65 6e 61 6d 65 20 69 6e 20 74 68   zFilename in th
2b3c0 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78  e locking contex
2b3d0 74 20 28 41 46 50 20 61 6e 64 20 64 6f 74 6c 6f  t (AFP and dotlo
2b3e0 63 6b 20 6f 76 65 72 72 69 64 65 29 20 66 6f 72  ck override) for
2b3f0 0a 20 20 20 20 2a 2a 20 70 72 6f 78 79 4c 6f 63  .    ** proxyLoc
2b400 6b 20 61 63 74 69 76 61 74 69 6f 6e 20 69 73 20  k activation is 
2b410 70 6f 73 73 69 62 6c 65 20 28 72 65 6d 6f 74 65  possible (remote
2b420 20 70 72 6f 78 79 20 69 73 20 62 61 73 65 64 20   proxy is based 
2b430 6f 6e 20 64 62 20 6e 61 6d 65 29 0a 20 20 20 20  on db name).    
2b440 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 72 65 6d  ** zFilename rem
2b450 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c  ains valid until
2b460 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 2c   file is closed,
2b470 20 74 6f 20 73 75 70 70 6f 72 74 20 2a 2f 0a 20   to support */. 
2b480 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67     pNew->locking
2b490 43 6f 6e 74 65 78 74 20 3d 20 28 76 6f 69 64 2a  Context = (void*
2b4a0 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a 23 65 6e 64  )zFilename;.#end
2b4b0 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c  if.  }..  if( pL
2b4c0 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26  ockingStyle == &
2b4d0 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 0a 23  posixIoMethods.#
2b4e0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
2b4f0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
2b500 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2b510 54 59 4c 45 0a 20 20 20 20 7c 7c 20 70 4c 6f 63  TYLE.    || pLoc
2b520 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 6e 66  kingStyle == &nf
2b530 73 49 6f 4d 65 74 68 6f 64 73 0a 23 65 6e 64 69  sIoMethods.#endi
2b540 66 0a 20 20 29 7b 0a 20 20 20 20 75 6e 69 78 45  f.  ){.    unixE
2b550 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
2b560 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49   rc = findInodeI
2b570 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d  nfo(pNew, &pNew-
2b580 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66  >pInode);.    if
2b590 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2b5a0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61  ){.      /* If a
2b5b0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  n error occurred
2b5c0 20 69 6e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66   in findInodeInf
2b5d0 6f 28 29 2c 20 63 6c 6f 73 65 20 74 68 65 20 66  o(), close the f
2b5e0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 20  ile descriptor. 
2b5f0 20 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74       ** immediat
2b600 65 6c 79 2c 20 62 65 66 6f 72 65 20 72 65 6c 65  ely, before rele
2b610 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78 2e  asing the mutex.
2b620 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29   findInodeInfo()
2b630 20 6d 61 79 20 66 61 69 6c 0a 20 20 20 20 20 20   may fail.      
2b640 2a 2a 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72  ** in two scenar
2b650 69 6f 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ios:.      **.  
2b660 20 20 20 20 2a 2a 20 20 20 28 61 29 20 41 20 63      **   (a) A c
2b670 61 6c 6c 20 74 6f 20 66 73 74 61 74 28 29 20 66  all to fstat() f
2b680 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20  ailed..      ** 
2b690 20 20 28 62 29 20 41 20 6d 61 6c 6c 6f 63 20 66    (b) A malloc f
2b6a0 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a  ailed..      **.
2b6b0 20 20 20 20 20 20 2a 2a 20 53 63 65 6e 61 72 69        ** Scenari
2b6c0 6f 20 28 62 29 20 6d 61 79 20 6f 6e 6c 79 20 6f  o (b) may only o
2b6d0 63 63 75 72 20 69 66 20 74 68 65 20 70 72 6f 63  ccur if the proc
2b6e0 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 6e  ess is holding n
2b6f0 6f 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a  o other.      **
2b700 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2b710 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61  s open on the sa
2b720 6d 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72  me file. If ther
2b730 65 20 77 65 72 65 20 6f 74 68 65 72 20 66 69 6c  e were other fil
2b740 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72  e.      ** descr
2b750 69 70 74 6f 72 73 20 6f 6e 20 74 68 69 73 20 66  iptors on this f
2b760 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 6d 61 6c  ile, then no mal
2b770 6c 6f 63 20 77 6f 75 6c 64 20 62 65 20 72 65 71  loc would be req
2b780 75 69 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a  uired by.      *
2b790 2a 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  * findInodeInfo(
2b7a0 29 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  ). If this is th
2b7b0 65 20 63 61 73 65 2c 20 69 74 20 69 73 20 71 75  e case, it is qu
2b7c0 69 74 65 20 73 61 66 65 20 74 6f 20 63 6c 6f 73  ite safe to clos
2b7d0 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c  e.      ** handl
2b7e0 65 20 68 20 2d 20 61 73 20 69 74 20 69 73 20 67  e h - as it is g
2b7f0 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 6e  uaranteed that n
2b800 6f 20 70 6f 73 69 78 20 6c 6f 63 6b 73 20 77 69  o posix locks wi
2b810 6c 6c 20 62 65 20 72 65 6c 65 61 73 65 64 0a 20  ll be released. 
2b820 20 20 20 20 20 2a 2a 20 62 79 20 64 6f 69 6e 67       ** by doing
2b830 20 73 6f 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20   so..      **.  
2b840 20 20 20 20 2a 2a 20 49 66 20 73 63 65 6e 61 72      ** If scenar
2b850 69 6f 20 28 61 29 20 63 61 75 73 65 64 20 74 68  io (a) caused th
2b860 65 20 65 72 72 6f 72 20 74 68 65 6e 20 74 68 69  e error then thi
2b870 6e 67 73 20 61 72 65 20 6e 6f 74 20 73 6f 20 73  ngs are not so s
2b880 61 66 65 2e 20 54 68 65 0a 20 20 20 20 20 20 2a  afe. The.      *
2b890 2a 20 69 6d 70 6c 69 63 69 74 20 61 73 73 75 6d  * implicit assum
2b8a0 70 74 69 6f 6e 20 68 65 72 65 20 69 73 20 74 68  ption here is th
2b8b0 61 74 20 69 66 20 66 73 74 61 74 28 29 20 66 61  at if fstat() fa
2b8c0 69 6c 73 2c 20 74 68 69 6e 67 73 20 61 72 65 20  ils, things are 
2b8d0 69 6e 0a 20 20 20 20 20 20 2a 2a 20 73 75 63 68  in.      ** such
2b8e0 20 62 61 64 20 73 68 61 70 65 20 74 68 61 74 20   bad shape that 
2b8f0 64 72 6f 70 70 69 6e 67 20 61 20 6c 6f 63 6b 20  dropping a lock 
2b900 6f 72 20 74 77 6f 20 64 6f 65 73 6e 27 74 20 6d  or two doesn't m
2b910 61 74 74 65 72 20 6d 75 63 68 2e 0a 20 20 20 20  atter much..    
2b920 20 20 2a 2f 0a 20 20 20 20 20 20 72 6f 62 75 73    */.      robus
2b930 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c  t_close(pNew, h,
2b940 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
2b950 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a    h = -1;.    }.
2b960 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
2b970 65 78 28 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53  ex();.  }..#if S
2b980 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2b990 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65  KING_STYLE && de
2b9a0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
2b9b0 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63  .  else if( pLoc
2b9c0 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 61 66  kingStyle == &af
2b9d0 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  pIoMethods ){.  
2b9e0 20 20 2f 2a 20 41 46 50 20 6c 6f 63 6b 69 6e 67    /* AFP locking
2b9f0 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70   uses the file p
2ba00 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20  ath so it needs 
2ba10 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69  to be included i
2ba20 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 61 66 70  n.    ** the afp
2ba30 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2e 0a  LockingContext..
2ba40 20 20 20 20 2a 2f 0a 20 20 20 20 61 66 70 4c 6f      */.    afpLo
2ba50 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
2ba60 74 78 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f  tx;.    pNew->lo
2ba70 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70  ckingContext = p
2ba80 43 74 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Ctx = sqlite3_ma
2ba90 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a  lloc64( sizeof(*
2baa0 70 43 74 78 29 20 29 3b 0a 20 20 20 20 69 66 28  pCtx) );.    if(
2bab0 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20   pCtx==0 ){.    
2bac0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
2bad0 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
2bae0 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20 7a 46 69        /* NB: zFi
2baf0 6c 65 6e 61 6d 65 20 65 78 69 73 74 73 20 61 6e  lename exists an
2bb00 64 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20  d remains valid 
2bb10 75 6e 74 69 6c 20 74 68 65 20 66 69 6c 65 20 69  until the file i
2bb20 73 20 63 6c 6f 73 65 64 0a 20 20 20 20 20 20 2a  s closed.      *
2bb30 2a 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 72  * according to r
2bb40 65 71 75 69 72 65 6d 65 6e 74 20 46 31 31 31 34  equirement F1114
2bb50 31 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e 6f 74  1.  So we do not
2bb60 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 0a   need to make a.
2bb70 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66        ** copy of
2bb80 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 2e 20 2a   the filename. *
2bb90 2f 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 64 62  /.      pCtx->db
2bba0 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65  Path = zFilename
2bbb0 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 72 65  ;.      pCtx->re
2bbc0 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 20 20  served = 0;.    
2bbd0 20 20 73 72 61 6e 64 6f 6d 64 65 76 28 29 3b 0a    srandomdev();.
2bbe0 20 20 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d        unixEnterM
2bbf0 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 72 63  utex();.      rc
2bc00 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f   = findInodeInfo
2bc10 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49  (pNew, &pNew->pI
2bc20 6e 6f 64 65 29 3b 0a 20 20 20 20 20 20 69 66 28  node);.      if(
2bc30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2bc40 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2bc50 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 6c 6f 63  3_free(pNew->loc
2bc60 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20  kingContext);.  
2bc70 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
2bc80 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49  se(pNew, h, __LI
2bc90 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 68  NE__);.        h
2bca0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20   = -1;.      }. 
2bcb0 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75       unixLeaveMu
2bcc0 74 65 78 28 29 3b 20 20 20 20 20 20 20 20 0a 20  tex();        . 
2bcd0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
2bce0 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63  .  else if( pLoc
2bcf0 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 64 6f  kingStyle == &do
2bd00 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29  tlockIoMethods )
2bd10 7b 0a 20 20 20 20 2f 2a 20 44 6f 74 66 69 6c 65  {.    /* Dotfile
2bd20 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68   locking uses th
2bd30 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69  e file path so i
2bd40 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e  t needs to be in
2bd50 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a  cluded in.    **
2bd60 20 74 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b   the dotlockLock
2bd70 69 6e 67 43 6f 6e 74 65 78 74 20 0a 20 20 20 20  ingContext .    
2bd80 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 6f  */.    char *zLo
2bd90 63 6b 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20  ckFile;.    int 
2bda0 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 61  nFilename;.    a
2bdb0 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65  ssert( zFilename
2bdc0 21 3d 30 20 29 3b 0a 20 20 20 20 6e 46 69 6c 65  !=0 );.    nFile
2bdd0 6e 61 6d 65 20 3d 20 28 69 6e 74 29 73 74 72 6c  name = (int)strl
2bde0 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20  en(zFilename) + 
2bdf0 36 3b 0a 20 20 20 20 7a 4c 6f 63 6b 46 69 6c 65  6;.    zLockFile
2be00 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
2be10 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 46 69 6c  e3_malloc64(nFil
2be20 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  ename);.    if( 
2be30 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a  zLockFile==0 ){.
2be40 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2be50 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
2be60 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
2be70 33 5f 73 6e 70 72 69 6e 74 66 28 6e 46 69 6c 65  3_snprintf(nFile
2be80 6e 61 6d 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c  name, zLockFile,
2be90 20 22 25 73 22 20 44 4f 54 4c 4f 43 4b 5f 53 55   "%s" DOTLOCK_SU
2bea0 46 46 49 58 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  FFIX, zFilename)
2beb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77  ;.    }.    pNew
2bec0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
2bed0 20 3d 20 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20   = zLockFile;.  
2bee0 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  }..#if OS_VXWORK
2bef0 53 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f  S.  else if( pLo
2bf00 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 73  ckingStyle == &s
2bf10 65 6d 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20  emIoMethods ){. 
2bf20 20 20 20 2f 2a 20 4e 61 6d 65 64 20 73 65 6d 61     /* Named sema
2bf30 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 75 73  phore locking us
2bf40 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68  es the file path
2bf50 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20   so it needs to 
2bf60 62 65 0a 20 20 20 20 2a 2a 20 69 6e 63 6c 75 64  be.    ** includ
2bf70 65 64 20 69 6e 20 74 68 65 20 73 65 6d 4c 6f 63  ed in the semLoc
2bf80 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 20 20 20 20  kingContext.    
2bf90 2a 2f 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72  */.    unixEnter
2bfa0 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20  Mutex();.    rc 
2bfb0 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  = findInodeInfo(
2bfc0 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e  pNew, &pNew->pIn
2bfd0 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20 28 72  ode);.    if( (r
2bfe0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26  c==SQLITE_OK) &&
2bff0 20 28 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e   (pNew->pInode->
2c000 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20 29 7b 0a 20  pSem==NULL) ){. 
2c010 20 20 20 20 20 63 68 61 72 20 2a 7a 53 65 6d 4e       char *zSemN
2c020 61 6d 65 20 3d 20 70 4e 65 77 2d 3e 70 49 6e 6f  ame = pNew->pIno
2c030 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 3b 0a 20 20  de->aSemName;.  
2c040 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20      int n;.     
2c050 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2c060 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20  f(MAX_PATHNAME, 
2c070 7a 53 65 6d 4e 61 6d 65 2c 20 22 2f 25 73 2e 73  zSemName, "/%s.s
2c080 65 6d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  em",.           
2c090 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
2c0a0 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61  ->pId->zCanonica
2c0b0 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f  lName);.      fo
2c0c0 72 28 20 6e 3d 31 3b 20 7a 53 65 6d 4e 61 6d 65  r( n=1; zSemName
2c0d0 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a 20 20 20 20 20  [n]; n++ ).     
2c0e0 20 20 20 69 66 28 20 7a 53 65 6d 4e 61 6d 65 5b     if( zSemName[
2c0f0 6e 5d 3d 3d 27 2f 27 20 29 20 7a 53 65 6d 4e 61  n]=='/' ) zSemNa
2c100 6d 65 5b 6e 5d 20 3d 20 27 5f 27 3b 0a 20 20 20  me[n] = '_';.   
2c110 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d     pNew->pInode-
2c120 3e 70 53 65 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e  >pSem = sem_open
2c130 28 7a 53 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45  (zSemName, O_CRE
2c140 41 54 2c 20 30 36 36 36 2c 20 31 29 3b 0a 20 20  AT, 0666, 1);.  
2c150 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49      if( pNew->pI
2c160 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 3d 20 53 45  node->pSem == SE
2c170 4d 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20  M_FAILED ){.    
2c180 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2c190 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 70  NOMEM;.        p
2c1a0 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65  New->pInode->aSe
2c1b0 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b  mName[0] = '\0';
2c1c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2c1d0 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
2c1e0 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  x();.  }.#endif.
2c1f0 20 20 0a 20 20 73 74 6f 72 65 4c 61 73 74 45 72    .  storeLastEr
2c200 72 6e 6f 28 70 4e 65 77 2c 20 30 29 3b 0a 23 69  rno(pNew, 0);.#i
2c210 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69  f OS_VXWORKS.  i
2c220 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2c230 20 29 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30   ){.    if( h>=0
2c240 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28   ) robust_close(
2c250 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f  pNew, h, __LINE_
2c260 5f 29 3b 0a 20 20 20 20 68 20 3d 20 2d 31 3b 0a  _);.    h = -1;.
2c270 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 46 69      osUnlink(zFi
2c280 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65  lename);.    pNe
2c290 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20  w->ctrlFlags |= 
2c2a0 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 3b  UNIXFILE_DELETE;
2c2b0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
2c2c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2c2d0 29 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20  ){.    if( h>=0 
2c2e0 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70  ) robust_close(p
2c2f0 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f  New, h, __LINE__
2c300 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2c310 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20  pNew->pMethod = 
2c320 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20  pLockingStyle;. 
2c330 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b     OpenCounter(+
2c340 31 29 3b 0a 20 20 20 20 76 65 72 69 66 79 44 62  1);.    verifyDb
2c350 46 69 6c 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a  File(pNew);.  }.
2c360 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2c370 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
2c380 20 6e 61 6d 65 20 6f 66 20 61 20 64 69 72 65 63   name of a direc
2c390 74 6f 72 79 20 69 6e 20 77 68 69 63 68 20 74 6f  tory in which to
2c3a0 20 70 75 74 20 74 65 6d 70 6f 72 61 72 79 20 66   put temporary f
2c3b0 69 6c 65 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 73  iles..** If no s
2c3c0 75 69 74 61 62 6c 65 20 74 65 6d 70 6f 72 61 72  uitable temporar
2c3d0 79 20 66 69 6c 65 20 64 69 72 65 63 74 6f 72 79  y file directory
2c3e0 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72   can be found, r
2c3f0 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  eturn NULL..*/.s
2c400 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
2c410 20 2a 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69   *unixTempFileDi
2c420 72 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69  r(void){.  stati
2c430 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a  c const char *az
2c440 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Dirs[] = {.     
2c450 30 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20  0,.     0,.     
2c460 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20  "/var/tmp",.    
2c470 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20   "/usr/tmp",.   
2c480 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22    "/tmp",.     "
2c490 2e 22 0a 20 20 7d 3b 0a 20 20 75 6e 73 69 67 6e  .".  };.  unsign
2c4a0 65 64 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  ed int i;.  stru
2c4b0 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 63  ct stat buf;.  c
2c4c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 20  onst char *zDir 
2c4d0 3d 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64  = sqlite3_temp_d
2c4e0 69 72 65 63 74 6f 72 79 3b 0a 0a 20 20 69 66 28  irectory;..  if(
2c4f0 20 21 61 7a 44 69 72 73 5b 30 5d 20 29 20 61 7a   !azDirs[0] ) az
2c500 44 69 72 73 5b 30 5d 20 3d 20 67 65 74 65 6e 76  Dirs[0] = getenv
2c510 28 22 53 51 4c 49 54 45 5f 54 4d 50 44 49 52 22  ("SQLITE_TMPDIR"
2c520 29 3b 0a 20 20 69 66 28 20 21 61 7a 44 69 72 73  );.  if( !azDirs
2c530 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b 31 5d 20  [1] ) azDirs[1] 
2c540 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52  = getenv("TMPDIR
2c550 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ");.  for(i=0; i
2c560 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f  <sizeof(azDirs)/
2c570 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d  sizeof(azDirs[0]
2c580 29 3b 20 7a 44 69 72 3d 61 7a 44 69 72 73 5b 69  ); zDir=azDirs[i
2c590 2b 2b 5d 29 7b 0a 20 20 20 20 69 66 28 20 7a 44  ++]){.    if( zD
2c5a0 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ir==0 ) continue
2c5b0 3b 0a 20 20 20 20 69 66 28 20 6f 73 53 74 61 74  ;.    if( osStat
2c5c0 28 7a 44 69 72 2c 20 26 62 75 66 29 20 29 20 63  (zDir, &buf) ) c
2c5d0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
2c5e0 20 21 53 5f 49 53 44 49 52 28 62 75 66 2e 73 74   !S_ISDIR(buf.st
2c5f0 5f 6d 6f 64 65 29 20 29 20 63 6f 6e 74 69 6e 75  _mode) ) continu
2c600 65 3b 0a 20 20 20 20 69 66 28 20 6f 73 41 63 63  e;.    if( osAcc
2c610 65 73 73 28 7a 44 69 72 2c 20 30 37 29 20 29 20  ess(zDir, 07) ) 
2c620 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 62 72  continue;.    br
2c630 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
2c640 6e 20 7a 44 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n zDir;.}../*.**
2c650 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72   Create a tempor
2c660 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e  ary file name in
2c670 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73   zBuf.  zBuf mus
2c680 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  t be allocated.*
2c690 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  * by the calling
2c6a0 20 70 72 6f 63 65 73 73 20 61 6e 64 20 6d 75 73   process and mus
2c6b0 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20  t be big enough 
2c6c0 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74  to hold at least
2c6d0 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  .** pVfs->mxPath
2c6e0 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a 2f 0a 73  name bytes..*/.s
2c6f0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65  tatic int unixGe
2c700 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42  tTempname(int nB
2c710 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
2c720 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2c730 44 69 72 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69  Dir;.  int iLimi
2c740 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 74 27  t = 0;..  /* It'
2c750 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74  s odd to simulat
2c760 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65  e an io-error he
2c770 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74  re, but really t
2c780 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a  his is just.  **
2c790 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72   using the io-er
2c7a0 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75  ror infrastructu
2c7b0 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  re to test that 
2c7c0 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74  SQLite handles t
2c7d0 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
2c7e0 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f  n failing. .  */
2c7f0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
2c800 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
2c810 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 7a 44  E_IOERR );..  zD
2c820 69 72 20 3d 20 75 6e 69 78 54 65 6d 70 46 69 6c  ir = unixTempFil
2c830 65 44 69 72 28 29 3b 0a 20 20 64 6f 7b 0a 20 20  eDir();.  do{.  
2c840 20 20 75 36 34 20 72 3b 0a 20 20 20 20 73 71 6c    u64 r;.    sql
2c850 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
2c860 73 69 7a 65 6f 66 28 72 29 2c 20 26 72 29 3b 0a  sizeof(r), &r);.
2c870 20 20 20 20 61 73 73 65 72 74 28 20 6e 42 75 66      assert( nBuf
2c880 3e 32 20 29 3b 0a 20 20 20 20 7a 42 75 66 5b 6e  >2 );.    zBuf[n
2c890 42 75 66 2d 32 5d 20 3d 20 30 3b 0a 20 20 20 20  Buf-2] = 0;.    
2c8a0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2c8b0 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22 25 73  (nBuf, zBuf, "%s
2c8c0 2f 22 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49  /"SQLITE_TEMP_FI
2c8d0 4c 45 5f 50 52 45 46 49 58 22 25 6c 6c 78 25 63  LE_PREFIX"%llx%c
2c8e0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2c8f0 20 20 20 20 20 20 20 20 7a 44 69 72 2c 20 72 2c          zDir, r,
2c900 20 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 42 75   0);.    if( zBu
2c910 66 5b 6e 42 75 66 2d 32 5d 21 3d 30 20 7c 7c 20  f[nBuf-2]!=0 || 
2c920 28 69 4c 69 6d 69 74 2b 2b 29 3e 31 30 20 29 20  (iLimit++)>10 ) 
2c930 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
2c940 52 4f 52 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6f  ROR;.  }while( o
2c950 73 41 63 63 65 73 73 28 7a 42 75 66 2c 30 29 3d  sAccess(zBuf,0)=
2c960 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  =0 );.  return S
2c970 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
2c980 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2c990 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
2c9a0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
2c9b0 5f 29 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65  _)./*.** Routine
2c9c0 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20   to transform a 
2c9d0 75 6e 69 78 46 69 6c 65 20 69 6e 74 6f 20 61 20  unixFile into a 
2c9e0 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e  proxy-locking un
2c9f0 69 78 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65  ixFile..** Imple
2ca00 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 20 74 68 65  mentation in the
2ca10 20 70 72 6f 78 79 2d 6c 6f 63 6b 20 64 69 76 69   proxy-lock divi
2ca20 73 69 6f 6e 2c 20 62 75 74 20 75 73 65 64 20 62  sion, but used b
2ca30 79 20 75 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a 20  y unixOpen().** 
2ca40 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52  if SQLITE_PREFER
2ca50 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 69  _PROXY_LOCKING i
2ca60 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  s defined..*/.st
2ca70 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72  atic int proxyTr
2ca80 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28  ansformUnixFile(
2ca90 75 6e 69 78 46 69 6c 65 2a 2c 20 63 6f 6e 73 74  unixFile*, const
2caa0 20 63 68 61 72 2a 29 3b 0a 23 65 6e 64 69 66 0a   char*);.#endif.
2cab0 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f  ./*.** Search fo
2cac0 72 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65  r an unused file
2cad0 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 61 74   descriptor that
2cae0 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74   was opened on t
2caf0 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
2cb00 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72  file (not a jour
2cb10 6e 61 6c 20 6f 72 20 6d 61 73 74 65 72 2d 6a 6f  nal or master-jo
2cb20 75 72 6e 61 6c 20 66 69 6c 65 29 20 69 64 65 6e  urnal file) iden
2cb30 74 69 66 69 65 64 20 62 79 20 70 61 74 68 6e 61  tified by pathna
2cb40 6d 65 0a 2a 2a 20 7a 50 61 74 68 20 77 69 74 68  me.** zPath with
2cb50 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58   SQLITE_OPEN_XXX
2cb60 20 66 6c 61 67 73 20 6d 61 74 63 68 69 6e 67 20   flags matching 
2cb70 74 68 6f 73 65 20 70 61 73 73 65 64 20 61 73 20  those passed as 
2cb80 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72  the second.** ar
2cb90 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
2cba0 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53  unction..**.** S
2cbb0 75 63 68 20 61 20 66 69 6c 65 20 64 65 73 63 72  uch a file descr
2cbc0 69 70 74 6f 72 20 6d 61 79 20 65 78 69 73 74 20  iptor may exist 
2cbd0 69 66 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  if a database co
2cbe0 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 63 6c 6f  nnection was clo
2cbf0 73 65 64 0a 2a 2a 20 62 75 74 20 74 68 65 20 61  sed.** but the a
2cc00 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 20 64  ssociated file d
2cc10 65 73 63 72 69 70 74 6f 72 20 63 6f 75 6c 64 20  escriptor could 
2cc20 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 62 65  not be closed be
2cc30 63 61 75 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74  cause some.** ot
2cc40 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70  her file descrip
2cc50 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  tor open on the 
2cc60 73 61 6d 65 20 66 69 6c 65 20 69 73 20 68 6f 6c  same file is hol
2cc70 64 69 6e 67 20 61 20 66 69 6c 65 2d 6c 6f 63 6b  ding a file-lock
2cc80 2e 0a 2a 2a 20 52 65 66 65 72 20 74 6f 20 63 6f  ..** Refer to co
2cc90 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 75 6e  mments in the un
2cca0 69 78 43 6c 6f 73 65 28 29 20 66 75 6e 63 74 69  ixClose() functi
2ccb0 6f 6e 20 61 6e 64 20 74 68 65 20 6c 65 6e 67 74  on and the lengt
2ccc0 68 79 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65  hy comment.** de
2ccd0 73 63 72 69 62 69 6e 67 20 22 50 6f 73 69 78 20  scribing "Posix 
2cce0 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67  Advisory Locking
2ccf0 22 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  " at the start o
2cd00 66 20 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20  f this file for 
2cd10 0a 2a 2a 20 66 75 72 74 68 65 72 20 64 65 74 61  .** further deta
2cd20 69 6c 73 2e 20 41 6c 73 6f 2c 20 74 69 63 6b 65  ils. Also, ticke
2cd30 74 20 23 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49  t #4018..**.** I
2cd40 66 20 61 20 73 75 69 74 61 62 6c 65 20 66 69 6c  f a suitable fil
2cd50 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
2cd60 66 6f 75 6e 64 2c 20 74 68 65 6e 20 69 74 20 69  found, then it i
2cd70 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e  s returned. If n
2cd80 6f 0a 2a 2a 20 73 75 63 68 20 66 69 6c 65 20 64  o.** such file d
2cd90 65 73 63 72 69 70 74 6f 72 20 69 73 20 6c 6f 63  escriptor is loc
2cda0 61 74 65 64 2c 20 2d 31 20 69 73 20 72 65 74 75  ated, -1 is retu
2cdb0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
2cdc0 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 66 69  UnixUnusedFd *fi
2cdd0 6e 64 52 65 75 73 61 62 6c 65 46 64 28 63 6f 6e  ndReusableFd(con
2cde0 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
2cdf0 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 55 6e  int flags){.  Un
2ce00 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75  ixUnusedFd *pUnu
2ce10 73 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44  sed = 0;..  /* D
2ce20 6f 20 6e 6f 74 20 73 65 61 72 63 68 20 66 6f 72  o not search for
2ce30 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20   an unused file 
2ce40 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 76 78  descriptor on vx
2ce50 77 6f 72 6b 73 2e 20 4e 6f 74 20 62 65 63 61 75  works. Not becau
2ce60 73 65 0a 20 20 2a 2a 20 76 78 77 6f 72 6b 73 20  se.  ** vxworks 
2ce70 77 6f 75 6c 64 20 6e 6f 74 20 62 65 6e 65 66 69  would not benefi
2ce80 74 20 66 72 6f 6d 20 74 68 65 20 63 68 61 6e 67  t from the chang
2ce90 65 20 28 69 74 20 6d 69 67 68 74 2c 20 77 65 27  e (it might, we'
2cea0 72 65 20 6e 6f 74 20 73 75 72 65 29 2c 0a 20 20  re not sure),.  
2ceb0 2a 2a 20 62 75 74 20 62 65 63 61 75 73 65 20 6e  ** but because n
2cec0 6f 20 77 61 79 20 74 6f 20 74 65 73 74 20 69 74  o way to test it
2ced0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 76   is currently av
2cee0 61 69 6c 61 62 6c 65 2e 20 49 74 20 69 73 20 62  ailable. It is b
2cef0 65 74 74 65 72 20 0a 20 20 2a 2a 20 6e 6f 74 20  etter .  ** not 
2cf00 74 6f 20 72 69 73 6b 20 62 72 65 61 6b 69 6e 67  to risk breaking
2cf10 20 76 78 77 6f 72 6b 73 20 73 75 70 70 6f 72 74   vxworks support
2cf20 20 66 6f 72 20 74 68 65 20 73 61 6b 65 20 6f 66   for the sake of
2cf30 20 73 75 63 68 20 61 6e 20 6f 62 73 63 75 72 65   such an obscure
2cf40 20 0a 20 20 2a 2a 20 66 65 61 74 75 72 65 2e 20   .  ** feature. 
2cf50 20 2a 2f 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f   */.#if !OS_VXWO
2cf60 52 4b 53 0a 20 20 73 74 72 75 63 74 20 73 74 61  RKS.  struct sta
2cf70 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20  t sStat;        
2cf80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2cf90 73 75 6c 74 73 20 6f 66 20 73 74 61 74 28 29 20  sults of stat() 
2cfa0 63 61 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 20  call */..  /* A 
2cfb0 73 74 61 74 28 29 20 63 61 6c 6c 20 6d 61 79 20  stat() call may 
2cfc0 66 61 69 6c 20 66 6f 72 20 76 61 72 69 6f 75 73  fail for various
2cfd0 20 72 65 61 73 6f 6e 73 2e 20 49 66 20 74 68 69   reasons. If thi
2cfe0 73 20 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73  s happens, it is
2cff0 0a 20 20 2a 2a 20 61 6c 6d 6f 73 74 20 63 65 72  .  ** almost cer
2d000 74 61 69 6e 20 74 68 61 74 20 61 6e 20 6f 70 65  tain that an ope
2d010 6e 28 29 20 63 61 6c 6c 20 6f 6e 20 74 68 65 20  n() call on the 
2d020 73 61 6d 65 20 70 61 74 68 20 77 69 6c 6c 20 61  same path will a
2d030 6c 73 6f 20 66 61 69 6c 2e 0a 20 20 2a 2a 20 46  lso fail..  ** F
2d040 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20  or this reason, 
2d050 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
2d060 72 73 20 69 6e 20 74 68 65 20 73 74 61 74 28 29  rs in the stat()
2d070 20 63 61 6c 6c 20 68 65 72 65 2c 20 69 74 20 69   call here, it i
2d080 73 0a 20 20 2a 2a 20 69 67 6e 6f 72 65 64 20 61  s.  ** ignored a
2d090 6e 64 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65  nd -1 is returne
2d0a0 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  d. The caller wi
2d0b0 6c 6c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 61  ll try to open a
2d0c0 20 6e 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20 64   new file.  ** d
2d0d0 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65  escriptor on the
2d0e0 20 73 61 6d 65 20 70 61 74 68 2c 20 66 61 69 6c   same path, fail
2d0f0 2c 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20  , and return an 
2d100 65 72 72 6f 72 20 74 6f 20 53 51 4c 69 74 65 2e  error to SQLite.
2d110 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e 20  .  **.  ** Even 
2d120 69 66 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  if a subsequent 
2d130 6f 70 65 6e 28 29 20 63 61 6c 6c 20 64 6f 65 73  open() call does
2d140 20 73 75 63 63 65 65 64 2c 20 74 68 65 20 63 6f   succeed, the co
2d150 6e 73 65 71 75 65 6e 63 65 73 20 6f 66 0a 20 20  nsequences of.  
2d160 2a 2a 20 6e 6f 74 20 73 65 61 72 63 68 69 6e 67  ** not searching
2d170 20 66 6f 72 20 61 20 72 65 75 73 61 62 6c 65 20   for a reusable 
2d180 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2d190 61 72 65 20 6e 6f 74 20 64 69 72 65 2e 20 20 2a  are not dire.  *
2d1a0 2f 0a 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61  /.  if( 0==osSta
2d1b0 74 28 7a 50 61 74 68 2c 20 26 73 53 74 61 74 29  t(zPath, &sStat)
2d1c0 20 29 7b 0a 20 20 20 20 75 6e 69 78 49 6e 6f 64   ){.    unixInod
2d1d0 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 0a  eInfo *pInode;..
2d1e0 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
2d1f0 65 78 28 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65  ex();.    pInode
2d200 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20   = inodeList;.  
2d210 20 20 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20    while( pInode 
2d220 26 26 20 28 70 49 6e 6f 64 65 2d 3e 66 69 6c 65  && (pInode->file
2d230 49 64 2e 64 65 76 21 3d 73 53 74 61 74 2e 73 74  Id.dev!=sStat.st
2d240 5f 64 65 76 0a 20 20 20 20 20 20 20 20 20 20 20  _dev.           
2d250 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 6e            || pIn
2d260 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 21  ode->fileId.ino!
2d270 3d 73 53 74 61 74 2e 73 74 5f 69 6e 6f 29 20 29  =sStat.st_ino) )
2d280 7b 0a 20 20 20 20 20 20 20 70 49 6e 6f 64 65 20  {.       pInode 
2d290 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b  = pInode->pNext;
2d2a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
2d2b0 49 6e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 55  Inode ){.      U
2d2c0 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2a 70 70  nixUnusedFd **pp
2d2d0 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 70 3d 26  ;.      for(pp=&
2d2e0 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b  pInode->pUnused;
2d2f0 20 2a 70 70 20 26 26 20 28 2a 70 70 29 2d 3e 66   *pp && (*pp)->f
2d300 6c 61 67 73 21 3d 66 6c 61 67 73 3b 20 70 70 3d  lags!=flags; pp=
2d310 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29  &((*pp)->pNext))
2d320 3b 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64 20  ;.      pUnused 
2d330 3d 20 2a 70 70 3b 0a 20 20 20 20 20 20 69 66 28  = *pp;.      if(
2d340 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20   pUnused ){.    
2d350 20 20 20 20 2a 70 70 20 3d 20 70 55 6e 75 73 65      *pp = pUnuse
2d360 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  d->pNext;.      
2d370 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78  }.    }.    unix
2d380 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
2d390 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a 20 69  }.#endif    /* i
2d3a0 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f  f !OS_VXWORKS */
2d3b0 0a 20 20 72 65 74 75 72 6e 20 70 55 6e 75 73 65  .  return pUnuse
2d3c0 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  d;.}../*.** This
2d3d0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2d3e0 6c 65 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28  led by unixOpen(
2d3f0 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  ) to determine t
2d400 68 65 20 75 6e 69 78 20 70 65 72 6d 69 73 73 69  he unix permissi
2d410 6f 6e 73 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65  ons.** to create
2d420 20 6e 65 77 20 66 69 6c 65 73 20 77 69 74 68 2e   new files with.
2d430 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
2d440 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  urs, then SQLITE
2d450 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a  _OK is returned.
2d460 2a 2a 20 61 6e 64 20 61 20 76 61 6c 75 65 20 73  ** and a value s
2d470 75 69 74 61 62 6c 65 20 66 6f 72 20 70 61 73 73  uitable for pass
2d480 69 6e 67 20 61 73 20 74 68 65 20 74 68 69 72 64  ing as the third
2d490 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 70 65   argument to ope
2d4a0 6e 28 32 29 20 69 73 0a 2a 2a 20 77 72 69 74 74  n(2) is.** writt
2d4b0 65 6e 20 74 6f 20 2a 70 4d 6f 64 65 2e 20 49 66  en to *pMode. If
2d4c0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
2d4d0 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  urs, an SQLite e
2d4e0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a  rror code is .**
2d4f0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
2d500 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 4d 6f 64  e value of *pMod
2d510 65 20 69 73 20 6e 6f 74 20 6d 6f 64 69 66 69 65  e is not modifie
2d520 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6d 6f 73 74  d..**.** In most
2d530 20 63 61 73 65 73 2c 20 74 68 69 73 20 72 6f 75   cases, this rou
2d540 74 69 6e 65 20 73 65 74 73 20 2a 70 4d 6f 64 65  tine sets *pMode
2d550 20 74 6f 20 30 2c 20 77 68 69 63 68 20 77 69 6c   to 0, which wil
2d560 6c 20 62 65 63 6f 6d 65 0a 2a 2a 20 61 6e 20 69  l become.** an i
2d570 6e 64 69 63 61 74 69 6f 6e 20 74 6f 20 72 6f 62  ndication to rob
2d580 75 73 74 5f 6f 70 65 6e 28 29 20 74 6f 20 63 72  ust_open() to cr
2d590 65 61 74 65 20 74 68 65 20 66 69 6c 65 20 75 73  eate the file us
2d5a0 69 6e 67 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 45  ing.** SQLITE_DE
2d5b0 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
2d5c0 53 53 49 4f 4e 53 20 61 64 6a 75 73 74 65 64 20  SSIONS adjusted 
2d5d0 62 79 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a  by the umask..**
2d5e0 20 42 75 74 20 69 66 20 74 68 65 20 66 69 6c 65   But if the file
2d5f0 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 69 73   being opened is
2d600 20 61 20 57 41 4c 20 6f 72 20 72 65 67 75 6c 61   a WAL or regula
2d610 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  r journal file, 
2d620 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66 75  then .** this fu
2d630 6e 63 74 69 6f 6e 20 71 75 65 72 69 65 73 20 74  nction queries t
2d640 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66  he file-system f
2d650 6f 72 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f  or the permissio
2d660 6e 73 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 63 6f  ns on the .** co
2d670 72 72 65 73 70 6f 6e 64 69 6e 67 20 64 61 74 61  rresponding data
2d680 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 73 65  base file and se
2d690 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20 74 68 69  ts *pMode to thi
2d6a0 73 20 76 61 6c 75 65 2e 20 57 68 65 6e 65 76 65  s value. Wheneve
2d6b0 72 20 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2c 20  r .** possible, 
2d6c0 57 41 4c 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20  WAL and journal 
2d6d0 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65  files are create
2d6e0 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  d using the same
2d6f0 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a 2a   permissions .**
2d700 20 61 73 20 74 68 65 20 61 73 73 6f 63 69 61 74   as the associat
2d710 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
2d720 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53  ..**.** If the S
2d730 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33  QLITE_ENABLE_8_3
2d740 5f 4e 41 4d 45 53 20 6f 70 74 69 6f 6e 20 69 73  _NAMES option is
2d750 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74   enabled, then t
2d760 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 66  he.** original f
2d770 69 6c 65 6e 61 6d 65 20 69 73 20 75 6e 61 76 61  ilename is unava
2d780 69 6c 61 62 6c 65 2e 20 20 42 75 74 20 38 5f 33  ilable.  But 8_3
2d790 5f 4e 41 4d 45 53 20 69 73 20 6f 6e 6c 79 20 75  _NAMES is only u
2d7a0 73 65 64 20 66 6f 72 0a 2a 2a 20 46 41 54 20 66  sed for.** FAT f
2d7b0 69 6c 65 73 79 73 74 65 6d 73 20 61 6e 64 20 70  ilesystems and p
2d7c0 65 72 6d 69 73 73 69 6f 6e 73 20 64 6f 20 6e 6f  ermissions do no
2d7d0 74 20 6d 61 74 74 65 72 20 74 68 65 72 65 2c 20  t matter there, 
2d7e0 73 6f 20 6a 75 73 74 20 75 73 65 0a 2a 2a 20 74  so just use.** t
2d7f0 68 65 20 64 65 66 61 75 6c 74 20 70 65 72 6d 69  he default permi
2d800 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  ssions..*/.stati
2d810 63 20 69 6e 74 20 66 69 6e 64 43 72 65 61 74 65  c int findCreate
2d820 46 69 6c 65 4d 6f 64 65 28 0a 20 20 63 6f 6e 73  FileMode(.  cons
2d830 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
2d840 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2d850 61 74 68 20 6f 66 20 66 69 6c 65 20 28 70 6f 73  ath of file (pos
2d860 73 69 62 6c 79 29 20 62 65 69 6e 67 20 63 72 65  sibly) being cre
2d870 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  ated */.  int fl
2d880 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
2d890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
2d8a0 67 73 20 70 61 73 73 65 64 20 61 73 20 34 74 68  gs passed as 4th
2d8b0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 4f 70   argument to xOp
2d8c0 65 6e 28 29 20 2a 2f 0a 20 20 6d 6f 64 65 5f 74  en() */.  mode_t
2d8d0 20 2a 70 4d 6f 64 65 2c 20 20 20 20 20 20 20 20   *pMode,        
2d8e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
2d8f0 3a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f  : Permissions to
2d900 20 6f 70 65 6e 20 66 69 6c 65 20 77 69 74 68 20   open file with 
2d910 2a 2f 0a 20 20 75 69 64 5f 74 20 2a 70 55 69 64  */.  uid_t *pUid
2d920 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2d930 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 75 69 64       /* OUT: uid
2d940 20 74 6f 20 73 65 74 20 6f 6e 20 74 68 65 20 66   to set on the f
2d950 69 6c 65 20 2a 2f 0a 20 20 67 69 64 5f 74 20 2a  ile */.  gid_t *
2d960 70 47 69 64 20 20 20 20 20 20 20 20 20 20 20 20  pGid            
2d970 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
2d980 20 67 69 64 20 74 6f 20 73 65 74 20 6f 6e 20 74   gid to set on t
2d990 68 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20  he file */.){.  
2d9a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2d9b0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
2d9c0 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
2d9d0 2f 0a 20 20 2a 70 4d 6f 64 65 20 3d 20 30 3b 0a  /.  *pMode = 0;.
2d9e0 20 20 2a 70 55 69 64 20 3d 20 30 3b 0a 20 20 2a    *pUid = 0;.  *
2d9f0 70 47 69 64 20 3d 20 30 3b 0a 20 20 69 66 28 20  pGid = 0;.  if( 
2da00 66 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f  flags & (SQLITE_
2da10 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f  OPEN_WAL|SQLITE_
2da20 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
2da30 4c 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a  L) ){.    char z
2da40 44 62 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b  Db[MAX_PATHNAME+
2da50 31 5d 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62  1];     /* Datab
2da60 61 73 65 20 66 69 6c 65 20 70 61 74 68 20 2a 2f  ase file path */
2da70 0a 20 20 20 20 69 6e 74 20 6e 44 62 3b 20 20 20  .    int nDb;   
2da80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da90 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2daa0 76 61 6c 69 64 20 62 79 74 65 73 20 69 6e 20 7a  valid bytes in z
2dab0 44 62 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74  Db */.    struct
2dac0 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20   stat sStat;    
2dad0 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
2dae0 74 20 6f 66 20 73 74 61 74 28 29 20 6f 6e 20 64  t of stat() on d
2daf0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2db00 0a 20 20 20 20 2f 2a 20 7a 50 61 74 68 20 69 73  .    /* zPath is
2db10 20 61 20 70 61 74 68 20 74 6f 20 61 20 57 41 4c   a path to a WAL
2db20 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   or journal file
2db30 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
2db40 62 6c 6f 63 6b 20 64 65 72 69 76 65 73 0a 20 20  block derives.  
2db50 20 20 2a 2a 20 74 68 65 20 70 61 74 68 20 74 6f    ** the path to
2db60 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
2db70 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 72  database file fr
2db80 6f 6d 20 7a 50 61 74 68 2e 20 54 68 69 73 20 62  om zPath. This b
2db90 6c 6f 63 6b 20 68 61 6e 64 6c 65 73 0a 20 20 20  lock handles.   
2dba0 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** the followin
2dbb0 67 20 6e 61 6d 69 6e 67 20 63 6f 6e 76 65 6e 74  g naming convent
2dbc0 69 6f 6e 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  ions:.    **.   
2dbd0 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20   **   "<path to 
2dbe0 64 62 3e 2d 6a 6f 75 72 6e 61 6c 22 0a 20 20 20  db>-journal".   
2dbf0 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20   **   "<path to 
2dc00 64 62 3e 2d 77 61 6c 22 0a 20 20 20 20 2a 2a 20  db>-wal".    ** 
2dc10 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d    "<path to db>-
2dc20 6a 6f 75 72 6e 61 6c 4e 4e 22 0a 20 20 20 20 2a  journalNN".    *
2dc30 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62  *   "<path to db
2dc40 3e 2d 77 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 0a  >-walNN".    **.
2dc50 20 20 20 20 2a 2a 20 77 68 65 72 65 20 4e 4e 20      ** where NN 
2dc60 69 73 20 61 20 64 65 63 69 6d 61 6c 20 6e 75 6d  is a decimal num
2dc70 62 65 72 2e 20 54 68 65 20 4e 4e 20 6e 61 6d 69  ber. The NN nami
2dc80 6e 67 20 73 63 68 65 6d 65 73 20 61 72 65 20 0a  ng schemes are .
2dc90 20 20 20 20 2a 2a 20 75 73 65 64 20 62 79 20 74      ** used by t
2dca0 68 65 20 74 65 73 74 5f 6d 75 6c 74 69 70 6c 65  he test_multiple
2dcb0 78 2e 63 20 6d 6f 64 75 6c 65 2e 0a 20 20 20 20  x.c module..    
2dcc0 2a 2f 0a 20 20 20 20 6e 44 62 20 3d 20 73 71 6c  */.    nDb = sql
2dcd0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61  ite3Strlen30(zPa
2dce0 74 68 29 20 2d 20 31 3b 20 0a 23 69 66 64 65 66  th) - 1; .#ifdef
2dcf0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38   SQLITE_ENABLE_8
2dd00 5f 33 5f 4e 41 4d 45 53 0a 20 20 20 20 77 68 69  _3_NAMES.    whi
2dd10 6c 65 28 20 6e 44 62 3e 30 20 26 26 20 73 71 6c  le( nDb>0 && sql
2dd20 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a 50 61 74  ite3Isalnum(zPat
2dd30 68 5b 6e 44 62 5d 29 20 29 20 6e 44 62 2d 2d 3b  h[nDb]) ) nDb--;
2dd40 0a 20 20 20 20 69 66 28 20 6e 44 62 3d 3d 30 20  .    if( nDb==0 
2dd50 7c 7c 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27  || zPath[nDb]!='
2dd60 2d 27 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  -' ) return SQLI
2dd70 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 20  TE_OK;.#else.   
2dd80 20 77 68 69 6c 65 28 20 7a 50 61 74 68 5b 6e 44   while( zPath[nD
2dd90 62 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20  b]!='-' ){.     
2dda0 20 61 73 73 65 72 74 28 20 6e 44 62 3e 30 20 29   assert( nDb>0 )
2ddb0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2ddc0 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 5c 6e 27  zPath[nDb]!='\n'
2ddd0 20 29 3b 0a 20 20 20 20 20 20 6e 44 62 2d 2d 3b   );.      nDb--;
2dde0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
2ddf0 20 20 6d 65 6d 63 70 79 28 7a 44 62 2c 20 7a 50    memcpy(zDb, zP
2de00 61 74 68 2c 20 6e 44 62 29 3b 0a 20 20 20 20 7a  ath, nDb);.    z
2de10 44 62 5b 6e 44 62 5d 20 3d 20 27 5c 30 27 3b 0a  Db[nDb] = '\0';.
2de20 0a 20 20 20 20 69 66 28 20 30 3d 3d 6f 73 53 74  .    if( 0==osSt
2de30 61 74 28 7a 44 62 2c 20 26 73 53 74 61 74 29 20  at(zDb, &sStat) 
2de40 29 7b 0a 20 20 20 20 20 20 2a 70 4d 6f 64 65 20  ){.      *pMode 
2de50 3d 20 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 20  = sStat.st_mode 
2de60 26 20 30 37 37 37 3b 0a 20 20 20 20 20 20 2a 70  & 0777;.      *p
2de70 55 69 64 20 3d 20 73 53 74 61 74 2e 73 74 5f 75  Uid = sStat.st_u
2de80 69 64 3b 0a 20 20 20 20 20 20 2a 70 47 69 64 20  id;.      *pGid 
2de90 3d 20 73 53 74 61 74 2e 73 74 5f 67 69 64 3b 0a  = sStat.st_gid;.
2dea0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2deb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
2dec0 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a  RR_FSTAT;.    }.
2ded0 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
2dee0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
2def0 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 29 7b  DELETEONCLOSE ){
2df00 0a 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20 30 36  .    *pMode = 06
2df10 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  00;.  }.  return
2df20 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70   rc;.}../*.** Op
2df30 65 6e 20 74 68 65 20 66 69 6c 65 20 7a 50 61 74  en the file zPat
2df40 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72 65 76 69 6f  h..** .** Previo
2df50 75 73 6c 79 2c 20 74 68 65 20 53 51 4c 69 74 65  usly, the SQLite
2df60 20 4f 53 20 6c 61 79 65 72 20 75 73 65 64 20 74   OS layer used t
2df70 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 20 69  hree functions i
2df80 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 69 73 0a  n place of this.
2df90 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  ** one:.**.**   
2dfa0 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52    sqlite3OsOpenR
2dfb0 65 61 64 57 72 69 74 65 28 29 3b 0a 2a 2a 20 20  eadWrite();.**  
2dfc0 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e     sqlite3OsOpen
2dfd0 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20  ReadOnly();.**  
2dfe0 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e     sqlite3OsOpen
2dff0 45 78 63 6c 75 73 69 76 65 28 29 3b 0a 2a 2a 0a  Exclusive();.**.
2e000 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 73 20 63  ** These calls c
2e010 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65  orrespond to the
2e020 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69   following combi
2e030 6e 61 74 69 6f 6e 73 20 6f 66 20 66 6c 61 67 73  nations of flags
2e040 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 61 64  :.**.**     Read
2e050 57 72 69 74 65 28 29 20 2d 3e 20 20 20 20 20 28  Write() ->     (
2e060 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45 41  READWRITE | CREA
2e070 54 45 29 0a 2a 2a 20 20 20 20 20 52 65 61 64 4f  TE).**     ReadO
2e080 6e 6c 79 28 29 20 20 2d 3e 20 20 20 20 20 28 52  nly()  ->     (R
2e090 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20 20  EADONLY) .**    
2e0a0 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29   OpenExclusive()
2e0b0 20 2d 3e 20 28 52 45 41 44 57 52 49 54 45 20 7c   -> (READWRITE |
2e0c0 20 43 52 45 41 54 45 20 7c 20 45 58 43 4c 55 53   CREATE | EXCLUS
2e0d0 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  IVE).**.** The o
2e0e0 6c 64 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  ld OpenExclusive
2e0f0 28 29 20 61 63 63 65 70 74 65 64 20 61 20 62 6f  () accepted a bo
2e100 6f 6c 65 61 6e 20 61 72 67 75 6d 65 6e 74 20 2d  olean argument -
2e110 20 22 64 65 6c 46 6c 61 67 22 2e 20 49 66 0a 2a   "delFlag". If.*
2e120 2a 20 74 72 75 65 2c 20 74 68 65 20 66 69 6c 65  * true, the file
2e130 20 77 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20   was configured 
2e140 74 6f 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61  to be automatica
2e150 6c 6c 79 20 64 65 6c 65 74 65 64 20 77 68 65 6e  lly deleted when
2e160 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 68 61 6e   the.** file han
2e170 64 6c 65 20 63 6c 6f 73 65 64 2e 20 54 6f 20 61  dle closed. To a
2e180 63 68 69 65 76 65 20 74 68 65 20 73 61 6d 65 20  chieve the same 
2e190 65 66 66 65 63 74 20 75 73 69 6e 67 20 74 68 69  effect using thi
2e1a0 73 20 6e 65 77 20 0a 2a 2a 20 69 6e 74 65 72 66  s new .** interf
2e1b0 61 63 65 2c 20 61 64 64 20 74 68 65 20 44 45 4c  ace, add the DEL
2e1c0 45 54 45 4f 4e 43 4c 4f 53 45 20 66 6c 61 67 20  ETEONCLOSE flag 
2e1d0 74 6f 20 74 68 6f 73 65 20 73 70 65 63 69 66 69  to those specifi
2e1e0 65 64 20 61 62 6f 76 65 20 66 6f 72 20 0a 2a 2a  ed above for .**
2e1f0 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29   OpenExclusive()
2e200 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2e210 75 6e 69 78 4f 70 65 6e 28 0a 20 20 73 71 6c 69  unixOpen(.  sqli
2e220 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
2e230 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2e240 56 46 53 20 66 6f 72 20 77 68 69 63 68 20 74 68  VFS for which th
2e250 69 73 20 69 73 20 74 68 65 20 78 4f 70 65 6e 20  is is the xOpen 
2e260 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73  method */.  cons
2e270 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
2e280 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68           /* Path
2e290 6e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  name of file to 
2e2a0 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73  be opened */.  s
2e2b0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
2e2c0 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  le,         /* T
2e2d0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
2e2e0 6f 72 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20  or to be filled 
2e2f0 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  in */.  int flag
2e300 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
2e310 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 66 6c       /* Input fl
2e320 61 67 73 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74  ags to control t
2e330 68 65 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20 20  he opening */.  
2e340 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 20 20  int *pOutFlags  
2e350 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e360 4f 75 74 70 75 74 20 66 6c 61 67 73 20 72 65 74  Output flags ret
2e370 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20  urned to SQLite 
2e380 63 6f 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69  core */.){.  uni
2e390 78 46 69 6c 65 20 2a 70 20 3d 20 28 75 6e 69 78  xFile *p = (unix
2e3a0 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20  File *)pFile;.  
2e3b0 69 6e 74 20 66 64 20 3d 20 2d 31 3b 20 20 20 20  int fd = -1;    
2e3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e3d0 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
2e3e0 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 6f 70  r returned by op
2e3f0 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  en() */.  int op
2e400 65 6e 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20  enFlags = 0;    
2e410 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
2e420 73 20 74 6f 20 70 61 73 73 20 74 6f 20 6f 70 65  s to pass to ope
2e430 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79  n() */.  int eTy
2e440 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46  pe = flags&0xFFF
2e450 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20  FFF00;  /* Type 
2e460 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  of file to open 
2e470 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 3b  */.  int noLock;
2e480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e490 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f      /* True to o
2e4a0 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d  mit locking prim
2e4b0 69 74 69 76 65 73 20 2a 2f 0a 20 20 69 6e 74 20  itives */.  int 
2e4c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
2e4d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75             /* Fu
2e4e0 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f  nction Return Co
2e4f0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 74 72 6c  de */.  int ctrl
2e500 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20  Flags = 0;      
2e510 20 20 20 20 20 20 20 2f 2a 20 55 4e 49 58 46 49         /* UNIXFI
2e520 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 0a 20  LE_* flags */.. 
2e530 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65   int isExclusive
2e540 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
2e550 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
2e560 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c  VE);.  int isDel
2e570 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73  ete     = (flags
2e580 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   & SQLITE_OPEN_D
2e590 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20  ELETEONCLOSE);. 
2e5a0 20 69 6e 74 20 69 73 43 72 65 61 74 65 20 20 20   int isCreate   
2e5b0 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
2e5c0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29  ITE_OPEN_CREATE)
2e5d0 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e  ;.  int isReadon
2e5e0 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ly   = (flags & 
2e5f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2e600 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 52  ONLY);.  int isR
2e610 65 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61  eadWrite  = (fla
2e620 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
2e630 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 23 69 66  _READWRITE);.#if
2e640 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2e650 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69  OCKING_STYLE.  i
2e660 6e 74 20 69 73 41 75 74 6f 50 72 6f 78 79 20 20  nt isAutoProxy  
2e670 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
2e680 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59  E_OPEN_AUTOPROXY
2e690 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  );.#endif.#if de
2e6a0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
2e6b0 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   || SQLITE_ENABL
2e6c0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2e6d0 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20    struct statfs 
2e6e0 66 73 49 6e 66 6f 3b 0a 23 65 6e 64 69 66 0a 0a  fsInfo;.#endif..
2e6f0 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67    /* If creating
2e700 20 61 20 6d 61 73 74 65 72 20 6f 72 20 6d 61 69   a master or mai
2e710 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20  n-file journal, 
2e720 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
2e730 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 66  ll open.  ** a f
2e740 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 6f  ile-descriptor o
2e750 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  n the directory 
2e760 74 6f 6f 2e 20 54 68 65 20 66 69 72 73 74 20 74  too. The first t
2e770 69 6d 65 20 75 6e 69 78 53 79 6e 63 28 29 0a 20  ime unixSync(). 
2e780 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 68   ** is called th
2e790 65 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65  e directory file
2e7a0 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c   descriptor will
2e7b0 20 62 65 20 66 73 79 6e 63 28 29 65 64 20 61 6e   be fsync()ed an
2e7c0 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20 2a 2f  d close()d..  */
2e7d0 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72 20 3d  .  int syncDir =
2e7e0 20 28 69 73 43 72 65 61 74 65 20 26 26 20 28 0a   (isCreate && (.
2e7f0 20 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53          eType==S
2e800 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
2e810 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  R_JOURNAL .     
2e820 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
2e830 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
2e840 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70  AL .     || eTyp
2e850 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  e==SQLITE_OPEN_W
2e860 41 4c 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 49  AL.  ));..  /* I
2e870 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68  f argument zPath
2e880 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   is a NULL point
2e890 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  er, this functio
2e8a0 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f  n is required to
2e8b0 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d   open.  ** a tem
2e8c0 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65  porary file. Use
2e8d0 20 74 68 69 73 20 62 75 66 66 65 72 20 74 6f 20   this buffer to 
2e8e0 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e  store the file n
2e8f0 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63  ame in..  */.  c
2e900 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58  har zTmpname[MAX
2e910 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 0a 20 20  _PATHNAME+2];.  
2e920 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
2e930 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a  e = zPath;..  /*
2e940 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f   Check the follo
2e950 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20  wing statements 
2e960 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a  are true: .  **.
2e970 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74    **   (a) Exact
2e980 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45  ly one of the RE
2e990 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44  ADWRITE and READ
2e9a0 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20  ONLY flags must 
2e9b0 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a  be set, and .  *
2e9c0 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41 54  *   (b) if CREAT
2e9d0 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52  E is set, then R
2e9e0 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c  EADWRITE must al
2e9f0 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20  so be set, and. 
2ea00 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58 43   **   (c) if EXC
2ea10 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20 74  LUSIVE is set, t
2ea20 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20  hen CREATE must 
2ea30 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a  also be set..  *
2ea40 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c 45 54  *   (d) if DELET
2ea50 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c  EONCLOSE is set,
2ea60 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73   then CREATE mus
2ea70 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20  t also be set.. 
2ea80 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73   */.  assert((is
2ea90 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69  Readonly==0 || i
2eaa0 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26  sReadWrite==0) &
2eab0 26 20 28 69 73 52 65 61 64 57 72 69 74 65 20 7c  & (isReadWrite |
2eac0 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a  | isReadonly));.
2ead0 20 20 61 73 73 65 72 74 28 69 73 43 72 65 61 74    assert(isCreat
2eae0 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72  e==0 || isReadWr
2eaf0 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ite);.  assert(i
2eb00 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c  sExclusive==0 ||
2eb10 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73   isCreate);.  as
2eb20 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30  sert(isDelete==0
2eb30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a   || isCreate);..
2eb40 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42    /* The main DB
2eb50 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  , main journal, 
2eb60 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73  WAL file and mas
2eb70 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20  ter journal are 
2eb80 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f  never .  ** auto
2eb90 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
2eba0 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20  d. Nor are they 
2ebb0 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66  ever temporary f
2ebc0 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65  iles.  */.  asse
2ebd0 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
2ebe0 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
2ebf0 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
2ec00 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  AIN_DB );.  asse
2ec10 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
2ec20 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
2ec30 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
2ec40 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20  AIN_JOURNAL );. 
2ec50 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
2ec60 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
2ec70 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
2ec80 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
2ec90 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  AL );.  assert( 
2eca0 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
2ecb0 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
2ecc0 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29  QLITE_OPEN_WAL )
2ecd0 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74  ;..  /* Assert t
2ece0 68 61 74 20 74 68 65 20 75 70 70 65 72 20 6c 61  hat the upper la
2ecf0 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20  yer has set one 
2ed00 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70  of the "file-typ
2ed10 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61  e" flags. */.  a
2ed20 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51  ssert( eType==SQ
2ed30 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
2ed40 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d  B      || eType=
2ed50 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  =SQLITE_OPEN_TEM
2ed60 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20  P_DB .       || 
2ed70 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2ed80 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
2ed90 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
2eda0 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e  _OPEN_TEMP_JOURN
2edb0 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  AL .       || eT
2edc0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
2edd0 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c  _SUBJOURNAL   ||
2ede0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2edf0 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
2ee00 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  AL .       || eT
2ee10 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
2ee20 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c  _TRANSIENT_DB ||
2ee30 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2ee40 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20  PEN_WAL.  );..  
2ee50 2f 2a 20 44 65 74 65 63 74 20 61 20 70 69 64 20  /* Detect a pid 
2ee60 63 68 61 6e 67 65 20 61 6e 64 20 72 65 73 65 74  change and reset
2ee70 20 74 68 65 20 50 52 4e 47 2e 20 20 54 68 65 72   the PRNG.  Ther
2ee80 65 20 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64  e is a race cond
2ee90 69 74 69 6f 6e 0a 20 20 2a 2a 20 68 65 72 65 20  ition.  ** here 
2eea0 73 75 63 68 20 74 68 61 74 20 74 77 6f 20 6f 72  such that two or
2eeb0 20 6d 6f 72 65 20 74 68 72 65 61 64 73 20 61 6c   more threads al
2eec0 6c 20 74 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e  l trying to open
2eed0 20 64 61 74 61 62 61 73 65 73 20 61 74 0a 20 20   databases at.  
2eee0 2a 2a 20 74 68 65 20 73 61 6d 65 20 69 6e 73 74  ** the same inst
2eef0 61 6e 74 20 6d 69 67 68 74 20 61 6c 6c 20 72 65  ant might all re
2ef00 73 65 74 20 74 68 65 20 50 52 4e 47 2e 20 20 42  set the PRNG.  B
2ef10 75 74 20 6d 75 6c 74 69 70 6c 65 20 72 65 73 65  ut multiple rese
2ef20 74 73 0a 20 20 2a 2a 20 61 72 65 20 68 61 72 6d  ts.  ** are harm
2ef30 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  less..  */.  if(
2ef40 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 21 3d   randomnessPid!=
2ef50 6f 73 47 65 74 70 69 64 28 30 29 20 29 7b 0a 20  osGetpid(0) ){. 
2ef60 20 20 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64     randomnessPid
2ef70 20 3d 20 6f 73 47 65 74 70 69 64 28 30 29 3b 0a   = osGetpid(0);.
2ef80 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
2ef90 6f 6d 6e 65 73 73 28 30 2c 30 29 3b 0a 20 20 7d  omness(0,0);.  }
2efa0 0a 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  ..  memset(p, 0,
2efb0 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65   sizeof(unixFile
2efc0 29 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65  ));..  if( eType
2efd0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
2efe0 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20 55 6e 69  IN_DB ){.    Uni
2eff0 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73  xUnusedFd *pUnus
2f000 65 64 3b 0a 20 20 20 20 70 55 6e 75 73 65 64 20  ed;.    pUnused 
2f010 3d 20 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64  = findReusableFd
2f020 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a  (zName, flags);.
2f030 20 20 20 20 69 66 28 20 70 55 6e 75 73 65 64 20      if( pUnused 
2f040 29 7b 0a 20 20 20 20 20 20 66 64 20 3d 20 70 55  ){.      fd = pU
2f050 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20 20 20 7d  nused->fd;.    }
2f060 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 55 6e 75  else{.      pUnu
2f070 73 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  sed = sqlite3_ma
2f080 6c 6c 6f 63 36 34 28 73 69 7a 65 6f 66 28 2a 70  lloc64(sizeof(*p
2f090 55 6e 75 73 65 64 29 29 3b 0a 20 20 20 20 20 20  Unused));.      
2f0a0 69 66 28 20 21 70 55 6e 75 73 65 64 20 29 7b 0a  if( !pUnused ){.
2f0b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2f0c0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2f0d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
2f0e0 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 55 6e 75  ->pUnused = pUnu
2f0f0 73 65 64 3b 0a 0a 20 20 20 20 2f 2a 20 44 61 74  sed;..    /* Dat
2f100 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 73 20  abase filenames 
2f110 61 72 65 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20  are double-zero 
2f120 74 65 72 6d 69 6e 61 74 65 64 20 69 66 20 74 68  terminated if th
2f130 65 79 20 61 72 65 20 6e 6f 74 0a 20 20 20 20 2a  ey are not.    *
2f140 2a 20 55 52 49 73 20 77 69 74 68 20 70 61 72 61  * URIs with para
2f150 6d 65 74 65 72 73 2e 20 20 48 65 6e 63 65 2c 20  meters.  Hence, 
2f160 74 68 65 79 20 63 61 6e 20 61 6c 77 61 79 73 20  they can always 
2f170 62 65 20 70 61 73 73 65 64 20 69 6e 74 6f 0a 20  be passed into. 
2f180 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72     ** sqlite3_ur
2f190 69 5f 70 61 72 61 6d 65 74 65 72 28 29 2e 20 2a  i_parameter(). *
2f1a0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 66  /.    assert( (f
2f1b0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
2f1c0 45 4e 5f 55 52 49 29 20 7c 7c 20 7a 4e 61 6d 65  EN_URI) || zName
2f1d0 5b 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31  [strlen(zName)+1
2f1e0 5d 3d 3d 30 20 29 3b 0a 0a 20 20 7d 65 6c 73 65  ]==0 );..  }else
2f1f0 20 69 66 28 20 21 7a 4e 61 6d 65 20 29 7b 0a 20   if( !zName ){. 
2f200 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69     /* If zName i
2f210 73 20 4e 55 4c 4c 2c 20 74 68 65 20 75 70 70 65  s NULL, the uppe
2f220 72 20 6c 61 79 65 72 20 69 73 20 72 65 71 75 65  r layer is reque
2f230 73 74 69 6e 67 20 61 20 74 65 6d 70 20 66 69 6c  sting a temp fil
2f240 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
2f250 28 69 73 44 65 6c 65 74 65 20 26 26 20 21 73 79  (isDelete && !sy
2f260 6e 63 44 69 72 29 3b 0a 20 20 20 20 72 63 20 3d  ncDir);.    rc =
2f270 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65   unixGetTempname
2f280 28 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  (pVfs->mxPathnam
2f290 65 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20  e, zTmpname);.  
2f2a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2f2b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
2f2c0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2f2d0 20 20 7a 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61    zName = zTmpna
2f2e0 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65  me;..    /* Gene
2f2f0 72 61 74 65 64 20 74 65 6d 70 6f 72 61 72 79 20  rated temporary 
2f300 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 61 6c  filenames are al
2f310 77 61 79 73 20 64 6f 75 62 6c 65 2d 7a 65 72 6f  ways double-zero
2f320 20 74 65 72 6d 69 6e 61 74 65 64 0a 20 20 20 20   terminated.    
2f330 2a 2a 20 66 6f 72 20 75 73 65 20 62 79 20 73 71  ** for use by sq
2f340 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65  lite3_uri_parame
2f350 74 65 72 28 29 2e 20 2a 2f 0a 20 20 20 20 61 73  ter(). */.    as
2f360 73 65 72 74 28 20 7a 4e 61 6d 65 5b 73 74 72 6c  sert( zName[strl
2f370 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20  en(zName)+1]==0 
2f380 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74  );.  }..  /* Det
2f390 65 72 6d 69 6e 65 20 74 68 65 20 76 61 6c 75 65  ermine the value
2f3a0 20 6f 66 20 74 68 65 20 66 6c 61 67 73 20 70 61   of the flags pa
2f3b0 72 61 6d 65 74 65 72 20 70 61 73 73 65 64 20 74  rameter passed t
2f3c0 6f 20 50 4f 53 49 58 20 66 75 6e 63 74 69 6f 6e  o POSIX function
2f3d0 0a 20 20 2a 2a 20 6f 70 65 6e 28 29 2e 20 54 68  .  ** open(). Th
2f3e0 65 73 65 20 6d 75 73 74 20 62 65 20 63 61 6c 63  ese must be calc
2f3f0 75 6c 61 74 65 64 20 65 76 65 6e 20 69 66 20 6f  ulated even if o
2f400 70 65 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c  pen() is not cal
2f410 6c 65 64 2c 20 61 73 0a 20 20 2a 2a 20 74 68 65  led, as.  ** the
2f420 79 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20  y may be stored 
2f430 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66  as part of the f
2f440 69 6c 65 20 68 61 6e 64 6c 65 20 61 6e 64 20 75  ile handle and u
2f450 73 65 64 20 62 79 20 74 68 65 20 0a 20 20 2a 2a  sed by the .  **
2f460 20 27 63 6f 6e 63 68 20 66 69 6c 65 27 20 6c 6f   'conch file' lo
2f470 63 6b 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20  cking functions 
2f480 6c 61 74 65 72 20 6f 6e 2e 20 20 2a 2f 0a 20 20  later on.  */.  
2f490 69 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29  if( isReadonly )
2f4a0 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f    openFlags |= O
2f4b0 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 69  _RDONLY;.  if( i
2f4c0 73 52 65 61 64 57 72 69 74 65 20 29 20 6f 70 65  sReadWrite ) ope
2f4d0 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 57 52  nFlags |= O_RDWR
2f4e0 3b 0a 20 20 69 66 28 20 69 73 43 72 65 61 74 65  ;.  if( isCreate
2f4f0 20 29 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20   )    openFlags 
2f500 7c 3d 20 4f 5f 43 52 45 41 54 3b 0a 20 20 69 66  |= O_CREAT;.  if
2f510 28 20 69 73 45 78 63 6c 75 73 69 76 65 20 29 20  ( isExclusive ) 
2f520 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f  openFlags |= (O_
2f530 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29  EXCL|O_NOFOLLOW)
2f540 3b 0a 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d  ;.  openFlags |=
2f550 20 28 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f   (O_LARGEFILE|O_
2f560 42 49 4e 41 52 59 29 3b 0a 0a 20 20 69 66 28 20  BINARY);..  if( 
2f570 66 64 3c 30 20 29 7b 0a 20 20 20 20 6d 6f 64 65  fd<0 ){.    mode
2f580 5f 74 20 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20  _t openMode;    
2f590 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 65 72            /* Per
2f5a0 6d 69 73 73 69 6f 6e 73 20 74 6f 20 63 72 65 61  missions to crea
2f5b0 74 65 20 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a  te file with */.
2f5c0 20 20 20 20 75 69 64 5f 74 20 75 69 64 3b 20 20      uid_t uid;  
2f5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f5e0 20 20 2f 2a 20 55 73 65 72 69 64 20 66 6f 72 20    /* Userid for 
2f5f0 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  the file */.    
2f600 67 69 64 5f 74 20 67 69 64 3b 20 20 20 20 20 20  gid_t gid;      
2f610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f620 20 47 72 6f 75 70 69 64 20 66 6f 72 20 74 68 65   Groupid for the
2f630 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72 63 20   file */.    rc 
2f640 3d 20 66 69 6e 64 43 72 65 61 74 65 46 69 6c 65  = findCreateFile
2f650 4d 6f 64 65 28 7a 4e 61 6d 65 2c 20 66 6c 61 67  Mode(zName, flag
2f660 73 2c 20 26 6f 70 65 6e 4d 6f 64 65 2c 20 26 75  s, &openMode, &u
2f670 69 64 2c 20 26 67 69 64 29 3b 0a 20 20 20 20 69  id, &gid);.    i
2f680 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2f690 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2f6a0 28 20 21 70 2d 3e 70 55 6e 75 73 65 64 20 29 3b  ( !p->pUnused );
2f6b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
2f6c0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
2f6d0 4e 5f 57 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d  N_WAL || eType==
2f6e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2f6f0 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 20 20  _JOURNAL );.    
2f700 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2f710 20 7d 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75   }.    fd = robu
2f720 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f  st_open(zName, o
2f730 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f  penFlags, openMo
2f740 64 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  de);.    OSTRACE
2f750 28 28 22 4f 50 45 4e 58 20 20 20 25 2d 33 64 20  (("OPENX   %-3d 
2f760 25 73 20 30 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a  %s 0%o\n", fd, z
2f770 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 29  Name, openFlags)
2f780 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
2f790 69 73 45 78 63 6c 75 73 69 76 65 20 7c 7c 20 28  isExclusive || (
2f7a0 6f 70 65 6e 46 6c 61 67 73 20 26 20 4f 5f 43 52  openFlags & O_CR
2f7b0 45 41 54 29 21 3d 30 20 29 3b 0a 20 20 20 20 69  EAT)!=0 );.    i
2f7c0 66 28 20 66 64 3c 30 20 26 26 20 65 72 72 6e 6f  f( fd<0 && errno
2f7d0 21 3d 45 49 53 44 49 52 20 26 26 20 69 73 52 65  !=EISDIR && isRe
2f7e0 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20  adWrite ){.     
2f7f0 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 6f 70   /* Failed to op
2f800 65 6e 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20  en the file for 
2f810 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73  read/write acces
2f820 73 2e 20 54 72 79 20 72 65 61 64 2d 6f 6e 6c 79  s. Try read-only
2f830 2e 20 2a 2f 0a 20 20 20 20 20 20 66 6c 61 67 73  . */.      flags
2f840 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45   &= ~(SQLITE_OPE
2f850 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
2f860 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b  TE_OPEN_CREATE);
2f870 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73  .      openFlags
2f880 20 26 3d 20 7e 28 4f 5f 52 44 57 52 7c 4f 5f 43   &= ~(O_RDWR|O_C
2f890 52 45 41 54 29 3b 0a 20 20 20 20 20 20 66 6c 61  REAT);.      fla
2f8a0 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
2f8b0 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  N_READONLY;.    
2f8c0 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f    openFlags |= O
2f8d0 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 69  _RDONLY;.      i
2f8e0 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20  sReadonly = 1;. 
2f8f0 20 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74       fd = robust
2f900 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65  _open(zName, ope
2f910 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65  nFlags, openMode
2f920 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2f930 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 72   fd<0 ){.      r
2f940 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  c = unixLogError
2f950 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
2f960 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a  _BKPT, "open", z
2f970 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74  Name);.      got
2f980 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b  o open_finished;
2f990 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
2f9a0 66 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69  f this process i
2f9b0 73 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f  s running as roo
2f9c0 74 20 61 6e 64 20 69 66 20 63 72 65 61 74 69 6e  t and if creatin
2f9d0 67 20 61 20 6e 65 77 20 72 6f 6c 6c 62 61 63 6b  g a new rollback
2f9e0 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
2f9f0 6f 72 20 57 41 4c 20 66 69 6c 65 2c 20 73 65 74  or WAL file, set
2fa00 20 74 68 65 20 6f 77 6e 65 72 73 68 69 70 20 6f   the ownership o
2fa10 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72  f the journal or
2fa20 20 57 41 4c 20 74 6f 20 62 65 0a 20 20 20 20 2a   WAL to be.    *
2fa30 2a 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  * the same as th
2fa40 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
2fa50 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
2fa60 69 66 28 20 66 6c 61 67 73 20 26 20 28 53 51 4c  if( flags & (SQL
2fa70 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c  ITE_OPEN_WAL|SQL
2fa80 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
2fa90 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20 20 20  URNAL) ){.      
2faa0 72 6f 62 75 73 74 46 63 68 6f 77 6e 28 66 64 2c  robustFchown(fd,
2fab0 20 75 69 64 2c 20 67 69 64 29 3b 0a 20 20 20 20   uid, gid);.    
2fac0 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
2fad0 66 64 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  fd>=0 );.  if( p
2fae0 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20  OutFlags ){.    
2faf0 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c 61  *pOutFlags = fla
2fb00 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  gs;.  }..  if( p
2fb10 2d 3e 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20  ->pUnused ){.   
2fb20 20 70 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 64 20   p->pUnused->fd 
2fb30 3d 20 66 64 3b 0a 20 20 20 20 70 2d 3e 70 55 6e  = fd;.    p->pUn
2fb40 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20 66 6c  used->flags = fl
2fb50 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ags;.  }..  if( 
2fb60 69 73 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20  isDelete ){.#if 
2fb70 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 7a  OS_VXWORKS.    z
2fb80 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 65  Path = zName;.#e
2fb90 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  lif defined(SQLI
2fba0 54 45 5f 55 4e 4c 49 4e 4b 5f 41 46 54 45 52 5f  TE_UNLINK_AFTER_
2fbb0 43 4c 4f 53 45 29 0a 20 20 20 20 7a 50 61 74 68  CLOSE).    zPath
2fbc0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2fbd0 74 66 28 22 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  tf("%s", zName);
2fbe0 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68 3d 3d  .    if( zPath==
2fbf0 30 20 29 7b 0a 20 20 20 20 20 20 72 6f 62 75 73  0 ){.      robus
2fc00 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f  t_close(p, fd, _
2fc10 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
2fc20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2fc30 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65  MEM;.    }.#else
2fc40 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 4e  .    osUnlink(zN
2fc50 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  ame);.#endif.  }
2fc60 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
2fc70 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2fc80 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e  .  else{.    p->
2fc90 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e  openFlags = open
2fca0 46 6c 61 67 73 3b 0a 20 20 7d 0a 23 65 6e 64 69  Flags;.  }.#endi
2fcb0 66 0a 0a 20 20 6e 6f 4c 6f 63 6b 20 3d 20 65 54  f..  noLock = eT
2fcc0 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
2fcd0 5f 4d 41 49 4e 5f 44 42 3b 0a 0a 20 20 0a 23 69  _MAIN_DB;..  .#i
2fce0 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
2fcf0 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45  E__) || SQLITE_E
2fd00 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2fd10 59 4c 45 0a 20 20 69 66 28 20 66 73 74 61 74 66  YLE.  if( fstatf
2fd20 73 28 66 64 2c 20 26 66 73 49 6e 66 6f 29 20 3d  s(fd, &fsInfo) =
2fd30 3d 20 2d 31 20 29 7b 0a 20 20 20 20 73 74 6f 72  = -1 ){.    stor
2fd40 65 4c 61 73 74 45 72 72 6e 6f 28 70 2c 20 65 72  eLastErrno(p, er
2fd50 72 6e 6f 29 3b 0a 20 20 20 20 72 6f 62 75 73 74  rno);.    robust
2fd60 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f  _close(p, fd, __
2fd70 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 72 65 74  LINE__);.    ret
2fd80 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
2fd90 5f 41 43 43 45 53 53 3b 0a 20 20 7d 0a 20 20 69  _ACCESS;.  }.  i
2fda0 66 20 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28  f (0 == strncmp(
2fdb0 22 6d 73 64 6f 73 22 2c 20 66 73 49 6e 66 6f 2e  "msdos", fsInfo.
2fdc0 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 35 29  f_fstypename, 5)
2fdd0 29 20 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69  ) {.    ((unixFi
2fde0 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 66 73 46 6c  le*)pFile)->fsFl
2fdf0 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46 53  ags |= SQLITE_FS
2fe00 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a  FLAGS_IS_MSDOS;.
2fe10 20 20 7d 0a 20 20 69 66 20 28 30 20 3d 3d 20 73    }.  if (0 == s
2fe20 74 72 6e 63 6d 70 28 22 65 78 66 61 74 22 2c 20  trncmp("exfat", 
2fe30 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e  fsInfo.f_fstypen
2fe40 61 6d 65 2c 20 35 29 29 20 7b 0a 20 20 20 20 28  ame, 5)) {.    (
2fe50 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65  (unixFile*)pFile
2fe60 29 2d 3e 66 73 46 6c 61 67 73 20 7c 3d 20 53 51  )->fsFlags |= SQ
2fe70 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f  LITE_FSFLAGS_IS_
2fe80 4d 53 44 4f 53 3b 0a 20 20 7d 0a 23 65 6e 64 69  MSDOS;.  }.#endi
2fe90 66 0a 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 61  f..  /* Set up a
2fea0 70 70 72 6f 70 72 69 61 74 65 20 63 74 72 6c 46  ppropriate ctrlF
2feb0 6c 61 67 73 20 2a 2f 0a 20 20 69 66 28 20 69 73  lags */.  if( is
2fec0 44 65 6c 65 74 65 20 29 20 20 20 20 20 20 20 20  Delete )        
2fed0 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61 67          ctrlFlag
2fee0 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44 45  s |= UNIXFILE_DE
2fef0 4c 45 54 45 3b 0a 20 20 69 66 28 20 69 73 52 65  LETE;.  if( isRe
2ff00 61 64 6f 6e 6c 79 20 29 20 20 20 20 20 20 20 20  adonly )        
2ff10 20 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20        ctrlFlags 
2ff20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e  |= UNIXFILE_RDON
2ff30 4c 59 3b 0a 20 20 69 66 28 20 6e 6f 4c 6f 63 6b  LY;.  if( noLock
2ff40 20 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20   )              
2ff50 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d      ctrlFlags |=
2ff60 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b   UNIXFILE_NOLOCK
2ff70 3b 0a 20 20 69 66 28 20 73 79 6e 63 44 69 72 20  ;.  if( syncDir 
2ff80 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
2ff90 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55    ctrlFlags |= U
2ffa0 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 3b  NIXFILE_DIRSYNC;
2ffb0 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  .  if( flags & S
2ffc0 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20 29  QLITE_OPEN_URI )
2ffd0 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e   ctrlFlags |= UN
2ffe0 49 58 46 49 4c 45 5f 55 52 49 3b 0a 0a 23 69 66  IXFILE_URI;..#if
2fff0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
30000 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 69 66  OCKING_STYLE.#if
30010 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50   SQLITE_PREFER_P
30020 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 20 20 69  ROXY_LOCKING.  i
30030 73 41 75 74 6f 50 72 6f 78 79 20 3d 20 31 3b 0a  sAutoProxy = 1;.
30040 23 65 6e 64 69 66 0a 20 20 69 66 28 20 69 73 41  #endif.  if( isA
30050 75 74 6f 50 72 6f 78 79 20 26 26 20 28 7a 50 61  utoProxy && (zPa
30060 74 68 21 3d 4e 55 4c 4c 29 20 26 26 20 28 21 6e  th!=NULL) && (!n
30070 6f 4c 6f 63 6b 29 20 26 26 20 70 56 66 73 2d 3e  oLock) && pVfs->
30080 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 63 68 61  xOpen ){.    cha
30090 72 20 2a 65 6e 76 66 6f 72 63 65 20 3d 20 67 65  r *envforce = ge
300a0 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 46 4f 52  tenv("SQLITE_FOR
300b0 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  CE_PROXY_LOCKING
300c0 22 29 3b 0a 20 20 20 20 69 6e 74 20 75 73 65 50  ");.    int useP
300d0 72 6f 78 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  roxy = 0;..    /
300e0 2a 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50  * SQLITE_FORCE_P
300f0 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 3d 3d 31 20  ROXY_LOCKING==1 
30100 6d 65 61 6e 73 20 66 6f 72 63 65 20 61 6c 77 61  means force alwa
30110 79 73 20 75 73 65 20 70 72 6f 78 79 2c 20 30 20  ys use proxy, 0 
30120 6d 65 61 6e 73 20 0a 20 20 20 20 2a 2a 20 6e 65  means .    ** ne
30130 76 65 72 20 75 73 65 20 70 72 6f 78 79 2c 20 4e  ver use proxy, N
30140 55 4c 4c 20 6d 65 61 6e 73 20 75 73 65 20 70 72  ULL means use pr
30150 6f 78 79 20 66 6f 72 20 6e 6f 6e 2d 6c 6f 63 61  oxy for non-loca
30160 6c 20 66 69 6c 65 73 20 6f 6e 6c 79 2e 20 20 2a  l files only.  *
30170 2f 0a 20 20 20 20 69 66 28 20 65 6e 76 66 6f 72  /.    if( envfor
30180 63 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  ce!=NULL ){.    
30190 20 20 75 73 65 50 72 6f 78 79 20 3d 20 61 74 6f    useProxy = ato
301a0 69 28 65 6e 76 66 6f 72 63 65 29 3e 30 3b 0a 20  i(envforce)>0;. 
301b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
301c0 75 73 65 50 72 6f 78 79 20 3d 20 21 28 66 73 49  useProxy = !(fsI
301d0 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f  nfo.f_flags&MNT_
301e0 4c 4f 43 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20  LOCAL);.    }.  
301f0 20 20 69 66 28 20 75 73 65 50 72 6f 78 79 20 29    if( useProxy )
30200 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69 6c  {.      rc = fil
30210 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73  lInUnixFile(pVfs
30220 2c 20 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61  , fd, pFile, zPa
30230 74 68 2c 20 63 74 72 6c 46 6c 61 67 73 29 3b 0a  th, ctrlFlags);.
30240 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
30250 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
30260 20 20 20 72 63 20 3d 20 70 72 6f 78 79 54 72 61     rc = proxyTra
30270 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 28  nsformUnixFile((
30280 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 2c  unixFile*)pFile,
30290 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 20 20 20 20   ":auto:");.    
302a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
302b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
302c0 20 20 20 2f 2a 20 55 73 65 20 75 6e 69 78 43 6c     /* Use unixCl
302d0 6f 73 65 20 74 6f 20 63 6c 65 61 6e 20 75 70 20  ose to clean up 
302e0 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 61 64  the resources ad
302f0 64 65 64 20 69 6e 20 66 69 6c 6c 49 6e 55 6e 69  ded in fillInUni
30300 78 46 69 6c 65 20 0a 20 20 20 20 20 20 20 20 20  xFile .         
30310 20 2a 2a 20 61 6e 64 20 63 6c 65 61 72 20 61 6c   ** and clear al
30320 6c 20 74 68 65 20 73 74 72 75 63 74 75 72 65 27  l the structure'
30330 73 20 72 65 66 65 72 65 6e 63 65 73 2e 20 20 53  s references.  S
30340 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 0a 20 20  pecifically, .  
30350 20 20 20 20 20 20 20 20 2a 2a 20 70 46 69 6c 65          ** pFile
30360 2d 3e 70 4d 65 74 68 6f 64 73 20 77 69 6c 6c 20  ->pMethods will 
30370 62 65 20 4e 55 4c 4c 20 73 6f 20 73 71 6c 69 74  be NULL so sqlit
30380 65 33 4f 73 43 6c 6f 73 65 20 77 69 6c 6c 20 62  e3OsClose will b
30390 65 20 61 20 6e 6f 2d 6f 70 20 0a 20 20 20 20 20  e a no-op .     
303a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
303b0 20 20 75 6e 69 78 43 6c 6f 73 65 28 70 46 69 6c    unixClose(pFil
303c0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  e);.          re
303d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
303e0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
303f0 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73   goto open_finis
30400 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  hed;.    }.  }.#
30410 65 6e 64 69 66 0a 20 20 0a 20 20 72 63 20 3d 20  endif.  .  rc = 
30420 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70  fillInUnixFile(p
30430 56 66 73 2c 20 66 64 2c 20 70 46 69 6c 65 2c 20  Vfs, fd, pFile, 
30440 7a 50 61 74 68 2c 20 63 74 72 6c 46 6c 61 67 73  zPath, ctrlFlags
30450 29 3b 0a 0a 6f 70 65 6e 5f 66 69 6e 69 73 68 65  );..open_finishe
30460 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  d:.  if( rc!=SQL
30470 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
30480 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 70 55  lite3_free(p->pU
30490 6e 75 73 65 64 29 3b 0a 20 20 7d 0a 20 20 72 65  nused);.  }.  re
304a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
304b0 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 66 69  ** Delete the fi
304c0 6c 65 20 61 74 20 7a 50 61 74 68 2e 20 49 66 20  le at zPath. If 
304d0 74 68 65 20 64 69 72 53 79 6e 63 20 61 72 67 75  the dirSync argu
304e0 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20 66 73  ment is true, fs
304f0 79 6e 63 28 29 0a 2a 2a 20 74 68 65 20 64 69 72  ync().** the dir
30500 65 63 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c  ectory after del
30510 65 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0a  eting the file..
30520 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
30530 69 78 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69  ixDelete(.  sqli
30540 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
30550 2c 20 20 20 20 20 2f 2a 20 56 46 53 20 63 6f 6e  ,     /* VFS con
30560 74 61 69 6e 69 6e 67 20 74 68 69 73 20 61 73 20  taining this as 
30570 74 68 65 20 78 44 65 6c 65 74 65 20 6d 65 74 68  the xDelete meth
30580 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  od */.  const ch
30590 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
305a0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c    /* Name of fil
305b0 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20  e to be deleted 
305c0 2a 2f 0a 20 20 69 6e 74 20 64 69 72 53 79 6e 63  */.  int dirSync
305d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
305e0 2a 20 49 66 20 74 72 75 65 2c 20 66 73 79 6e 63  * If true, fsync
305f0 28 29 20 64 69 72 65 63 74 6f 72 79 20 61 66 74  () directory aft
30600 65 72 20 64 65 6c 65 74 69 6e 67 20 66 69 6c 65  er deleting file
30610 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
30620 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55  = SQLITE_OK;.  U
30630 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
30640 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75  NotUsed);.  Simu
30650 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75  lateIOError(retu
30660 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
30670 44 45 4c 45 54 45 29 3b 0a 20 20 69 66 28 20 6f  DELETE);.  if( o
30680 73 55 6e 6c 69 6e 6b 28 7a 50 61 74 68 29 3d 3d  sUnlink(zPath)==
30690 28 2d 31 29 20 29 7b 0a 20 20 20 20 69 66 28 20  (-1) ){.    if( 
306a0 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 0a 23 69  errno==ENOENT.#i
306b0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20  f OS_VXWORKS.   
306c0 20 20 20 20 20 7c 7c 20 6f 73 41 63 63 65 73 73       || osAccess
306d0 28 7a 50 61 74 68 2c 30 29 21 3d 30 0a 23 65 6e  (zPath,0)!=0.#en
306e0 64 69 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  dif.    ){.     
306f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
30700 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b  RR_DELETE_NOENT;
30710 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
30720 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
30730 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
30740 5f 44 45 4c 45 54 45 2c 20 22 75 6e 6c 69 6e 6b  _DELETE, "unlink
30750 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d  ", zPath);.    }
30760 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
30770 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
30780 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59  TE_DISABLE_DIRSY
30790 4e 43 0a 20 20 69 66 28 20 28 64 69 72 53 79 6e  NC.  if( (dirSyn
307a0 63 20 26 20 31 29 21 3d 30 20 29 7b 0a 20 20 20  c & 1)!=0 ){.   
307b0 20 69 6e 74 20 66 64 3b 0a 20 20 20 20 72 63 20   int fd;.    rc 
307c0 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72  = osOpenDirector
307d0 79 28 7a 50 61 74 68 2c 20 26 66 64 29 3b 0a 20  y(zPath, &fd);. 
307e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
307f0 45 5f 4f 4b 20 29 7b 0a 23 69 66 20 4f 53 5f 56  E_OK ){.#if OS_V
30800 58 57 4f 52 4b 53 0a 20 20 20 20 20 20 69 66 28  XWORKS.      if(
30810 20 66 73 79 6e 63 28 66 64 29 3d 3d 2d 31 20 29   fsync(fd)==-1 )
30820 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28  .#else.      if(
30830 20 66 73 79 6e 63 28 66 64 29 20 29 0a 23 65 6e   fsync(fd) ).#en
30840 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  dif.      {.    
30850 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
30860 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
30870 52 52 5f 44 49 52 5f 46 53 59 4e 43 2c 20 22 66  RR_DIR_FSYNC, "f
30880 73 79 6e 63 22 2c 20 7a 50 61 74 68 29 3b 0a 20  sync", zPath);. 
30890 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 6f 62       }.      rob
308a0 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c  ust_close(0, fd,
308b0 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
308c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
308d0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
308e0 43 41 4e 54 4f 50 45 4e 20 29 3b 0a 20 20 20 20  CANTOPEN );.    
308f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
30900 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
30910 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  if.  return rc;.
30920 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 68  }../*.** Test th
30930 65 20 65 78 69 73 74 65 6e 63 65 20 6f 66 20 6f  e existence of o
30940 72 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73  r access permiss
30950 69 6f 6e 73 20 6f 66 20 66 69 6c 65 20 7a 50 61  ions of file zPa
30960 74 68 2e 20 54 68 65 0a 2a 2a 20 74 65 73 74 20  th. The.** test 
30970 70 65 72 66 6f 72 6d 65 64 20 64 65 70 65 6e 64  performed depend
30980 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  s on the value o
30990 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20  f flags:.**.**  
309a0 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53     SQLITE_ACCESS
309b0 5f 45 58 49 53 54 53 3a 20 52 65 74 75 72 6e 20  _EXISTS: Return 
309c0 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 65 78  1 if the file ex
309d0 69 73 74 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49  ists.**     SQLI
309e0 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52  TE_ACCESS_READWR
309f0 49 54 45 3a 20 52 65 74 75 72 6e 20 31 20 69 66  ITE: Return 1 if
30a00 20 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 61   the file is rea
30a10 64 20 61 6e 64 20 77 72 69 74 61 62 6c 65 2e 0a  d and writable..
30a20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43  **     SQLITE_AC
30a30 43 45 53 53 5f 52 45 41 44 4f 4e 4c 59 3a 20 52  CESS_READONLY: R
30a40 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66  eturn 1 if the f
30a50 69 6c 65 20 69 73 20 72 65 61 64 61 62 6c 65 2e  ile is readable.
30a60 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
30a70 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74   return 0..*/.st
30a80 61 74 69 63 20 69 6e 74 20 75 6e 69 78 41 63 63  atic int unixAcc
30a90 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ess(.  sqlite3_v
30aa0 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 2f  fs *NotUsed,   /
30ab0 2a 20 54 68 65 20 56 46 53 20 63 6f 6e 74 61 69  * The VFS contai
30ac0 6e 69 6e 67 20 74 68 69 73 20 78 41 63 63 65 73  ning this xAcces
30ad0 73 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f  s method */.  co
30ae0 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
30af0 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66        /* Path of
30b00 20 74 68 65 20 66 69 6c 65 20 74 6f 20 65 78 61   the file to exa
30b10 6d 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  mine */.  int fl
30b20 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
30b30 20 20 2f 2a 20 57 68 61 74 20 64 6f 20 77 65 20    /* What do we 
30b40 77 61 6e 74 20 74 6f 20 6c 65 61 72 6e 20 61 62  want to learn ab
30b50 6f 75 74 20 74 68 65 20 7a 50 61 74 68 20 66 69  out the zPath fi
30b60 6c 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  le? */.  int *pR
30b70 65 73 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  esOut           
30b80 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74   /* Write result
30b90 20 62 6f 6f 6c 65 61 6e 20 68 65 72 65 20 2a 2f   boolean here */
30ba0 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  .){.  UNUSED_PAR
30bb0 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
30bc0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
30bd0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
30be0 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 20  E_IOERR_ACCESS; 
30bf0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65  );.  assert( pRe
30c00 73 4f 75 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  sOut!=0 );..  /*
30c10 20 54 68 65 20 73 70 65 63 20 73 61 79 73 20 74   The spec says t
30c20 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20 70  here are three p
30c30 6f 73 73 69 62 6c 65 20 76 61 6c 75 65 73 20 66  ossible values f
30c40 6f 72 20 66 6c 61 67 73 2e 20 20 42 75 74 20 6f  or flags.  But o
30c50 6e 6c 79 0a 20 20 2a 2a 20 74 77 6f 20 6f 66 20  nly.  ** two of 
30c60 74 68 65 6d 20 61 72 65 20 61 63 74 75 61 6c 6c  them are actuall
30c70 79 20 75 73 65 64 20 2a 2f 0a 20 20 61 73 73 65  y used */.  asse
30c80 72 74 28 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54  rt( flags==SQLIT
30c90 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 20  E_ACCESS_EXISTS 
30ca0 7c 7c 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45  || flags==SQLITE
30cb0 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54  _ACCESS_READWRIT
30cc0 45 20 29 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67  E );..  if( flag
30cd0 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53  s==SQLITE_ACCESS
30ce0 5f 45 58 49 53 54 53 20 29 7b 0a 20 20 20 20 73  _EXISTS ){.    s
30cf0 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
30d00 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 28      *pResOut = (
30d10 30 3d 3d 6f 73 53 74 61 74 28 7a 50 61 74 68 2c  0==osStat(zPath,
30d20 20 26 62 75 66 29 20 26 26 20 62 75 66 2e 73 74   &buf) && buf.st
30d30 5f 73 69 7a 65 3e 30 29 3b 0a 20 20 7d 65 6c 73  _size>0);.  }els
30d40 65 7b 0a 20 20 20 20 2a 70 52 65 73 4f 75 74 20  e{.    *pResOut 
30d50 3d 20 6f 73 41 63 63 65 73 73 28 7a 50 61 74 68  = osAccess(zPath
30d60 2c 20 57 5f 4f 4b 7c 52 5f 4f 4b 29 3d 3d 30 3b  , W_OK|R_OK)==0;
30d70 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
30d80 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
30d90 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69  ** Turn a relati
30da0 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f  ve pathname into
30db0 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65   a full pathname
30dc0 2e 20 54 68 65 20 72 65 6c 61 74 69 76 65 20 70  . The relative p
30dd0 61 74 68 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64  ath.** is stored
30de0 20 61 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e   as a nul-termin
30df0 61 74 65 64 20 73 74 72 69 6e 67 20 69 6e 20 74  ated string in t
30e00 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
30e10 64 20 74 6f 20 62 79 0a 2a 2a 20 7a 50 61 74 68  d to by.** zPath
30e20 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70 6f  . .**.** zOut po
30e30 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72  ints to a buffer
30e40 20 6f 66 20 61 74 20 6c 65 61 73 74 20 73 71 6c   of at least sql
30e50 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e  ite3_vfs.mxPathn
30e60 61 6d 65 20 62 79 74 65 73 20 0a 2a 2a 20 28 69  ame bytes .** (i
30e70 6e 20 74 68 69 73 20 63 61 73 65 2c 20 4d 41 58  n this case, MAX
30e80 5f 50 41 54 48 4e 41 4d 45 20 62 79 74 65 73 29  _PATHNAME bytes)
30e90 2e 20 54 68 65 20 66 75 6c 6c 2d 70 61 74 68 20  . The full-path 
30ea0 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a  is written to.**
30eb0 20 74 68 69 73 20 62 75 66 66 65 72 20 62 65 66   this buffer bef
30ec0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
30ed0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
30ee0 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20  xFullPathname(. 
30ef0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
30f00 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  fs,            /
30f10 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73  * Pointer to vfs
30f20 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e   object */.  con
30f30 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
30f40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
30f50 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20  ssibly relative 
30f60 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20  input path */.  
30f70 69 6e 74 20 6e 4f 75 74 2c 20 20 20 20 20 20 20  int nOut,       
30f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30f90 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20   Size of output 
30fa0 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 20  buffer in bytes 
30fb0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20  */.  char *zOut 
30fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30fd0 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66     /* Output buf
30fe0 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  fer */.){.  int 
30ff0 6e 42 79 74 65 3b 0a 0a 20 20 2f 2a 20 49 74 27  nByte;..  /* It'
31000 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74  s odd to simulat
31010 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65  e an io-error he
31020 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74  re, but really t
31030 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a  his is just.  **
31040 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72   using the io-er
31050 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75  ror infrastructu
31060 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  re to test that 
31070 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74  SQLite handles t
31080 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
31090 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68 69 73 20  n failing. This 
310a0 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66  function could f
310b0 61 69 6c 20 69 66 2c 20 66 6f 72 20 65 78 61 6d  ail if, for exam
310c0 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75  ple, the.  ** cu
310d0 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69  rrent working di
310e0 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e  rectory has been
310f0 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a   unlinked..  */.
31100 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
31110 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
31120 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20 61 73 73  _ERROR );..  ass
31130 65 72 74 28 20 70 56 66 73 2d 3e 6d 78 50 61 74  ert( pVfs->mxPat
31140 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50 41 54 48 4e  hname==MAX_PATHN
31150 41 4d 45 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  AME );.  UNUSED_
31160 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
31170 0a 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74  ..  /* Attempt t
31180 6f 20 72 65 73 6f 6c 76 65 20 74 68 65 20 70 61  o resolve the pa
31190 74 68 20 61 73 20 69 66 20 69 74 20 77 65 72 65  th as if it were
311a0 20 61 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b   a symbolic link
311b0 2e 20 49 66 20 69 74 20 69 73 0a 20 20 2a 2a 20  . If it is.  ** 
311c0 61 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 2c  a symbolic link,
311d0 20 74 68 65 20 72 65 73 6f 6c 76 65 64 20 70 61   the resolved pa
311e0 74 68 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  th is stored in 
311f0 62 75 66 66 65 72 20 7a 4f 75 74 5b 5d 2e 20 4f  buffer zOut[]. O
31200 72 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 69  r, if.  ** the i
31210 64 65 6e 74 69 66 69 65 64 20 66 69 6c 65 20 69  dentified file i
31220 73 20 6e 6f 74 20 61 20 73 79 6d 62 6f 6c 69 63  s not a symbolic
31230 20 6c 69 6e 6b 20 6f 72 20 64 6f 65 73 20 6e 6f   link or does no
31240 74 20 65 78 69 73 74 2c 20 74 68 65 6e 0a 20 20  t exist, then.  
31250 2a 2a 20 7a 50 61 74 68 20 69 73 20 63 6f 70 69  ** zPath is copi
31260 65 64 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f  ed directly into
31270 20 7a 4f 75 74 2e 20 45 69 74 68 65 72 20 77 61   zOut. Either wa
31280 79 2c 20 6e 42 79 74 65 20 69 73 20 6c 65 66 74  y, nByte is left
31290 20 73 65 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65   set to.  ** the
312a0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 73 74 72   size of the str
312b0 69 6e 67 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  ing copied into 
312c0 7a 4f 75 74 5b 5d 20 69 6e 20 62 79 74 65 73 2e  zOut[] in bytes.
312d0 20 20 2a 2f 0a 20 20 6e 42 79 74 65 20 3d 20 6f    */.  nByte = o
312e0 73 52 65 61 64 6c 69 6e 6b 28 7a 50 61 74 68 2c  sReadlink(zPath,
312f0 20 7a 4f 75 74 2c 20 6e 4f 75 74 2d 31 29 3b 0a   zOut, nOut-1);.
31300 20 20 69 66 28 20 6e 42 79 74 65 3c 30 20 29 7b    if( nByte<0 ){
31310 0a 20 20 20 20 69 66 28 20 65 72 72 6e 6f 21 3d  .    if( errno!=
31320 45 49 4e 56 41 4c 20 26 26 20 65 72 72 6e 6f 21  EINVAL && errno!
31330 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 20  =ENOENT ){.     
31340 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45   return unixLogE
31350 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
31360 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 72 65 61 64  OPEN_BKPT, "read
31370 6c 69 6e 6b 22 2c 20 7a 50 61 74 68 29 3b 0a 20  link", zPath);. 
31380 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
31390 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2c 20  _snprintf(nOut, 
313a0 7a 4f 75 74 2c 20 22 25 73 22 2c 20 7a 50 61 74  zOut, "%s", zPat
313b0 68 29 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20  h);.    nByte = 
313c0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
313d0 7a 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  zOut);.  }else{.
313e0 20 20 20 20 7a 4f 75 74 5b 6e 42 79 74 65 5d 20      zOut[nByte] 
313f0 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 0a 20 20 2f  = '\0';.  }..  /
31400 2a 20 49 66 20 62 75 66 66 65 72 20 7a 4f 75 74  * If buffer zOut
31410 5b 5d 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20  [] now contains 
31420 61 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68  an absolute path
31430 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e   there is nothin
31440 67 20 6d 6f 72 65 0a 20 20 2a 2a 20 74 6f 20 64  g more.  ** to d
31450 6f 2e 20 49 66 20 69 74 20 63 6f 6e 74 61 69 6e  o. If it contain
31460 73 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  s a relative pat
31470 68 2c 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  h, do the follow
31480 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ing:.  **.  **  
31490 20 2a 20 6d 6f 76 65 20 74 68 65 20 72 65 6c 61   * move the rela
314a0 74 69 76 65 20 70 61 74 68 20 73 74 72 69 6e 67  tive path string
314b0 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 61   so that it is a
314c0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 0a  t the end of th.
314d0 20 20 2a 2a 20 20 20 20 20 7a 4f 75 74 5b 5d 20    **     zOut[] 
314e0 62 75 66 66 65 72 2e 0a 20 20 2a 2a 20 20 20 2a  buffer..  **   *
314f0 20 43 61 6c 6c 20 67 65 74 63 77 64 28 29 20 74   Call getcwd() t
31500 6f 20 72 65 61 64 20 74 68 65 20 70 61 74 68 20  o read the path 
31510 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 77  of the current w
31520 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79  orking directory
31530 20 0a 20 20 2a 2a 20 20 20 20 20 69 6e 74 6f 20   .  **     into 
31540 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
31550 20 7a 4f 75 74 5b 5d 20 62 75 66 66 65 72 2e 0a   zOut[] buffer..
31560 20 20 2a 2a 20 20 20 2a 20 41 70 70 65 6e 64 20    **   * Append 
31570 61 20 27 2f 27 20 63 68 61 72 61 63 74 65 72 20  a '/' character 
31580 74 6f 20 74 68 65 20 63 77 64 20 73 74 72 69 6e  to the cwd strin
31590 67 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 0a  g and move the .
315a0 20 20 2a 2a 20 20 20 20 20 72 65 6c 61 74 69 76    **     relativ
315b0 65 20 70 61 74 68 20 62 61 63 6b 20 77 69 74 68  e path back with
315c0 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 73 6f  in the buffer so
315d0 20 74 68 61 74 20 69 74 20 69 6d 6d 65 64 69 61   that it immedia
315e0 74 65 6c 79 20 0a 20 20 2a 2a 20 20 20 20 20 66  tely .  **     f
315f0 6f 6c 6c 6f 77 73 20 74 68 65 20 27 2f 27 2e 0a  ollows the '/'..
31600 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63    **.  ** This c
31610 6f 64 65 20 69 73 20 77 72 69 74 74 65 6e 20 73  ode is written s
31620 6f 20 74 68 61 74 20 69 66 20 74 68 65 20 63 6f  o that if the co
31630 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65  mbination of the
31640 20 43 57 44 20 61 6e 64 20 72 65 6c 61 74 69 76   CWD and relativ
31650 65 0a 20 20 2a 2a 20 70 61 74 68 20 61 72 65 20  e.  ** path are 
31660 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
31670 61 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f  allocated size o
31680 66 20 7a 4f 75 74 5b 5d 20 74 68 65 20 43 57 44  f zOut[] the CWD
31690 20 69 73 20 73 69 6c 65 6e 74 6c 79 0a 20 20 2a   is silently.  *
316a0 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 6d  * truncated to m
316b0 61 6b 65 20 69 74 20 66 69 74 2e 20 54 68 69 73  ake it fit. This
316c0 20 69 73 20 4f 6b 2c 20 61 73 20 53 51 4c 69 74   is Ok, as SQLit
316d0 65 20 72 65 66 75 73 65 73 20 74 6f 20 6f 70 65  e refuses to ope
316e0 6e 20 61 6e 79 0a 20 20 2a 2a 20 66 69 6c 65 20  n any.  ** file 
316f0 66 6f 72 20 77 68 69 63 68 20 74 68 69 73 20 66  for which this f
31700 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
31710 61 20 66 75 6c 6c 20 70 61 74 68 20 6c 61 72 67  a full path larg
31720 65 72 20 74 68 61 6e 20 28 6e 4f 75 74 2d 38 29  er than (nOut-8)
31730 0a 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73  .  ** bytes in s
31740 69 7a 65 2e 20 20 2a 2f 0a 20 20 74 65 73 74 63  ize.  */.  testc
31750 61 73 65 28 20 6e 42 79 74 65 3d 3d 6e 4f 75 74  ase( nByte==nOut
31760 2d 35 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  -5 );.  testcase
31770 28 20 6e 42 79 74 65 3d 3d 6e 4f 75 74 2d 34 20  ( nByte==nOut-4 
31780 29 3b 0a 20 20 69 66 28 20 7a 4f 75 74 5b 30 5d  );.  if( zOut[0]
31790 21 3d 27 2f 27 20 26 26 20 6e 42 79 74 65 3c 6e  !='/' && nByte<n
317a0 4f 75 74 2d 34 20 29 7b 0a 20 20 20 20 69 6e 74  Out-4 ){.    int
317b0 20 6e 43 77 64 3b 0a 20 20 20 20 69 6e 74 20 6e   nCwd;.    int n
317c0 52 65 6d 20 3d 20 6e 4f 75 74 2d 6e 42 79 74 65  Rem = nOut-nByte
317d0 2d 31 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28  -1;.    memmove(
317e0 26 7a 4f 75 74 5b 6e 52 65 6d 5d 2c 20 7a 4f 75  &zOut[nRem], zOu
317f0 74 2c 20 6e 42 79 74 65 2b 31 29 3b 0a 20 20 20  t, nByte+1);.   
31800 20 7a 4f 75 74 5b 6e 52 65 6d 2d 31 5d 20 3d 20   zOut[nRem-1] = 
31810 27 5c 30 27 3b 0a 20 20 20 20 69 66 28 20 6f 73  '\0';.    if( os
31820 47 65 74 63 77 64 28 7a 4f 75 74 2c 20 6e 52 65  Getcwd(zOut, nRe
31830 6d 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  m-1)==0 ){.     
31840 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45   return unixLogE
31850 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
31860 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 67 65 74 63  OPEN_BKPT, "getc
31870 77 64 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20  wd", zPath);.   
31880 20 7d 0a 20 20 20 20 6e 43 77 64 20 3d 20 73 71   }.    nCwd = sq
31890 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f  lite3Strlen30(zO
318a0 75 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ut);.    assert(
318b0 20 6e 43 77 64 3c 3d 6e 52 65 6d 2d 31 20 29 3b   nCwd<=nRem-1 );
318c0 0a 20 20 20 20 7a 4f 75 74 5b 6e 43 77 64 5d 20  .    zOut[nCwd] 
318d0 3d 20 27 2f 27 3b 0a 20 20 20 20 6d 65 6d 6d 6f  = '/';.    memmo
318e0 76 65 28 26 7a 4f 75 74 5b 6e 43 77 64 2b 31 5d  ve(&zOut[nCwd+1]
318f0 2c 20 26 7a 4f 75 74 5b 6e 52 65 6d 5d 2c 20 6e  , &zOut[nRem], n
31900 42 79 74 65 2b 31 29 3b 0a 20 20 7d 0a 0a 20 20  Byte+1);.  }..  
31910 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
31920 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
31930 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
31940 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49  XTENSION./*.** I
31950 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70  nterfaces for op
31960 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  ening a shared l
31970 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20  ibrary, finding 
31980 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20  entry points.** 
31990 77 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65  within the share
319a0 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63  d library, and c
319b0 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65  losing the share
319c0 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69  d library..*/.#i
319d0 6e 63 6c 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e  nclude <dlfcn.h>
319e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 75 6e  .static void *un
319f0 69 78 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33  ixDlOpen(sqlite3
31a00 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 63  _vfs *NotUsed, c
31a10 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
31a20 6e 61 6d 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f  name){.  UNUSED_
31a30 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
31a40 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 6c 6f  d);.  return dlo
31a50 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52  pen(zFilename, R
31a60 54 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f 47  TLD_NOW | RTLD_G
31a70 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  LOBAL);.}../*.**
31a80 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68   SQLite calls th
31a90 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6d 6d 65  is function imme
31aa0 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 61 20  diately after a 
31ab0 63 61 6c 6c 20 74 6f 20 75 6e 69 78 44 6c 53 79  call to unixDlSy
31ac0 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c  m() or.** unixDl
31ad0 4f 70 65 6e 28 29 20 66 61 69 6c 73 20 28 72 65  Open() fails (re
31ae0 74 75 72 6e 73 20 61 20 6e 75 6c 6c 20 70 6f 69  turns a null poi
31af0 6e 74 65 72 29 2e 20 49 66 20 61 20 6d 6f 72 65  nter). If a more
31b00 20 64 65 74 61 69 6c 65 64 20 65 72 72 6f 72 0a   detailed error.
31b10 2a 2a 20 6d 65 73 73 61 67 65 20 69 73 20 61 76  ** message is av
31b20 61 69 6c 61 62 6c 65 2c 20 69 74 20 69 73 20 77  ailable, it is w
31b30 72 69 74 74 65 6e 20 74 6f 20 7a 42 75 66 4f 75  ritten to zBufOu
31b40 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6d  t. If no error m
31b50 65 73 73 61 67 65 0a 2a 2a 20 69 73 20 61 76 61  essage.** is ava
31b60 69 6c 61 62 6c 65 2c 20 7a 42 75 66 4f 75 74 20  ilable, zBufOut 
31b70 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69  is left unmodifi
31b80 65 64 20 61 6e 64 20 53 51 4c 69 74 65 20 75 73  ed and SQLite us
31b90 65 73 20 61 20 64 65 66 61 75 6c 74 0a 2a 2a 20  es a default.** 
31ba0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a  error message..*
31bb0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
31bc0 69 78 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65  ixDlError(sqlite
31bd0 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
31be0 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
31bf0 7a 42 75 66 4f 75 74 29 7b 0a 20 20 63 6f 6e 73  zBufOut){.  cons
31c00 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20  t char *zErr;.  
31c10 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
31c20 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 75 6e 69  (NotUsed);.  uni
31c30 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
31c40 20 7a 45 72 72 20 3d 20 64 6c 65 72 72 6f 72 28   zErr = dlerror(
31c50 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 7b  );.  if( zErr ){
31c60 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
31c70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66  rintf(nBuf, zBuf
31c80 4f 75 74 2c 20 22 25 73 22 2c 20 7a 45 72 72 29  Out, "%s", zErr)
31c90 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76  ;.  }.  unixLeav
31ca0 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 73 74 61 74  eMutex();.}.stat
31cb0 69 63 20 76 6f 69 64 20 28 2a 75 6e 69 78 44 6c  ic void (*unixDl
31cc0 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20  Sym(sqlite3_vfs 
31cd0 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a  *NotUsed, void *
31ce0 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 7a 53  p, const char*zS
31cf0 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20 2f 2a  ym))(void){.  /*
31d00 20 0a 20 20 2a 2a 20 47 43 43 20 77 69 74 68 20   .  ** GCC with 
31d10 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73  -pedantic-errors
31d20 20 73 61 79 73 20 74 68 61 74 20 43 39 30 20 64   says that C90 d
31d30 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20  oes not allow a 
31d40 76 6f 69 64 2a 20 74 6f 20 62 65 0a 20 20 2a 2a  void* to be.  **
31d50 20 63 61 73 74 20 69 6e 74 6f 20 61 20 70 6f 69   cast into a poi
31d60 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
31d70 6f 6e 2e 20 20 41 6e 64 20 79 65 74 20 74 68 65  on.  And yet the
31d80 20 6c 69 62 72 61 72 79 20 64 6c 73 79 6d 28 29   library dlsym()
31d90 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 72 65   routine.  ** re
31da0 74 75 72 6e 73 20 61 20 76 6f 69 64 2a 20 77 68  turns a void* wh
31db0 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ich is really a 
31dc0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
31dd0 63 74 69 6f 6e 2e 20 20 53 6f 20 68 6f 77 20 64  ction.  So how d
31de0 6f 20 77 65 0a 20 20 2a 2a 20 75 73 65 20 64 6c  o we.  ** use dl
31df0 73 79 6d 28 29 20 77 69 74 68 20 2d 70 65 64 61  sym() with -peda
31e00 6e 74 69 63 2d 65 72 72 6f 72 73 3f 0a 20 20 2a  ntic-errors?.  *
31e10 2a 0a 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20  *.  ** Variable 
31e20 78 20 62 65 6c 6f 77 20 69 73 20 64 65 66 69 6e  x below is defin
31e30 65 64 20 74 6f 20 62 65 20 61 20 70 6f 69 6e 74  ed to be a point
31e40 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
31e50 20 74 61 6b 69 6e 67 0a 20 20 2a 2a 20 70 61 72   taking.  ** par
31e60 61 6d 65 74 65 72 73 20 76 6f 69 64 2a 20 61 6e  ameters void* an
31e70 64 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 61 6e  d const char* an
31e80 64 20 72 65 74 75 72 6e 69 6e 67 20 61 20 70 6f  d returning a po
31e90 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
31ea0 69 6f 6e 2e 0a 20 20 2a 2a 20 57 65 20 69 6e 69  ion..  ** We ini
31eb0 74 69 61 6c 69 7a 65 20 78 20 62 79 20 61 73 73  tialize x by ass
31ec0 69 67 6e 69 6e 67 20 69 74 20 61 20 70 6f 69 6e  igning it a poin
31ed0 74 65 72 20 74 6f 20 74 68 65 20 64 6c 73 79 6d  ter to the dlsym
31ee0 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a  () function..  *
31ef0 2a 20 28 54 68 61 74 20 61 73 73 69 67 6e 6d 65  * (That assignme
31f00 6e 74 20 72 65 71 75 69 72 65 73 20 61 20 63 61  nt requires a ca
31f10 73 74 2e 29 20 20 54 68 65 6e 20 77 65 20 63 61  st.)  Then we ca
31f20 6c 6c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  ll the function 
31f30 74 68 61 74 0a 20 20 2a 2a 20 78 20 70 6f 69 6e  that.  ** x poin
31f40 74 73 20 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20  ts to.  .  **.  
31f50 2a 2a 20 54 68 69 73 20 77 6f 72 6b 2d 61 72 6f  ** This work-aro
31f60 75 6e 64 20 69 73 20 75 6e 6c 69 6b 65 6c 79 20  und is unlikely 
31f70 74 6f 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c  to work correctl
31f80 79 20 6f 6e 20 61 6e 79 20 73 79 73 74 65 6d 20  y on any system 
31f90 77 68 65 72 65 0a 20 20 2a 2a 20 79 6f 75 20 72  where.  ** you r
31fa0 65 61 6c 6c 79 20 63 61 6e 6e 6f 74 20 63 61 73  eally cannot cas
31fb0 74 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69  t a function poi
31fc0 6e 74 65 72 20 69 6e 74 6f 20 76 6f 69 64 2a 2e  nter into void*.
31fd0 20 20 42 75 74 20 74 68 65 6e 2c 20 6f 6e 20 74    But then, on t
31fe0 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 68 61  he.  ** other ha
31ff0 6e 64 2c 20 64 6c 73 79 6d 28 29 20 77 69 6c 6c  nd, dlsym() will
32000 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 73 75 63   not work on suc
32010 68 20 61 20 73 79 73 74 65 6d 20 65 69 74 68 65  h a system eithe
32020 72 2c 20 73 6f 20 77 65 20 68 61 76 65 0a 20 20  r, so we have.  
32030 2a 2a 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6c 6f  ** not really lo
32040 73 74 20 61 6e 79 74 68 69 6e 67 2e 0a 20 20 2a  st anything..  *
32050 2f 0a 20 20 76 6f 69 64 20 28 2a 28 2a 78 29 28  /.  void (*(*x)(
32060 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72  void*,const char
32070 2a 29 29 28 76 6f 69 64 29 3b 0a 20 20 55 4e 55  *))(void);.  UNU
32080 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
32090 74 55 73 65 64 29 3b 0a 20 20 78 20 3d 20 28 76  tUsed);.  x = (v
320a0 6f 69 64 28 2a 28 2a 29 28 76 6f 69 64 2a 2c 63  oid(*(*)(void*,c
320b0 6f 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69  onst char*))(voi
320c0 64 29 29 64 6c 73 79 6d 3b 0a 20 20 72 65 74 75  d))dlsym;.  retu
320d0 72 6e 20 28 2a 78 29 28 70 2c 20 7a 53 79 6d 29  rn (*x)(p, zSym)
320e0 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
320f0 75 6e 69 78 44 6c 43 6c 6f 73 65 28 73 71 6c 69  unixDlClose(sqli
32100 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
32110 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29  , void *pHandle)
32120 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
32130 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
32140 20 64 6c 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65   dlclose(pHandle
32150 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66  );.}.#else /* if
32160 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
32170 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64  D_EXTENSION is d
32180 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65  efined: */.  #de
32190 66 69 6e 65 20 75 6e 69 78 44 6c 4f 70 65 6e 20  fine unixDlOpen 
321a0 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69   0.  #define uni
321b0 78 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65  xDlError 0.  #de
321c0 66 69 6e 65 20 75 6e 69 78 44 6c 53 79 6d 20 20  fine unixDlSym  
321d0 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69   0.  #define uni
321e0 78 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69  xDlClose 0.#endi
321f0 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e  f../*.** Write n
32200 42 75 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e  Buf bytes of ran
32210 64 6f 6d 20 64 61 74 61 20 74 6f 20 74 68 65 20  dom data to the 
32220 73 75 70 70 6c 69 65 64 20 62 75 66 66 65 72 20  supplied buffer 
32230 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zBuf..*/.static 
32240 69 6e 74 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65  int unixRandomne
32250 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ss(sqlite3_vfs *
32260 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75  NotUsed, int nBu
32270 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
32280 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
32290 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 61  ER(NotUsed);.  a
322a0 73 73 65 72 74 28 28 73 69 7a 65 5f 74 29 6e 42  ssert((size_t)nB
322b0 75 66 3e 3d 28 73 69 7a 65 6f 66 28 74 69 6d 65  uf>=(sizeof(time
322c0 5f 74 29 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29  _t)+sizeof(int))
322d0 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65  );..  /* We have
322e0 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a   to initialize z
322f0 42 75 66 20 74 6f 20 70 72 65 76 65 6e 74 20 76  Buf to prevent v
32300 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72 65 70  algrind from rep
32310 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f  orting.  ** erro
32320 72 73 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73  rs.  The reports
32330 20 69 73 73 75 65 64 20 62 79 20 76 61 6c 67 72   issued by valgr
32340 69 6e 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63  ind are incorrec
32350 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a  t - we would.  *
32360 2a 20 70 72 65 66 65 72 20 74 68 61 74 20 74 68  * prefer that th
32370 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20  e randomness be 
32380 69 6e 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b  increased by mak
32390 69 6e 67 20 75 73 65 20 6f 66 20 74 68 65 0a 20  ing use of the. 
323a0 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   ** uninitialize
323b0 64 20 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20  d space in zBuf 
323c0 2d 20 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65  - but valgrind e
323d0 72 72 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f  rrors tend to wo
323e0 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73  rry.  ** some us
323f0 65 72 73 2e 20 20 52 61 74 68 65 72 20 74 68 61  ers.  Rather tha
32400 6e 20 61 72 67 75 65 2c 20 69 74 20 73 65 65 6d  n argue, it seem
32410 73 20 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f  s easier just to
32420 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a   initialize.  **
32430 20 74 68 65 20 77 68 6f 6c 65 20 61 72 72 61 79   the whole array
32440 20 61 6e 64 20 73 69 6c 65 6e 63 65 20 76 61 6c   and silence val
32450 67 72 69 6e 64 2c 20 65 76 65 6e 20 69 66 20 74  grind, even if t
32460 68 61 74 20 6d 65 61 6e 73 20 6c 65 73 73 20 72  hat means less r
32470 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69  andomness.  ** i
32480 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20 73 65 65  n the random see
32490 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65  d..  **.  ** Whe
324a0 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e 69 74 69  n testing, initi
324b0 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74  alizing zBuf[] t
324c0 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77 65  o zero is all we
324d0 20 64 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e 73   do.  That means
324e0 0a 20 20 2a 2a 20 74 68 61 74 20 77 65 20 61 6c  .  ** that we al
324f0 77 61 79 73 20 75 73 65 20 74 68 65 20 73 61 6d  ways use the sam
32500 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20  e random number 
32510 73 65 71 75 65 6e 63 65 2e 20 20 54 68 69 73 20  sequence.  This 
32520 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 74  makes the.  ** t
32530 65 73 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e  ests repeatable.
32540 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a  .  */.  memset(z
32550 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 20  Buf, 0, nBuf);. 
32560 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 20 3d   randomnessPid =
32570 20 6f 73 47 65 74 70 69 64 28 30 29 3b 20 20 0a   osGetpid(0);  .
32580 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
32590 49 54 45 5f 54 45 53 54 29 20 26 26 20 21 64 65  ITE_TEST) && !de
325a0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
325b0 54 5f 52 41 4e 44 4f 4d 4e 45 53 53 29 0a 20 20  T_RANDOMNESS).  
325c0 7b 0a 20 20 20 20 69 6e 74 20 66 64 2c 20 67 6f  {.    int fd, go
325d0 74 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75  t;.    fd = robu
325e0 73 74 5f 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72  st_open("/dev/ur
325f0 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59  andom", O_RDONLY
32600 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64  , 0);.    if( fd
32610 3c 30 20 29 7b 0a 20 20 20 20 20 20 74 69 6d 65  <0 ){.      time
32620 5f 74 20 74 3b 0a 20 20 20 20 20 20 74 69 6d 65  _t t;.      time
32630 28 26 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  (&t);.      memc
32640 70 79 28 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a  py(zBuf, &t, siz
32650 65 6f 66 28 74 29 29 3b 0a 20 20 20 20 20 20 6d  eof(t));.      m
32660 65 6d 63 70 79 28 26 7a 42 75 66 5b 73 69 7a 65  emcpy(&zBuf[size
32670 6f 66 28 74 29 5d 2c 20 26 72 61 6e 64 6f 6d 6e  of(t)], &randomn
32680 65 73 73 50 69 64 2c 20 73 69 7a 65 6f 66 28 72  essPid, sizeof(r
32690 61 6e 64 6f 6d 6e 65 73 73 50 69 64 29 29 3b 0a  andomnessPid));.
326a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69        assert( si
326b0 7a 65 6f 66 28 74 29 2b 73 69 7a 65 6f 66 28 72  zeof(t)+sizeof(r
326c0 61 6e 64 6f 6d 6e 65 73 73 50 69 64 29 3c 3d 28  andomnessPid)<=(
326d0 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 3b 0a 20  size_t)nBuf );. 
326e0 20 20 20 20 20 6e 42 75 66 20 3d 20 73 69 7a 65       nBuf = size
326f0 6f 66 28 74 29 20 2b 20 73 69 7a 65 6f 66 28 72  of(t) + sizeof(r
32700 61 6e 64 6f 6d 6e 65 73 73 50 69 64 29 3b 0a 20  andomnessPid);. 
32710 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32720 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 52 65 61 64  do{ got = osRead
32730 28 66 64 2c 20 7a 42 75 66 2c 20 6e 42 75 66 29  (fd, zBuf, nBuf)
32740 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74 3c 30 20  ; }while( got<0 
32750 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  && errno==EINTR 
32760 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f  );.      robust_
32770 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c  close(0, fd, __L
32780 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20  INE__);.    }.  
32790 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
327a0 6e 20 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  n nBuf;.}.../*.*
327b0 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69  * Sleep for a li
327c0 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74  ttle while.  Ret
327d0 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  urn the amount o
327e0 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a  f time slept..**
327f0 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   The argument is
32800 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
32810 69 63 72 6f 73 65 63 6f 6e 64 73 20 77 65 20 77  icroseconds we w
32820 61 6e 74 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a  ant to sleep..**
32830 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
32840 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  e is the number 
32850 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20  of microseconds 
32860 6f 66 20 73 6c 65 65 70 20 61 63 74 75 61 6c 6c  of sleep actuall
32870 79 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 66  y.** requested f
32880 72 6f 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69  rom the underlyi
32890 6e 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ng operating sys
328a0 74 65 6d 2c 20 61 20 6e 75 6d 62 65 72 20 77 68  tem, a number wh
328b0 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20  ich.** might be 
328c0 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
328d0 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61 72 67  equal to the arg
328e0 75 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 6c  ument, but not l
328f0 65 73 73 0a 2a 2a 20 74 68 61 6e 20 74 68 65 20  ess.** than the 
32900 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
32910 74 69 63 20 69 6e 74 20 75 6e 69 78 53 6c 65 65  tic int unixSlee
32920 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  p(sqlite3_vfs *N
32930 6f 74 55 73 65 64 2c 20 69 6e 74 20 6d 69 63 72  otUsed, int micr
32940 6f 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20 4f  oseconds){.#if O
32950 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75  S_VXWORKS.  stru
32960 63 74 20 74 69 6d 65 73 70 65 63 20 73 70 3b 0a  ct timespec sp;.
32970 0a 20 20 73 70 2e 74 76 5f 73 65 63 20 3d 20 6d  .  sp.tv_sec = m
32980 69 63 72 6f 73 65 63 6f 6e 64 73 20 2f 20 31 30  icroseconds / 10
32990 30 30 30 30 30 3b 0a 20 20 73 70 2e 74 76 5f 6e  00000;.  sp.tv_n
329a0 73 65 63 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f  sec = (microseco
329b0 6e 64 73 20 25 20 31 30 30 30 30 30 30 29 20 2a  nds % 1000000) *
329c0 20 31 30 30 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65   1000;.  nanosle
329d0 65 70 28 26 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20  ep(&sp, NULL);. 
329e0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
329f0 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
32a00 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64  turn microsecond
32a10 73 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  s;.#elif defined
32a20 28 48 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26  (HAVE_USLEEP) &&
32a30 20 48 41 56 45 5f 55 53 4c 45 45 50 0a 20 20 75   HAVE_USLEEP.  u
32a40 73 6c 65 65 70 28 6d 69 63 72 6f 73 65 63 6f 6e  sleep(microsecon
32a50 64 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ds);.  UNUSED_PA
32a60 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
32a70 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f  ;.  return micro
32a80 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 73 65 0a 20  seconds;.#else. 
32a90 20 69 6e 74 20 73 65 63 6f 6e 64 73 20 3d 20 28   int seconds = (
32aa0 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2b 39 39 39  microseconds+999
32ab0 39 39 39 29 2f 31 30 30 30 30 30 30 3b 0a 20 20  999)/1000000;.  
32ac0 73 6c 65 65 70 28 73 65 63 6f 6e 64 73 29 3b 0a  sleep(seconds);.
32ad0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
32ae0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
32af0 65 74 75 72 6e 20 73 65 63 6f 6e 64 73 2a 31 30  eturn seconds*10
32b00 30 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a  00000;.#endif.}.
32b10 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
32b20 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69  wing variable, i
32b30 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a  f set to a non-z
32b40 65 72 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e  ero value, is in
32b50 74 65 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20  terpreted as.** 
32b60 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  the number of se
32b70 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30  conds since 1970
32b80 20 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20   and is used to 
32b90 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f  set the result o
32ba0 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75  f.** sqlite3OsCu
32bb0 72 72 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69  rrentTime() duri
32bc0 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23  ng testing..*/.#
32bd0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
32be0 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75  T.int sqlite3_cu
32bf0 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20  rrent_time = 0; 
32c00 20 2f 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20   /* Fake system 
32c10 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20  time in seconds 
32c20 73 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23  since 1970. */.#
32c30 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e  endif../*.** Fin
32c40 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  d the current ti
32c50 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c  me (in Universal
32c60 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d   Coordinated Tim
32c70 65 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20  e).  Write into 
32c80 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75  *piNow.** the cu
32c90 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64  rrent time and d
32ca0 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20  ate as a Julian 
32cb0 44 61 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73  Day number times
32cc0 20 38 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e   86_400_000.  In
32cd0 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  .** other words,
32ce0 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e   write into *piN
32cf0 6f 77 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ow the number of
32d00 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69   milliseconds si
32d10 6e 63 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a  nce the Julian.*
32d20 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20  * epoch of noon 
32d30 69 6e 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20  in Greenwich on 
32d40 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31  November 24, 471
32d50 34 20 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20  4 B.C according 
32d60 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70  to the.** prolep
32d70 74 69 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61  tic Gregorian ca
32d80 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  lendar..**.** On
32d90 20 73 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e   success, return
32da0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74   SQLITE_OK.  Ret
32db0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
32dc0 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64   if the time and
32dd0 20 64 61 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74   date .** cannot
32de0 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74   be found..*/.st
32df0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72  atic int unixCur
32e00 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71  rentTimeInt64(sq
32e10 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
32e20 65 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ed, sqlite3_int6
32e30 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 73 74 61  4 *piNow){.  sta
32e40 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
32e50 33 5f 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63  3_int64 unixEpoc
32e60 68 20 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71  h = 24405875*(sq
32e70 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30  lite3_int64)8640
32e80 30 30 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  000;.  int rc = 
32e90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 69 66 20 64  SQLITE_OK;.#if d
32ea0 65 66 69 6e 65 64 28 4e 4f 5f 47 45 54 54 4f 44  efined(NO_GETTOD
32eb0 29 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20  ).  time_t t;.  
32ec0 74 69 6d 65 28 26 74 29 3b 0a 20 20 2a 70 69 4e  time(&t);.  *piN
32ed0 6f 77 20 3d 20 28 28 73 71 6c 69 74 65 33 5f 69  ow = ((sqlite3_i
32ee0 6e 74 36 34 29 74 29 2a 31 30 30 30 20 2b 20 75  nt64)t)*1000 + u
32ef0 6e 69 78 45 70 6f 63 68 3b 0a 23 65 6c 69 66 20  nixEpoch;.#elif 
32f00 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72  OS_VXWORKS.  str
32f10 75 63 74 20 74 69 6d 65 73 70 65 63 20 73 4e 6f  uct timespec sNo
32f20 77 3b 0a 20 20 63 6c 6f 63 6b 5f 67 65 74 74 69  w;.  clock_getti
32f30 6d 65 28 43 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d  me(CLOCK_REALTIM
32f40 45 2c 20 26 73 4e 6f 77 29 3b 0a 20 20 2a 70 69  E, &sNow);.  *pi
32f50 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20  Now = unixEpoch 
32f60 2b 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f  + 1000*(sqlite3_
32f70 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65  int64)sNow.tv_se
32f80 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 6e 73 65 63  c + sNow.tv_nsec
32f90 2f 31 30 30 30 30 30 30 3b 0a 23 65 6c 73 65 0a  /1000000;.#else.
32fa0 20 20 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c    struct timeval
32fb0 20 73 4e 6f 77 3b 0a 20 20 28 76 6f 69 64 29 67   sNow;.  (void)g
32fc0 65 74 74 69 6d 65 6f 66 64 61 79 28 26 73 4e 6f  ettimeofday(&sNo
32fd0 77 2c 20 30 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f  w, 0);  /* Canno
32fe0 74 20 66 61 69 6c 20 67 69 76 65 6e 20 76 61 6c  t fail given val
32ff0 69 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  id arguments */.
33000 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45    *piNow = unixE
33010 70 6f 63 68 20 2b 20 31 30 30 30 2a 28 73 71 6c  poch + 1000*(sql
33020 69 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e  ite3_int64)sNow.
33030 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76  tv_sec + sNow.tv
33040 5f 75 73 65 63 2f 31 30 30 30 3b 0a 23 65 6e 64  _usec/1000;.#end
33050 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
33060 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c  E_TEST.  if( sql
33070 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
33080 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20  e ){.    *piNow 
33090 3d 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f  = 1000*(sqlite3_
330a0 69 6e 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75  int64)sqlite3_cu
330b0 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69  rrent_time + uni
330c0 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64  xEpoch;.  }.#end
330d0 69 66 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  if.  UNUSED_PARA
330e0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
330f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
33100 23 69 66 20 30 20 2f 2a 20 4e 6f 74 20 75 73 65  #if 0 /* Not use
33110 64 20 2a 2f 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  d */./*.** Find 
33120 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
33130 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43   (in Universal C
33140 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29  oordinated Time)
33150 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20  .  Write the.** 
33160 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64  current time and
33170 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61   date as a Julia
33180 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 74  n Day number int
33190 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20  o *prNow and.** 
331a0 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72  return 0.  Retur
331b0 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d 65 20  n 1 if the time 
331c0 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20  and date cannot 
331d0 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  be found..*/.sta
331e0 74 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72  tic int unixCurr
331f0 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f  entTime(sqlite3_
33200 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 64 6f  vfs *NotUsed, do
33210 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20  uble *prNow){.  
33220 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 20  sqlite3_int64 i 
33230 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
33240 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
33250 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 63  R(NotUsed);.  rc
33260 20 3d 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69   = unixCurrentTi
33270 6d 65 49 6e 74 36 34 28 30 2c 20 26 69 29 3b 0a  meInt64(0, &i);.
33280 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34    *prNow = i/864
33290 30 30 30 30 30 2e 30 3b 0a 20 20 72 65 74 75 72  00000.0;.  retur
332a0 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  n rc;.}.#else.# 
332b0 64 65 66 69 6e 65 20 75 6e 69 78 43 75 72 72 65  define unixCurre
332c0 6e 74 54 69 6d 65 20 30 0a 23 65 6e 64 69 66 0a  ntTime 0.#endif.
332d0 0a 23 69 66 20 30 20 20 2f 2a 20 4e 6f 74 20 75  .#if 0  /* Not u
332e0 73 65 64 20 2a 2f 0a 2f 2a 0a 2a 2a 20 57 65 20  sed */./*.** We 
332f0 61 64 64 65 64 20 74 68 65 20 78 47 65 74 4c 61  added the xGetLa
33300 73 74 45 72 72 6f 72 28 29 20 6d 65 74 68 6f 64  stError() method
33310 20 77 69 74 68 20 74 68 65 20 69 6e 74 65 6e 74   with the intent
33320 69 6f 6e 20 6f 66 20 70 72 6f 76 69 64 69 6e 67  ion of providing
33330 0a 2a 2a 20 62 65 74 74 65 72 20 6c 6f 77 2d 6c  .** better low-l
33340 65 76 65 6c 20 65 72 72 6f 72 20 6d 65 73 73 61  evel error messa
33350 67 65 73 20 77 68 65 6e 20 6f 70 65 72 61 74 69  ges when operati
33360 6e 67 2d 73 79 73 74 65 6d 20 70 72 6f 62 6c 65  ng-system proble
33370 6d 73 20 63 6f 6d 65 20 75 70 0a 2a 2a 20 64 75  ms come up.** du
33380 72 69 6e 67 20 53 51 4c 69 74 65 20 6f 70 65 72  ring SQLite oper
33390 61 74 69 6f 6e 2e 20 20 42 75 74 20 73 6f 20 66  ation.  But so f
333a0 61 72 2c 20 6e 6f 6e 65 20 6f 66 20 74 68 61 74  ar, none of that
333b0 20 68 61 73 20 62 65 65 6e 20 69 6d 70 6c 65 6d   has been implem
333c0 65 6e 74 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  ented.** in the 
333d0 63 6f 72 65 2e 20 20 53 6f 20 74 68 69 73 20 72  core.  So this r
333e0 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20  outine is never 
333f0 63 61 6c 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 77  called.  For now
33400 2c 20 69 74 20 69 73 20 6d 65 72 65 6c 79 0a 2a  , it is merely.*
33410 2a 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72  * a place-holder
33420 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
33430 75 6e 69 78 47 65 74 4c 61 73 74 45 72 72 6f 72  unixGetLastError
33440 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
33450 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73  tUsed, int NotUs
33460 65 64 32 2c 20 63 68 61 72 20 2a 4e 6f 74 55 73  ed2, char *NotUs
33470 65 64 33 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ed3){.  UNUSED_P
33480 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
33490 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
334a0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 32 29 3b  METER(NotUsed2);
334b0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
334c0 54 45 52 28 4e 6f 74 55 73 65 64 33 29 3b 0a 20  TER(NotUsed3);. 
334d0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6c   return 0;.}.#el
334e0 73 65 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78  se.# define unix
334f0 47 65 74 4c 61 73 74 45 72 72 6f 72 20 30 0a 23  GetLastError 0.#
33500 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a  endif.../*.*****
33510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33520 2a 2a 2a 20 45 6e 64 20 6f 66 20 73 71 6c 69 74  *** End of sqlit
33530 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a  e3_vfs methods *
33540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
33560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
335a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
335b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
335c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
335d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
335e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
335f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
33600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33610 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 50 72 6f  ****** Begin Pro
33620 78 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  xy Locking *****
33630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
33650 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  * Proxy locking 
33660 69 73 20 61 20 22 75 62 65 72 2d 6c 6f 63 6b 69  is a "uber-locki
33670 6e 67 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68  ng-method" in th
33680 69 73 20 73 65 6e 73 65 3a 20 20 49 74 20 75 73  is sense:  It us
33690 65 73 20 74 68 65 0a 2a 2a 20 6f 74 68 65 72 20  es the.** other 
336a0 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20  locking methods 
336b0 6f 6e 20 73 65 63 6f 6e 64 61 72 79 20 6c 6f 63  on secondary loc
336c0 6b 20 66 69 6c 65 73 2e 20 20 50 72 6f 78 79 20  k files.  Proxy 
336d0 6c 6f 63 6b 69 6e 67 20 69 73 20 61 0a 2a 2a 20  locking is a.** 
336e0 6d 65 74 61 2d 6c 61 79 65 72 20 6f 76 65 72 20  meta-layer over 
336f0 74 6f 70 20 6f 66 20 74 68 65 20 70 72 69 6d 69  top of the primi
33700 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70  tive locking imp
33710 6c 65 6d 65 6e 74 65 64 20 61 62 6f 76 65 2e 20  lemented above. 
33720 20 46 6f 72 0a 2a 2a 20 74 68 69 73 20 72 65 61   For.** this rea
33730 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f  son, the divisio
33740 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  n that implement
33750 73 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69  s of proxy locki
33760 6e 67 20 69 73 20 64 65 66 65 72 72 65 64 0a 2a  ng is deferred.*
33770 2a 20 75 6e 74 69 6c 20 6c 61 74 65 20 69 6e 20  * until late in 
33780 74 68 65 20 66 69 6c 65 20 28 68 65 72 65 29 20  the file (here) 
33790 61 66 74 65 72 20 61 6c 6c 20 6f 66 20 74 68 65  after all of the
337a0 20 6f 74 68 65 72 20 49 2f 4f 20 6d 65 74 68 6f   other I/O metho
337b0 64 73 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20  ds have.** been 
337c0 64 65 66 69 6e 65 64 20 2d 20 73 6f 20 74 68 61  defined - so tha
337d0 74 20 74 68 65 20 70 72 69 6d 69 74 69 76 65 20  t the primitive 
337e0 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20  locking methods 
337f0 61 72 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a  are available.**
33800 20 61 73 20 73 65 72 76 69 63 65 73 20 74 6f 20   as services to 
33810 68 65 6c 70 20 77 69 74 68 20 74 68 65 20 69 6d  help with the im
33820 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
33830 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a  proxy locking..*
33840 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65  *.****.**.** The
33850 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67   default locking
33860 20 73 63 68 65 6d 65 73 20 69 6e 20 53 51 4c 69   schemes in SQLi
33870 74 65 20 75 73 65 20 62 79 74 65 2d 72 61 6e 67  te use byte-rang
33880 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 0a 2a  e locks on the.*
33890 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
338a0 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 73 61  to coordinate sa
338b0 66 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20 61  fe, concurrent a
338c0 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c  ccess by multipl
338d0 65 20 72 65 61 64 65 72 73 0a 2a 2a 20 61 6e 64  e readers.** and
338e0 20 77 72 69 74 65 72 73 20 5b 68 74 74 70 3a 2f   writers [http:/
338f0 2f 73 71 6c 69 74 65 2e 6f 72 67 2f 6c 6f 63 6b  /sqlite.org/lock
33900 69 6e 67 76 33 2e 68 74 6d 6c 5d 2e 20 20 54 68  ingv3.html].  Th
33910 65 20 66 69 76 65 20 66 69 6c 65 20 6c 6f 63 6b  e five file lock
33920 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73 20 28 55  ing.** states (U
33930 4e 4c 4f 43 4b 45 44 2c 20 50 45 4e 44 49 4e 47  NLOCKED, PENDING
33940 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52 56  , SHARED, RESERV
33950 45 44 2c 20 45 58 43 4c 55 53 49 56 45 29 20 61  ED, EXCLUSIVE) a
33960 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a  re implemented.*
33970 2a 20 61 73 20 50 4f 53 49 58 20 72 65 61 64 20  * as POSIX read 
33980 26 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 6f 76  & write locks ov
33990 65 72 20 66 69 78 65 64 20 73 65 74 20 6f 66 20  er fixed set of 
339a0 6c 6f 63 61 74 69 6f 6e 73 20 28 76 69 61 20 66  locations (via f
339b0 73 63 74 6c 29 2c 0a 2a 2a 20 6f 6e 20 41 46 50  sctl),.** on AFP
339c0 20 61 6e 64 20 53 4d 42 20 6f 6e 6c 79 20 65 78   and SMB only ex
339d0 63 6c 75 73 69 76 65 20 62 79 74 65 2d 72 61 6e  clusive byte-ran
339e0 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 61 76 61  ge locks are ava
339f0 69 6c 61 62 6c 65 20 76 69 61 20 66 73 63 74 6c  ilable via fsctl
33a00 0a 2a 2a 20 77 69 74 68 20 5f 49 4f 57 52 28 27  .** with _IOWR('
33a10 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42  z', 23, struct B
33a20 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29  yteRangeLockPB2)
33a30 20 74 6f 20 74 72 61 63 6b 20 74 68 65 20 73 61   to track the sa
33a40 6d 65 20 35 20 73 74 61 74 65 73 2e 0a 2a 2a 20  me 5 states..** 
33a50 54 6f 20 73 69 6d 75 6c 61 74 65 20 61 20 46 5f  To simulate a F_
33a60 52 44 4c 43 4b 20 6f 6e 20 74 68 65 20 73 68 61  RDLCK on the sha
33a70 72 65 64 20 72 61 6e 67 65 2c 20 6f 6e 20 41 46  red range, on AF
33a80 50 20 61 20 72 61 6e 64 6f 6d 6c 79 20 73 65 6c  P a randomly sel
33a90 65 63 74 65 64 0a 2a 2a 20 61 64 64 72 65 73 73  ected.** address
33aa0 20 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 72   in the shared r
33ab0 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66 6f  ange is taken fo
33ac0 72 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  r a SHARED lock,
33ad0 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20 73   the entire.** s
33ae0 68 61 72 65 64 20 72 61 6e 67 65 20 69 73 20 74  hared range is t
33af0 61 6b 65 6e 20 66 6f 72 20 61 6e 20 45 58 43 4c  aken for an EXCL
33b00 55 53 49 56 45 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a  USIVE lock):.**.
33b10 2a 2a 20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f  **      PENDING_
33b20 42 59 54 45 20 20 20 20 20 20 20 20 30 78 34 30  BYTE        0x40
33b30 30 30 30 30 30 30 0a 2a 2a 20 20 20 20 20 20 52  000000.**      R
33b40 45 53 45 52 56 45 44 5f 42 59 54 45 20 20 20 20  ESERVED_BYTE    
33b50 20 20 20 30 78 34 30 30 30 30 30 30 31 0a 2a 2a     0x40000001.**
33b60 20 20 20 20 20 20 53 48 41 52 45 44 5f 52 41 4e        SHARED_RAN
33b70 47 45 20 20 20 20 20 20 20 20 30 78 34 30 30 30  GE        0x4000
33b80 30 30 30 32 20 2d 3e 20 30 78 34 30 30 30 30 32  0002 -> 0x400002
33b90 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f  00.**.** This wo
33ba0 72 6b 73 20 77 65 6c 6c 20 6f 6e 20 74 68 65 20  rks well on the 
33bb0 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65  local file syste
33bc0 6d 2c 20 62 75 74 20 73 68 6f 77 73 20 61 20 6e  m, but shows a n
33bd0 65 61 72 6c 79 20 31 30 30 78 0a 2a 2a 20 73 6c  early 100x.** sl
33be0 6f 77 64 6f 77 6e 20 69 6e 20 72 65 61 64 20 70  owdown in read p
33bf0 65 72 66 6f 72 6d 61 6e 63 65 20 6f 6e 20 41 46  erformance on AF
33c00 50 20 62 65 63 61 75 73 65 20 74 68 65 20 41 46  P because the AF
33c10 50 20 63 6c 69 65 6e 74 20 64 69 73 61 62 6c 65  P client disable
33c20 73 0a 2a 2a 20 74 68 65 20 72 65 61 64 20 63 61  s.** the read ca
33c30 63 68 65 20 77 68 65 6e 20 62 79 74 65 2d 72 61  che when byte-ra
33c40 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 70 72  nge locks are pr
33c50 65 73 65 6e 74 2e 20 20 45 6e 61 62 6c 69 6e 67  esent.  Enabling
33c60 20 74 68 65 20 72 65 61 64 0a 2a 2a 20 63 61 63   the read.** cac
33c70 68 65 20 65 78 70 6f 73 65 73 20 61 20 63 61 63  he exposes a cac
33c80 68 65 20 63 6f 68 65 72 65 6e 63 79 20 70 72 6f  he coherency pro
33c90 62 6c 65 6d 20 74 68 61 74 20 69 73 20 70 72 65  blem that is pre
33ca0 73 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f 53 20 58  sent on all OS X
33cb0 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 20 6e 65  .** supported ne
33cc0 74 77 6f 72 6b 20 66 69 6c 65 20 73 79 73 74 65  twork file syste
33cd0 6d 73 2e 20 20 4e 46 53 20 61 6e 64 20 41 46 50  ms.  NFS and AFP
33ce0 20 62 6f 74 68 20 6f 62 73 65 72 76 65 20 74 68   both observe th
33cf0 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f 2d 6f 70  e.** close-to-op
33d00 65 6e 20 73 65 6d 61 6e 74 69 63 73 20 66 6f 72  en semantics for
33d10 20 65 6e 73 75 72 69 6e 67 20 63 61 63 68 65 20   ensuring cache 
33d20 63 6f 68 65 72 65 6e 63 79 0a 2a 2a 20 5b 68 74  coherency.** [ht
33d30 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72 63 65 66  tp://nfs.sourcef
33d40 6f 72 67 65 2e 6e 65 74 2f 23 66 61 71 5f 61 38  orge.net/#faq_a8
33d50 5d 2c 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f  ], which does no
33d60 74 20 65 66 66 65 63 74 69 76 65 6c 79 0a 2a 2a  t effectively.**
33d70 20 61 64 64 72 65 73 73 20 74 68 65 20 72 65 71   address the req
33d80 75 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 63 6f  uirements for co
33d90 6e 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73  ncurrent databas
33da0 65 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74  e access by mult
33db0 69 70 6c 65 0a 2a 2a 20 72 65 61 64 65 72 73 20  iple.** readers 
33dc0 61 6e 64 20 77 72 69 74 65 72 73 0a 2a 2a 20 5b  and writers.** [
33dd0 68 74 74 70 3a 2f 2f 77 77 77 2e 6e 61 62 62 6c  http://www.nabbl
33de0 65 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d 6f 6e 2d  e.com/SQLite-on-
33df0 4e 46 53 2d 63 61 63 68 65 2d 63 6f 68 65 72 65  NFS-cache-cohere
33e00 6e 63 79 2d 74 64 31 35 36 35 35 37 30 31 2e 68  ncy-td15655701.h
33e10 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61  tml]..**.** To a
33e20 64 64 72 65 73 73 20 74 68 65 20 70 65 72 66 6f  ddress the perfo
33e30 72 6d 61 6e 63 65 20 61 6e 64 20 63 61 63 68 65  rmance and cache
33e40 20 63 6f 68 65 72 65 6e 63 79 20 69 73 73 75 65   coherency issue
33e50 73 2c 20 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f  s, proxy file lo
33e60 63 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73  cking.** changes
33e70 20 74 68 65 20 77 61 79 20 64 61 74 61 62 61 73   the way databas
33e80 65 20 61 63 63 65 73 73 20 69 73 20 63 6f 6e 74  e access is cont
33e90 72 6f 6c 6c 65 64 20 62 79 20 6c 69 6d 69 74 69  rolled by limiti
33ea0 6e 67 20 61 63 63 65 73 73 20 74 6f 20 61 0a 2a  ng access to a.*
33eb0 2a 20 73 69 6e 67 6c 65 20 68 6f 73 74 20 61 74  * single host at
33ec0 20 61 20 74 69 6d 65 20 61 6e 64 20 6d 6f 76 69   a time and movi
33ed0 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 6f 66  ng file locks of
33ee0 66 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  f of the databas
33ef0 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 6f 6e  e file.** and on
33f00 74 6f 20 61 20 70 72 6f 78 79 20 66 69 6c 65 20  to a proxy file 
33f10 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c  on the local fil
33f20 65 20 73 79 73 74 65 6d 2e 20 20 0a 2a 2a 0a 2a  e system.  .**.*
33f30 2a 0a 2a 2a 20 55 73 69 6e 67 20 70 72 6f 78 79  *.** Using proxy
33f40 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d   locks.** ------
33f50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a  -----------.**.*
33f60 2a 20 43 20 41 50 49 73 0a 2a 2a 0a 2a 2a 20 20  * C APIs.**.**  
33f70 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
33f80 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c  trol(db, dbname,
33f90 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 45   SQLITE_FCNTL_SE
33fa0 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c  T_LOCKPROXYFILE,
33fb0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
33fc0 20 20 20 20 20 20 20 20 20 20 3c 70 72 6f 78 79            <proxy
33fd0 5f 70 61 74 68 3e 20 7c 20 22 3a 61 75 74 6f 3a  _path> | ":auto:
33fe0 22 29 3b 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f  ");.**  sqlite3_
33ff0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
34000 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f   dbname, SQLITE_
34010 46 43 4e 54 4c 5f 47 45 54 5f 4c 4f 43 4b 50 52  FCNTL_GET_LOCKPR
34020 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20 20 20 20  OXYFILE,.**     
34030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34040 20 20 26 3c 70 72 6f 78 79 5f 70 61 74 68 3e 29    &<proxy_path>)
34050 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 70  ;.**.**.** SQL p
34060 72 61 67 6d 61 73 0a 2a 2a 0a 2a 2a 20 20 50 52  ragmas.**.**  PR
34070 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d  AGMA [database.]
34080 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d  lock_proxy_file=
34090 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 3a  <proxy_path> | :
340a0 61 75 74 6f 3a 0a 2a 2a 20 20 50 52 41 47 4d 41  auto:.**  PRAGMA
340b0 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b   [database.]lock
340c0 5f 70 72 6f 78 79 5f 66 69 6c 65 0a 2a 2a 0a 2a  _proxy_file.**.*
340d0 2a 20 53 70 65 63 69 66 79 69 6e 67 20 22 3a 61  * Specifying ":a
340e0 75 74 6f 3a 22 20 6d 65 61 6e 73 20 74 68 61 74  uto:" means that
340f0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 63   if there is a c
34100 6f 6e 63 68 20 66 69 6c 65 20 77 69 74 68 20 61  onch file with a
34110 20 6d 61 74 63 68 69 6e 67 0a 2a 2a 20 68 6f 73   matching.** hos
34120 74 20 49 44 20 69 6e 20 69 74 2c 20 74 68 65 20  t ID in it, the 
34130 70 72 6f 78 79 20 70 61 74 68 20 69 6e 20 74 68  proxy path in th
34140 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c  e conch file wil
34150 6c 20 62 65 20 75 73 65 64 2c 20 6f 74 68 65 72  l be used, other
34160 77 69 73 65 0a 2a 2a 20 61 20 70 72 6f 78 79 20  wise.** a proxy 
34170 70 61 74 68 20 62 61 73 65 64 20 6f 6e 20 74 68  path based on th
34180 65 20 75 73 65 72 27 73 20 74 65 6d 70 20 64 69  e user's temp di
34190 72 0a 2a 2a 20 28 76 69 61 20 63 6f 6e 66 73 74  r.** (via confst
341a0 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45  r(_CS_DARWIN_USE
341b0 52 5f 54 45 4d 50 5f 44 49 52 2c 2e 2e 2e 29 29  R_TEMP_DIR,...))
341c0 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 61 6e   will be used an
341d0 64 20 74 68 65 0a 2a 2a 20 61 63 74 75 61 6c 20  d the.** actual 
341e0 70 72 6f 78 79 20 66 69 6c 65 20 6e 61 6d 65 20  proxy file name 
341f0 69 73 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f  is generated fro
34200 6d 20 74 68 65 20 6e 61 6d 65 20 61 6e 64 20 70  m the name and p
34210 61 74 68 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ath of the.** da
34220 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 46 6f  tabase file.  Fo
34230 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
34240 20 20 20 20 20 20 20 46 6f 72 20 64 61 74 61 62         For datab
34250 61 73 65 20 70 61 74 68 20 22 2f 55 73 65 72 73  ase path "/Users
34260 2f 6d 65 2f 66 6f 6f 2e 64 62 22 20 0a 2a 2a 20  /me/foo.db" .** 
34270 20 20 20 20 20 20 54 68 65 20 6c 6f 63 6b 20 70        The lock p
34280 61 74 68 20 77 69 6c 6c 20 62 65 20 22 3c 74 6d  ath will be "<tm
34290 70 64 69 72 3e 2f 73 71 6c 69 74 65 70 6c 6f 63  pdir>/sqliteploc
342a0 6b 73 2f 5f 55 73 65 72 73 5f 6d 65 5f 66 6f 6f  ks/_Users_me_foo
342b0 2e 64 62 3a 61 75 74 6f 3a 22 29 0a 2a 2a 0a 2a  .db:auto:").**.*
342c0 2a 20 4f 6e 63 65 20 61 20 6c 6f 63 6b 20 70 72  * Once a lock pr
342d0 6f 78 79 20 69 73 20 63 6f 6e 66 69 67 75 72 65  oxy is configure
342e0 64 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  d for a database
342f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 69 74 20   connection, it 
34300 63 61 6e 20 6e 6f 74 0a 2a 2a 20 62 65 20 72 65  can not.** be re
34310 6d 6f 76 65 64 2c 20 68 6f 77 65 76 65 72 20 69  moved, however i
34320 74 20 6d 61 79 20 62 65 20 73 77 69 74 63 68 65  t may be switche
34330 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  d to a different
34340 20 70 72 6f 78 79 20 70 61 74 68 20 76 69 61 0a   proxy path via.
34350 2a 2a 20 74 68 65 20 61 62 6f 76 65 20 41 50 49  ** the above API
34360 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20  s (assuming the 
34370 63 6f 6e 63 68 20 66 69 6c 65 20 69 73 20 6e 6f  conch file is no
34380 74 20 62 65 69 6e 67 20 68 65 6c 64 20 62 79 20  t being held by 
34390 61 6e 6f 74 68 65 72 0a 2a 2a 20 63 6f 6e 6e 65  another.** conne
343a0 63 74 69 6f 6e 20 6f 72 20 70 72 6f 63 65 73 73  ction or process
343b0 29 2e 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77  ). .**.**.** How
343c0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 77   proxy locking w
343d0 6f 72 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  orks.** --------
343e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
343f0 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 66 69 6c 65  **.** Proxy file
34400 20 6c 6f 63 6b 69 6e 67 20 72 65 6c 69 65 73 20   locking relies 
34410 70 72 69 6d 61 72 69 6c 79 20 6f 6e 20 74 77 6f  primarily on two
34420 20 6e 65 77 20 73 75 70 70 6f 72 74 69 6e 67 20   new supporting 
34430 66 69 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20  files: .**.**   
34440 2a 20 20 63 6f 6e 63 68 20 66 69 6c 65 20 74 6f  *  conch file to
34450 20 6c 69 6d 69 74 20 61 63 63 65 73 73 20 74 6f   limit access to
34460 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
34470 6c 65 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 68  le to a single h
34480 6f 73 74 0a 2a 2a 20 20 20 20 20 20 61 74 20 61  ost.**      at a
34490 20 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 20 20 2a 20   time.**.**   * 
344a0 20 70 72 6f 78 79 20 66 69 6c 65 20 74 6f 20 61   proxy file to a
344b0 63 74 20 61 73 20 61 20 70 72 6f 78 79 20 66 6f  ct as a proxy fo
344c0 72 20 74 68 65 20 61 64 76 69 73 6f 72 79 20 6c  r the advisory l
344d0 6f 63 6b 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a  ocks normally.**
344e0 20 20 20 20 20 20 74 61 6b 65 6e 20 6f 6e 20 74        taken on t
344f0 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a  he database.**.*
34500 2a 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  * The conch file
34510 20 2d 20 74 6f 20 75 73 65 20 61 20 70 72 6f 78   - to use a prox
34520 79 20 66 69 6c 65 2c 20 73 71 6c 69 74 65 20 6d  y file, sqlite m
34530 75 73 74 20 66 69 72 73 74 20 22 68 6f 6c 64 20  ust first "hold 
34540 74 68 65 20 63 6f 6e 63 68 22 0a 2a 2a 20 62 79  the conch".** by
34550 20 74 61 6b 69 6e 67 20 61 6e 20 73 71 6c 69 74   taking an sqlit
34560 65 2d 73 74 79 6c 65 20 73 68 61 72 65 64 20 6c  e-style shared l
34570 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68  ock on the conch
34580 20 66 69 6c 65 2c 20 72 65 61 64 69 6e 67 20 74   file, reading t
34590 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 61  he.** contents a
345a0 6e 64 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65  nd comparing the
345b0 20 68 6f 73 74 27 73 20 75 6e 69 71 75 65 20 68   host's unique h
345c0 6f 73 74 20 49 44 20 28 73 65 65 20 62 65 6c 6f  ost ID (see belo
345d0 77 29 20 61 6e 64 20 6c 6f 63 6b 0a 2a 2a 20 70  w) and lock.** p
345e0 72 6f 78 79 20 70 61 74 68 20 61 67 61 69 6e 73  roxy path agains
345f0 74 20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f  t the values sto
34600 72 65 64 20 69 6e 20 74 68 65 20 63 6f 6e 63 68  red in the conch
34610 2e 20 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c  .  The conch fil
34620 65 20 69 73 0a 2a 2a 20 73 74 6f 72 65 64 20 69  e is.** stored i
34630 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63  n the same direc
34640 74 6f 72 79 20 61 73 20 74 68 65 20 64 61 74 61  tory as the data
34650 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68  base file and th
34660 65 20 66 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 69  e file name.** i
34670 73 20 70 61 74 74 65 72 6e 65 64 20 61 66 74 65  s patterned afte
34680 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  r the database f
34690 69 6c 65 20 6e 61 6d 65 20 61 73 20 22 2e 3c 64  ile name as ".<d
346a0 61 74 61 62 61 73 65 6e 61 6d 65 3e 2d 63 6f 6e  atabasename>-con
346b0 63 68 22 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63  ch"..** If the c
346c0 6f 6e 63 68 20 66 69 6c 65 20 64 6f 65 73 20 6e  onch file does n
346d0 6f 74 20 65 78 69 73 74 2c 20 6f 72 20 69 74 73  ot exist, or its
346e0 20 63 6f 6e 74 65 6e 74 73 20 64 6f 20 6e 6f 74   contents do not
346f0 20 6d 61 74 63 68 20 74 68 65 0a 2a 2a 20 68 6f   match the.** ho
34700 73 74 20 49 44 20 61 6e 64 2f 6f 72 20 70 72 6f  st ID and/or pro
34710 78 79 20 70 61 74 68 2c 20 74 68 65 6e 20 74 68  xy path, then th
34720 65 20 6c 6f 63 6b 20 69 73 20 65 73 63 61 6c 61  e lock is escala
34730 74 65 64 20 74 6f 20 61 6e 20 65 78 63 6c 75 73  ted to an exclus
34740 69 76 65 0a 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20  ive.** lock and 
34750 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63  the conch file c
34760 6f 6e 74 65 6e 74 73 20 69 73 20 75 70 64 61 74  ontents is updat
34770 65 64 20 77 69 74 68 20 74 68 65 20 68 6f 73 74  ed with the host
34780 20 49 44 20 61 6e 64 20 70 72 6f 78 79 0a 2a 2a   ID and proxy.**
34790 20 70 61 74 68 20 61 6e 64 20 74 68 65 20 6c 6f   path and the lo
347a0 63 6b 20 69 73 20 64 6f 77 6e 67 72 61 64 65 64  ck is downgraded
347b0 20 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63   to a shared loc
347c0 6b 20 61 67 61 69 6e 2e 20 20 49 66 20 74 68 65  k again.  If the
347d0 20 63 6f 6e 63 68 0a 2a 2a 20 69 73 20 68 65 6c   conch.** is hel
347e0 64 20 62 79 20 61 6e 6f 74 68 65 72 20 70 72 6f  d by another pro
347f0 63 65 73 73 20 28 77 69 74 68 20 61 20 73 68 61  cess (with a sha
34800 72 65 64 20 6c 6f 63 6b 29 2c 20 74 68 65 20 65  red lock), the e
34810 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a  xclusive lock.**
34820 20 77 69 6c 6c 20 66 61 69 6c 20 61 6e 64 20 53   will fail and S
34830 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
34840 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  turned..**.** Th
34850 65 20 70 72 6f 78 79 20 66 69 6c 65 20 2d 20 61  e proxy file - a
34860 20 73 69 6e 67 6c 65 2d 62 79 74 65 20 66 69 6c   single-byte fil
34870 65 20 75 73 65 64 20 66 6f 72 20 61 6c 6c 20 61  e used for all a
34880 64 76 69 73 6f 72 79 20 66 69 6c 65 20 6c 6f 63  dvisory file loc
34890 6b 73 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 74  ks.** normally t
348a0 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  aken on the data
348b0 62 61 73 65 20 66 69 6c 65 2e 20 20 20 54 68 69  base file.   Thi
348c0 73 20 61 6c 6c 6f 77 73 20 66 6f 72 20 73 61 66  s allows for saf
348d0 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 6f 66 20  e sharing.** of 
348e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
348f0 65 20 66 6f 72 20 6d 75 6c 74 69 70 6c 65 20 72  e for multiple r
34900 65 61 64 65 72 73 20 61 6e 64 20 77 72 69 74 65  eaders and write
34910 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a  rs on the same.*
34920 2a 20 68 6f 73 74 20 28 74 68 65 20 63 6f 6e 63  * host (the conc
34930 68 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74  h ensures that t
34940 68 65 79 20 61 6c 6c 20 75 73 65 20 74 68 65 20  hey all use the 
34950 73 61 6d 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20  same local lock 
34960 66 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 71  file)..**.** Req
34970 75 65 73 74 69 6e 67 20 74 68 65 20 6c 6f 63 6b  uesting the lock
34980 20 70 72 6f 78 79 20 64 6f 65 73 20 6e 6f 74 20   proxy does not 
34990 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 61 6b 65  immediately take
349a0 20 74 68 65 20 63 6f 6e 63 68 2c 20 69 74 20 69   the conch, it i
349b0 73 0a 2a 2a 20 6f 6e 6c 79 20 74 61 6b 65 6e 20  s.** only taken 
349c0 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 72  when the first r
349d0 65 71 75 65 73 74 20 74 6f 20 6c 6f 63 6b 20 64  equest to lock d
349e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
349f0 6d 61 64 65 2e 20 20 0a 2a 2a 20 54 68 69 73 20  made.  .** This 
34a00 6d 61 74 63 68 65 73 20 74 68 65 20 73 65 6d 61  matches the sema
34a10 6e 74 69 63 73 20 6f 66 20 74 68 65 20 74 72 61  ntics of the tra
34a20 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67  ditional locking
34a30 20 62 65 68 61 76 69 6f 72 2c 20 77 68 65 72 65   behavior, where
34a40 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 61 20 63 6f  .** opening a co
34a50 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61 20 64 61  nnection to a da
34a60 74 61 62 61 73 65 20 66 69 6c 65 20 64 6f 65 73  tabase file does
34a70 20 6e 6f 74 20 74 61 6b 65 20 61 20 6c 6f 63 6b   not take a lock
34a80 20 6f 6e 20 69 74 2e 0a 2a 2a 20 54 68 65 20 73   on it..** The s
34a90 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 61  hared lock and a
34aa0 6e 20 6f 70 65 6e 20 66 69 6c 65 20 64 65 73 63  n open file desc
34ab0 72 69 70 74 6f 72 20 61 72 65 20 6d 61 69 6e 74  riptor are maint
34ac0 61 69 6e 65 64 20 75 6e 74 69 6c 20 0a 2a 2a 20  ained until .** 
34ad0 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  the connection t
34ae0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  o the database i
34af0 73 20 63 6c 6f 73 65 64 2e 20 0a 2a 2a 0a 2a 2a  s closed. .**.**
34b00 20 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20   The proxy file 
34b10 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c  and the lock fil
34b20 65 20 61 72 65 20 6e 65 76 65 72 20 64 65 6c 65  e are never dele
34b30 74 65 64 20 73 6f 20 74 68 65 79 20 6f 6e 6c 79  ted so they only
34b40 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 63   need.** to be c
34b50 72 65 61 74 65 64 20 74 68 65 20 66 69 72 73 74  reated the first
34b60 20 74 69 6d 65 20 74 68 65 79 20 61 72 65 20 75   time they are u
34b70 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66 69  sed..**.** Confi
34b80 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73  guration options
34b90 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .** ------------
34ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20  ---------.**.** 
34bb0 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50   SQLITE_PREFER_P
34bc0 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a  ROXY_LOCKING.**.
34bd0 2a 2a 20 20 20 20 20 20 20 44 61 74 61 62 61 73  **       Databas
34be0 65 20 66 69 6c 65 73 20 61 63 63 65 73 73 65 64  e files accessed
34bf0 20 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69   on non-local fi
34c00 6c 65 20 73 79 73 74 65 6d 73 20 61 72 65 0a 2a  le systems are.*
34c10 2a 20 20 20 20 20 20 20 61 75 74 6f 6d 61 74 69  *       automati
34c20 63 61 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65 64  cally configured
34c30 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69   for proxy locki
34c40 6e 67 2c 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61  ng, lock files a
34c50 72 65 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65  re.**       name
34c60 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
34c70 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 6c  using the same l
34c80 6f 67 69 63 20 61 73 0a 2a 2a 20 20 20 20 20 20  ogic as.**      
34c90 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 70 72 6f   PRAGMA lock_pro
34ca0 78 79 5f 66 69 6c 65 3d 22 3a 61 75 74 6f 3a 22  xy_file=":auto:"
34cb0 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 53 51 4c 49  .**    .**  SQLI
34cc0 54 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a 2a  TE_PROXY_DEBUG.*
34cd0 2a 0a 2a 2a 20 20 20 20 20 20 20 45 6e 61 62 6c  *.**       Enabl
34ce0 65 73 20 74 68 65 20 6c 6f 67 67 69 6e 67 20 6f  es the logging o
34cf0 66 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  f error messages
34d00 20 64 75 72 69 6e 67 20 68 6f 73 74 20 69 64 20   during host id 
34d10 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 72 65  file.**       re
34d20 74 72 69 65 76 61 6c 20 61 6e 64 20 63 72 65 61  trieval and crea
34d30 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b  tion.**.**  LOCK
34d40 50 52 4f 58 59 44 49 52 0a 2a 2a 0a 2a 2a 20 20  PROXYDIR.**.**  
34d50 20 20 20 20 20 4f 76 65 72 72 69 64 65 73 20 74       Overrides t
34d60 68 65 20 64 65 66 61 75 6c 74 20 64 69 72 65 63  he default direc
34d70 74 6f 72 79 20 75 73 65 64 20 66 6f 72 20 6c 6f  tory used for lo
34d80 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 20 74  ck proxy files t
34d90 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 61 72 65  hat.**       are
34da0 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63   named automatic
34db0 61 6c 6c 79 20 76 69 61 20 74 68 65 20 22 3a 61  ally via the ":a
34dc0 75 74 6f 3a 22 20 73 65 74 74 69 6e 67 0a 2a 2a  uto:" setting.**
34dd0 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 44 45 46 41  .**  SQLITE_DEFA
34de0 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52  ULT_PROXYDIR_PER
34df0 4d 49 53 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20  MISSIONS.**.**  
34e00 20 20 20 20 20 50 65 72 6d 69 73 73 69 6f 6e 73       Permissions
34e10 20 74 6f 20 75 73 65 20 77 68 65 6e 20 63 72 65   to use when cre
34e20 61 74 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72  ating a director
34e30 79 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 68  y for storing th
34e40 65 0a 2a 2a 20 20 20 20 20 20 20 6c 6f 63 6b 20  e.**       lock 
34e50 70 72 6f 78 79 20 66 69 6c 65 73 2c 20 6f 6e 6c  proxy files, onl
34e60 79 20 75 73 65 64 20 77 68 65 6e 20 4c 4f 43 4b  y used when LOCK
34e70 50 52 4f 58 59 44 49 52 20 69 73 20 6e 6f 74 20  PROXYDIR is not 
34e80 73 65 74 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20  set..**    .**  
34e90 20 20 0a 2a 2a 20 41 73 20 6d 65 6e 74 69 6f 6e    .** As mention
34ea0 65 64 20 61 62 6f 76 65 2c 20 77 68 65 6e 20 63  ed above, when c
34eb0 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c  ompiled with SQL
34ec0 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59  ITE_PREFER_PROXY
34ed0 5f 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a 20 73 65 74  _LOCKING,.** set
34ee0 74 69 6e 67 20 74 68 65 20 65 6e 76 69 72 6f 6e  ting the environ
34ef0 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 53 51  ment variable SQ
34f00 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59  LITE_FORCE_PROXY
34f10 5f 4c 4f 43 4b 49 4e 47 20 74 6f 20 31 20 77 69  _LOCKING to 1 wi
34f20 6c 6c 0a 2a 2a 20 66 6f 72 63 65 20 70 72 6f 78  ll.** force prox
34f30 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20  y locking to be 
34f40 75 73 65 64 20 66 6f 72 20 65 76 65 72 79 20 64  used for every d
34f50 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65  atabase file ope
34f60 6e 65 64 2c 20 61 6e 64 20 30 0a 2a 2a 20 77 69  ned, and 0.** wi
34f70 6c 6c 20 66 6f 72 63 65 20 61 75 74 6f 6d 61 74  ll force automat
34f80 69 63 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ic proxy locking
34f90 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64 20   to be disabled 
34fa0 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65  for all database
34fb0 0a 2a 2a 20 66 69 6c 65 73 20 28 65 78 70 6c 69  .** files (expli
34fc0 63 69 74 6c 79 20 63 61 6c 6c 69 6e 67 20 74 68  citly calling th
34fd0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  e SQLITE_FCNTL_S
34fe0 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
34ff0 20 70 72 61 67 6d 61 20 6f 72 0a 2a 2a 20 73 71   pragma or.** sq
35000 6c 69 74 65 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  lite_file_contro
35010 6c 20 41 50 49 20 69 73 20 6e 6f 74 20 61 66 66  l API is not aff
35020 65 63 74 65 64 20 62 79 20 53 51 4c 49 54 45 5f  ected by SQLITE_
35030 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b  FORCE_PROXY_LOCK
35040 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ING)..*/../*.** 
35050 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  Proxy locking is
35060 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
35070 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a 2f 0a 23 69  on MacOSX .*/.#i
35080 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
35090 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
350a0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
350b0 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  YLE../*.** The p
350c0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
350d0 78 74 20 68 61 73 20 74 68 65 20 70 61 74 68 20  xt has the path 
350e0 61 6e 64 20 66 69 6c 65 20 73 74 72 75 63 74 75  and file structu
350f0 72 65 73 20 66 6f 72 20 74 68 65 20 72 65 6d 6f  res for the remo
35100 74 65 20 0a 2a 2a 20 61 6e 64 20 6c 6f 63 61 6c  te .** and local
35110 20 70 72 6f 78 79 20 66 69 6c 65 73 20 69 6e 20   proxy files in 
35120 69 74 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  it.*/.typedef st
35130 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  ruct proxyLockin
35140 67 43 6f 6e 74 65 78 74 20 70 72 6f 78 79 4c 6f  gContext proxyLo
35150 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74  ckingContext;.st
35160 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  ruct proxyLockin
35170 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 75 6e 69  gContext {.  uni
35180 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65  xFile *conchFile
35190 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  ;         /* Ope
351a0 6e 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a  n conch file */.
351b0 20 20 63 68 61 72 20 2a 63 6f 6e 63 68 46 69 6c    char *conchFil
351c0 65 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 2f  ePath;         /
351d0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
351e0 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  nch file */.  un
351f0 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78  ixFile *lockProx
35200 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  y;         /* Op
35210 65 6e 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69  en proxy lock fi
35220 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 6f  le */.  char *lo
35230 63 6b 50 72 6f 78 79 50 61 74 68 3b 20 20 20 20  ckProxyPath;    
35240 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
35250 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66  the proxy lock f
35260 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 64  ile */.  char *d
35270 62 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20  bPath;          
35280 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
35290 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a   the open file *
352a0 2f 0a 20 20 69 6e 74 20 63 6f 6e 63 68 48 65 6c  /.  int conchHel
352b0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
352c0 20 2f 2a 20 31 20 69 66 20 74 68 65 20 63 6f 6e   /* 1 if the con
352d0 63 68 20 69 73 20 68 65 6c 64 2c 20 2d 31 20 69  ch is held, -1 i
352e0 66 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20  f lockless */.  
352f0 69 6e 74 20 6e 46 61 69 6c 73 3b 20 20 20 20 20  int nFails;     
35300 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35310 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 63 68 20  Number of conch 
35320 74 61 6b 69 6e 67 20 66 61 69 6c 75 72 65 73 20  taking failures 
35330 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f 6c 64 4c 6f  */.  void *oldLo
35340 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20  ckingContext;   
35350 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 6f    /* Original lo
35360 63 6b 69 6e 67 63 6f 6e 74 65 78 74 20 74 6f 20  ckingcontext to 
35370 72 65 73 74 6f 72 65 20 6f 6e 20 63 6c 6f 73 65  restore on close
35380 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f   */.  sqlite3_io
35390 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a  _methods const *
353a0 70 4f 6c 64 4d 65 74 68 6f 64 3b 20 20 20 20 20  pOldMethod;     
353b0 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 49 2f 4f 20  /* Original I/O 
353c0 6d 65 74 68 6f 64 73 20 66 6f 72 20 63 6c 6f 73  methods for clos
353d0 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20  e */.};../* .** 
353e0 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66  The proxy lock f
353f0 69 6c 65 20 70 61 74 68 20 66 6f 72 20 74 68 65  ile path for the
35400 20 64 61 74 61 62 61 73 65 20 61 74 20 64 62 50   database at dbP
35410 61 74 68 20 69 73 20 77 72 69 74 74 65 6e 20 69  ath is written i
35420 6e 74 6f 20 6c 50 61 74 68 2c 20 0a 2a 2a 20 77  nto lPath, .** w
35430 68 69 63 68 20 6d 75 73 74 20 70 6f 69 6e 74 20  hich must point 
35440 74 6f 20 76 61 6c 69 64 2c 20 77 72 69 74 61 62  to valid, writab
35450 6c 65 20 6d 65 6d 6f 72 79 20 6c 61 72 67 65 20  le memory large 
35460 65 6e 6f 75 67 68 20 66 6f 72 20 61 20 6d 61 78  enough for a max
35470 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a 2a 20 66 69  Len length.** fi
35480 6c 65 20 70 61 74 68 2e 20 0a 2a 2f 0a 73 74 61  le path. .*/.sta
35490 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74  tic int proxyGet
354a0 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63  LockPath(const c
354b0 68 61 72 20 2a 64 62 50 61 74 68 2c 20 63 68 61  har *dbPath, cha
354c0 72 20 2a 6c 50 61 74 68 2c 20 73 69 7a 65 5f 74  r *lPath, size_t
354d0 20 6d 61 78 4c 65 6e 29 7b 0a 20 20 69 6e 74 20   maxLen){.  int 
354e0 6c 65 6e 3b 0a 20 20 69 6e 74 20 64 62 4c 65 6e  len;.  int dbLen
354f0 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69 66 64  ;.  int i;..#ifd
35500 65 66 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a  ef LOCKPROXYDIR.
35510 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28    len = strlcpy(
35520 6c 50 61 74 68 2c 20 4c 4f 43 4b 50 52 4f 58 59  lPath, LOCKPROXY
35530 44 49 52 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 65  DIR, maxLen);.#e
35540 6c 73 65 0a 23 20 69 66 64 65 66 20 5f 43 53 5f  lse.# ifdef _CS_
35550 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50  DARWIN_USER_TEMP
35560 5f 44 49 52 0a 20 20 7b 0a 20 20 20 20 69 66 28  _DIR.  {.    if(
35570 20 21 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41   !confstr(_CS_DA
35580 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44  RWIN_USER_TEMP_D
35590 49 52 2c 20 6c 50 61 74 68 2c 20 6d 61 78 4c 65  IR, lPath, maxLe
355a0 6e 29 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  n) ){.      OSTR
355b0 41 43 45 28 28 22 47 45 54 4c 4f 43 4b 50 41 54  ACE(("GETLOCKPAT
355c0 48 20 20 66 61 69 6c 65 64 20 25 73 20 65 72 72  H  failed %s err
355d0 6e 6f 3d 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c  no=%d pid=%d\n",
355e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
355f0 6c 50 61 74 68 2c 20 65 72 72 6e 6f 2c 20 6f 73  lPath, errno, os
35600 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20 20 20  Getpid(0)));.   
35610 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
35620 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20  _IOERR_LOCK;.   
35630 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72   }.    len = str
35640 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 73 71 6c  lcat(lPath, "sql
35650 69 74 65 70 6c 6f 63 6b 73 22 2c 20 6d 61 78 4c  iteplocks", maxL
35660 65 6e 29 3b 20 20 20 20 0a 20 20 7d 0a 23 20 65  en);    .  }.# e
35670 6c 73 65 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c  lse.  len = strl
35680 63 70 79 28 6c 50 61 74 68 2c 20 22 2f 74 6d 70  cpy(lPath, "/tmp
35690 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 20 65  /", maxLen);.# e
356a0 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 69  ndif.#endif..  i
356b0 66 28 20 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d 21  f( lPath[len-1]!
356c0 3d 27 2f 27 20 29 7b 0a 20 20 20 20 6c 65 6e 20  ='/' ){.    len 
356d0 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c  = strlcat(lPath,
356e0 20 22 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20   "/", maxLen);. 
356f0 20 7d 0a 20 20 0a 20 20 2f 2a 20 74 72 61 6e 73   }.  .  /* trans
35700 66 6f 72 6d 20 74 68 65 20 64 62 20 70 61 74 68  form the db path
35710 20 74 6f 20 61 20 75 6e 69 71 75 65 20 63 61 63   to a unique cac
35720 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 62 4c  he name */.  dbL
35730 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  en = (int)strlen
35740 28 64 62 50 61 74 68 29 3b 0a 20 20 66 6f 72 28  (dbPath);.  for(
35750 20 69 3d 30 3b 20 69 3c 64 62 4c 65 6e 20 26 26   i=0; i<dbLen &&
35760 20 28 69 2b 6c 65 6e 2b 37 29 3c 28 69 6e 74 29   (i+len+7)<(int)
35770 6d 61 78 4c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20  maxLen; i++){.  
35780 20 20 63 68 61 72 20 63 20 3d 20 64 62 50 61 74    char c = dbPat
35790 68 5b 69 5d 3b 0a 20 20 20 20 6c 50 61 74 68 5b  h[i];.    lPath[
357a0 69 2b 6c 65 6e 5d 20 3d 20 28 63 3d 3d 27 2f 27  i+len] = (c=='/'
357b0 29 3f 27 5f 27 3a 63 3b 0a 20 20 7d 0a 20 20 6c  )?'_':c;.  }.  l
357c0 50 61 74 68 5b 69 2b 6c 65 6e 5d 3d 27 5c 30 27  Path[i+len]='\0'
357d0 3b 0a 20 20 73 74 72 6c 63 61 74 28 6c 50 61 74  ;.  strlcat(lPat
357e0 68 2c 20 22 3a 61 75 74 6f 3a 22 2c 20 6d 61 78  h, ":auto:", max
357f0 4c 65 6e 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  Len);.  OSTRACE(
35800 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 70  ("GETLOCKPATH  p
35810 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25  roxy lock path=%
35820 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 50 61  s pid=%d\n", lPa
35830 74 68 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29  th, osGetpid(0))
35840 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
35850 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 20 2a  TE_OK;.}../* . *
35860 2a 20 43 72 65 61 74 65 73 20 74 68 65 20 6c 6f  * Creates the lo
35870 63 6b 20 66 69 6c 65 20 61 6e 64 20 61 6e 79 20  ck file and any 
35880 6d 69 73 73 69 6e 67 20 64 69 72 65 63 74 6f 72  missing director
35890 69 65 73 20 69 6e 20 6c 6f 63 6b 50 61 74 68 0a  ies in lockPath.
358a0 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70   */.static int p
358b0 72 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b 50 61  roxyCreateLockPa
358c0 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c  th(const char *l
358d0 6f 63 6b 50 61 74 68 29 7b 0a 20 20 69 6e 74 20  ockPath){.  int 
358e0 69 2c 20 6c 65 6e 3b 0a 20 20 63 68 61 72 20 62  i, len;.  char b
358f0 75 66 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a  uf[MAXPATHLEN];.
35900 20 20 69 6e 74 20 73 74 61 72 74 20 3d 20 30 3b    int start = 0;
35910 0a 20 20 0a 20 20 61 73 73 65 72 74 28 6c 6f 63  .  .  assert(loc
35920 6b 50 61 74 68 21 3d 4e 55 4c 4c 29 3b 0a 20 20  kPath!=NULL);.  
35930 2f 2a 20 74 72 79 20 74 6f 20 63 72 65 61 74 65  /* try to create
35940 20 61 6c 6c 20 74 68 65 20 69 6e 74 65 72 6d 65   all the interme
35950 64 69 61 74 65 20 64 69 72 65 63 74 6f 72 69 65  diate directorie
35960 73 20 2a 2f 0a 20 20 6c 65 6e 20 3d 20 28 69 6e  s */.  len = (in
35970 74 29 73 74 72 6c 65 6e 28 6c 6f 63 6b 50 61 74  t)strlen(lockPat
35980 68 29 3b 0a 20 20 62 75 66 5b 30 5d 20 3d 20 6c  h);.  buf[0] = l
35990 6f 63 6b 50 61 74 68 5b 30 5d 3b 0a 20 20 66 6f  ockPath[0];.  fo
359a0 72 28 20 69 3d 31 3b 20 69 3c 6c 65 6e 3b 20 69  r( i=1; i<len; i
359b0 2b 2b 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f  ++ ){.    if( lo
359c0 63 6b 50 61 74 68 5b 69 5d 20 3d 3d 20 27 2f 27  ckPath[i] == '/'
359d0 20 26 26 20 28 69 20 2d 20 73 74 61 72 74 20 3e   && (i - start >
359e0 20 30 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20   0) ){.      /* 
359f0 6f 6e 6c 79 20 6d 6b 64 69 72 20 69 66 20 6c 65  only mkdir if le
35a00 61 66 20 64 69 72 20 21 3d 20 22 2e 22 20 6f 72  af dir != "." or
35a10 20 22 2f 22 20 6f 72 20 22 2e 2e 22 20 2a 2f 0a   "/" or ".." */.
35a20 20 20 20 20 20 20 69 66 28 20 69 2d 73 74 61 72        if( i-star
35a30 74 3e 32 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d  t>2 || (i-start=
35a40 3d 31 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d  =1 && buf[start]
35a50 20 21 3d 20 27 2e 27 20 26 26 20 62 75 66 5b 73   != '.' && buf[s
35a60 74 61 72 74 5d 20 21 3d 20 27 2f 27 29 20 0a 20  tart] != '/') . 
35a70 20 20 20 20 20 20 20 20 7c 7c 20 28 69 2d 73 74          || (i-st
35a80 61 72 74 3d 3d 32 20 26 26 20 62 75 66 5b 73 74  art==2 && buf[st
35a90 61 72 74 5d 20 21 3d 20 27 2e 27 20 26 26 20 62  art] != '.' && b
35aa0 75 66 5b 73 74 61 72 74 2b 31 5d 20 21 3d 20 27  uf[start+1] != '
35ab0 2e 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62  .') ){.        b
35ac0 75 66 5b 69 5d 3d 27 5c 30 27 3b 0a 20 20 20 20  uf[i]='\0';.    
35ad0 20 20 20 20 69 66 28 20 6f 73 4d 6b 64 69 72 28      if( osMkdir(
35ae0 62 75 66 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  buf, SQLITE_DEFA
35af0 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52  ULT_PROXYDIR_PER
35b00 4d 49 53 53 49 4f 4e 53 29 20 29 7b 0a 20 20 20  MISSIONS) ){.   
35b10 20 20 20 20 20 20 20 69 6e 74 20 65 72 72 3d 65         int err=e
35b20 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  rrno;.          
35b30 69 66 28 20 65 72 72 21 3d 45 45 58 49 53 54 20  if( err!=EEXIST 
35b40 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
35b50 4f 53 54 52 41 43 45 28 28 22 43 52 45 41 54 45  OSTRACE(("CREATE
35b60 4c 4f 43 4b 50 41 54 48 20 20 46 41 49 4c 45 44  LOCKPATH  FAILED
35b70 20 63 72 65 61 74 69 6e 67 20 25 73 2c 20 22 0a   creating %s, ".
35b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b90 20 20 20 20 20 22 27 25 73 27 20 70 72 6f 78 79       "'%s' proxy
35ba0 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69   lock path=%s pi
35bb0 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d=%d\n",.       
35bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75                bu
35bd0 66 2c 20 73 74 72 65 72 72 6f 72 28 65 72 72 29  f, strerror(err)
35be0 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 6f 73 47 65  , lockPath, osGe
35bf0 74 70 69 64 28 30 29 29 29 3b 0a 20 20 20 20 20  tpid(0)));.     
35c00 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 65 72         return er
35c10 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  r;.          }. 
35c20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
35c30 0a 20 20 20 20 20 20 73 74 61 72 74 3d 69 2b 31  .      start=i+1
35c40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 75 66 5b  ;.    }.    buf[
35c50 69 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 69 5d  i] = lockPath[i]
35c60 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  ;.  }.  OSTRACE(
35c70 28 22 43 52 45 41 54 45 4c 4f 43 4b 50 41 54 48  ("CREATELOCKPATH
35c80 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74    proxy lock pat
35c90 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 6c  h=%s pid=%d\n",l
35ca0 6f 63 6b 50 61 74 68 2c 6f 73 47 65 74 70 69 64  ockPath,osGetpid
35cb0 28 30 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  (0)));.  return 
35cc0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  0;.}../*.** Crea
35cd0 74 65 20 61 20 6e 65 77 20 56 46 53 20 66 69 6c  te a new VFS fil
35ce0 65 20 64 65 73 63 72 69 70 74 6f 72 20 28 73 74  e descriptor (st
35cf0 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  ored in memory o
35d00 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20  btained from.** 
35d10 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20  sqlite3_malloc) 
35d20 61 6e 64 20 6f 70 65 6e 20 74 68 65 20 66 69 6c  and open the fil
35d30 65 20 6e 61 6d 65 64 20 22 70 61 74 68 22 20 69  e named "path" i
35d40 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  n the file descr
35d50 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  iptor..**.** The
35d60 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f   caller is respo
35d70 6e 73 69 62 6c 65 20 6e 6f 74 20 6f 6e 6c 79 20  nsible not only 
35d80 66 6f 72 20 63 6c 6f 73 69 6e 67 20 74 68 65 20  for closing the 
35d90 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a  file descriptor.
35da0 2a 2a 20 62 75 74 20 61 6c 73 6f 20 66 6f 72 20  ** but also for 
35db0 66 72 65 65 69 6e 67 20 74 68 65 20 6d 65 6d 6f  freeing the memo
35dc0 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
35dd0 74 68 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  th the file desc
35de0 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69  riptor..*/.stati
35df0 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61 74  c int proxyCreat
35e00 65 55 6e 69 78 46 69 6c 65 28 0a 20 20 20 20 63  eUnixFile(.    c
35e10 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c  onst char *path,
35e20 20 20 20 20 20 20 20 20 2f 2a 20 70 61 74 68 20          /* path 
35e30 66 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69 78  for the new unix
35e40 46 69 6c 65 20 2a 2f 0a 20 20 20 20 75 6e 69 78  File */.    unix
35e50 46 69 6c 65 20 2a 2a 70 70 46 69 6c 65 2c 20 20  File **ppFile,  
35e60 20 20 20 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65       /* unixFile
35e70 20 63 72 65 61 74 65 64 20 61 6e 64 20 72 65 74   created and ret
35e80 75 72 6e 65 64 20 62 79 20 72 65 66 20 2a 2f 0a  urned by ref */.
35e90 20 20 20 20 69 6e 74 20 69 73 6c 6f 63 6b 66 69      int islockfi
35ea0 6c 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le           /* 
35eb0 69 66 20 6e 6f 6e 20 7a 65 72 6f 20 6d 69 73 73  if non zero miss
35ec0 69 6e 67 20 64 69 72 73 20 77 69 6c 6c 20 62 65  ing dirs will be
35ed0 20 63 72 65 61 74 65 64 20 2a 2f 0a 29 20 7b 0a   created */.) {.
35ee0 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20    int fd = -1;. 
35ef0 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 3b   unixFile *pNew;
35f00 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
35f10 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6f 70 65  TE_OK;.  int ope
35f20 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20  nFlags = O_RDWR 
35f30 7c 20 4f 5f 43 52 45 41 54 3b 0a 20 20 73 71 6c  | O_CREAT;.  sql
35f40 69 74 65 33 5f 76 66 73 20 64 75 6d 6d 79 56 66  ite3_vfs dummyVf
35f50 73 3b 0a 20 20 69 6e 74 20 74 65 72 72 6e 6f 20  s;.  int terrno 
35f60 3d 20 30 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65  = 0;.  UnixUnuse
35f70 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d 20 4e  dFd *pUnused = N
35f80 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 31 2e 20 66 69  ULL;..  /* 1. fi
35f90 72 73 74 20 74 72 79 20 74 6f 20 6f 70 65 6e 2f  rst try to open/
35fa0 63 72 65 61 74 65 20 74 68 65 20 66 69 6c 65 0a  create the file.
35fb0 20 20 2a 2a 20 32 2e 20 69 66 20 74 68 61 74 20    ** 2. if that 
35fc0 66 61 69 6c 73 2c 20 61 6e 64 20 74 68 69 73 20  fails, and this 
35fd0 69 73 20 61 20 6c 6f 63 6b 20 66 69 6c 65 20 28  is a lock file (
35fe0 6e 6f 74 2d 63 6f 6e 63 68 29 2c 20 74 72 79 20  not-conch), try 
35ff0 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68  creating.  ** th
36000 65 20 70 61 72 65 6e 74 20 64 69 72 65 63 74 6f  e parent directo
36010 72 69 65 73 20 61 6e 64 20 74 68 65 6e 20 74 72  ries and then tr
36020 79 20 61 67 61 69 6e 2e 0a 20 20 2a 2a 20 33 2e  y again..  ** 3.
36030 20 69 66 20 74 68 61 74 20 66 61 69 6c 73 2c 20   if that fails, 
36040 74 72 79 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  try to open the 
36050 66 69 6c 65 20 72 65 61 64 2d 6f 6e 6c 79 0a 20  file read-only. 
36060 20 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 72 65   ** otherwise re
36070 74 75 72 6e 20 42 55 53 59 20 28 69 66 20 6c 6f  turn BUSY (if lo
36080 63 6b 20 66 69 6c 65 29 20 6f 72 20 43 41 4e 54  ck file) or CANT
36090 4f 50 45 4e 20 66 6f 72 20 74 68 65 20 63 6f 6e  OPEN for the con
360a0 63 68 20 66 69 6c 65 0a 20 20 2a 2f 0a 20 20 70  ch file.  */.  p
360b0 55 6e 75 73 65 64 20 3d 20 66 69 6e 64 52 65 75  Unused = findReu
360c0 73 61 62 6c 65 46 64 28 70 61 74 68 2c 20 6f 70  sableFd(path, op
360d0 65 6e 46 6c 61 67 73 29 3b 0a 20 20 69 66 28 20  enFlags);.  if( 
360e0 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 66  pUnused ){.    f
360f0 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b  d = pUnused->fd;
36100 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 55  .  }else{.    pU
36110 6e 75 73 65 64 20 3d 20 73 71 6c 69 74 65 33 5f  nused = sqlite3_
36120 6d 61 6c 6c 6f 63 36 34 28 73 69 7a 65 6f 66 28  malloc64(sizeof(
36130 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20 20  *pUnused));.    
36140 69 66 28 20 21 70 55 6e 75 73 65 64 20 29 7b 0a  if( !pUnused ){.
36150 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
36160 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
36170 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20  .  }.  if( fd<0 
36180 29 7b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75  ){.    fd = robu
36190 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70  st_open(path, op
361a0 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20  enFlags, 0);.   
361b0 20 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   terrno = errno;
361c0 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 26 26  .    if( fd<0 &&
361d0 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 26   errno==ENOENT &
361e0 26 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a  & islockfile ){.
361f0 20 20 20 20 20 20 69 66 28 20 70 72 6f 78 79 43        if( proxyC
36200 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28 70 61  reateLockPath(pa
36210 74 68 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b  th) == SQLITE_OK
36220 20 29 7b 0a 20 20 20 20 20 20 20 20 66 64 20 3d   ){.        fd =
36230 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74   robust_open(pat
36240 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29  h, openFlags, 0)
36250 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
36260 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29    }.  if( fd<0 )
36270 7b 0a 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20  {.    openFlags 
36280 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20  = O_RDONLY;.    
36290 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
362a0 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73  (path, openFlags
362b0 2c 20 30 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f  , 0);.    terrno
362c0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20   = errno;.  }.  
362d0 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
362e0 69 66 28 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29  if( islockfile )
362f0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
36300 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
36310 7d 0a 20 20 20 20 73 77 69 74 63 68 20 28 74 65  }.    switch (te
36320 72 72 6e 6f 29 20 7b 0a 20 20 20 20 20 20 63 61  rrno) {.      ca
36330 73 65 20 45 41 43 43 45 53 3a 0a 20 20 20 20 20  se EACCES:.     
36340 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
36350 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20 63 61 73  _PERM;.      cas
36360 65 20 45 49 4f 3a 20 0a 20 20 20 20 20 20 20 20  e EIO: .        
36370 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
36380 45 52 52 5f 4c 4f 43 4b 3b 20 2f 2a 20 65 76 65  ERR_LOCK; /* eve
36390 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 20 74  n though it is t
363a0 68 65 20 63 6f 6e 63 68 20 2a 2f 0a 20 20 20 20  he conch */.    
363b0 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
363c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
363d0 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
363e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 70      }.  }.  .  p
363f0 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  New = (unixFile 
36400 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
36410 36 34 28 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  64(sizeof(*pNew)
36420 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e  );.  if( pNew==N
36430 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ULL ){.    rc = 
36440 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
36450 20 20 67 6f 74 6f 20 65 6e 64 5f 63 72 65 61 74    goto end_creat
36460 65 5f 70 72 6f 78 79 3b 0a 20 20 7d 0a 20 20 6d  e_proxy;.  }.  m
36470 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73  emset(pNew, 0, s
36480 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29  izeof(unixFile))
36490 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 65 6e 46 6c  ;.  pNew->openFl
364a0 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b  ags = openFlags;
364b0 0a 20 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79  .  memset(&dummy
364c0 56 66 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  Vfs, 0, sizeof(d
364d0 75 6d 6d 79 56 66 73 29 29 3b 0a 20 20 64 75 6d  ummyVfs));.  dum
364e0 6d 79 56 66 73 2e 70 41 70 70 44 61 74 61 20 3d  myVfs.pAppData =
364f0 20 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63   (void*)&autoloc
36500 6b 49 6f 46 69 6e 64 65 72 3b 0a 20 20 64 75 6d  kIoFinder;.  dum
36510 6d 79 56 66 73 2e 7a 4e 61 6d 65 20 3d 20 22 64  myVfs.zName = "d
36520 75 6d 6d 79 22 3b 0a 20 20 70 55 6e 75 73 65 64  ummy";.  pUnused
36530 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 70 55 6e  ->fd = fd;.  pUn
36540 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20 6f 70  used->flags = op
36550 65 6e 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d  enFlags;.  pNew-
36560 3e 70 55 6e 75 73 65 64 20 3d 20 70 55 6e 75 73  >pUnused = pUnus
36570 65 64 3b 0a 20 20 0a 20 20 72 63 20 3d 20 66 69  ed;.  .  rc = fi
36580 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 26 64 75  llInUnixFile(&du
36590 6d 6d 79 56 66 73 2c 20 66 64 2c 20 28 73 71 6c  mmyVfs, fd, (sql
365a0 69 74 65 33 5f 66 69 6c 65 2a 29 70 4e 65 77 2c  ite3_file*)pNew,
365b0 20 70 61 74 68 2c 20 30 29 3b 0a 20 20 69 66 28   path, 0);.  if(
365c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
365d0 7b 0a 20 20 20 20 2a 70 70 46 69 6c 65 20 3d 20  {.    *ppFile = 
365e0 70 4e 65 77 3b 0a 20 20 20 20 72 65 74 75 72 6e  pNew;.    return
365f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
36600 65 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f 78 79  end_create_proxy
36610 3a 20 20 20 20 0a 20 20 72 6f 62 75 73 74 5f 63  :    .  robust_c
36620 6c 6f 73 65 28 70 4e 65 77 2c 20 66 64 2c 20 5f  lose(pNew, fd, _
36630 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 73 71 6c 69  _LINE__);.  sqli
36640 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a  te3_free(pNew);.
36650 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
36660 55 6e 75 73 65 64 29 3b 0a 20 20 72 65 74 75 72  Unused);.  retur
36670 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  n rc;.}..#ifdef 
36680 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 20 73  SQLITE_TEST./* s
36690 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65  imulate multiple
366a0 20 68 6f 73 74 73 20 62 79 20 63 72 65 61 74 69   hosts by creati
366b0 6e 67 20 75 6e 69 71 75 65 20 68 6f 73 74 69 64  ng unique hostid
366c0 20 66 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a 69   file paths */.i
366d0 6e 74 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69  nt sqlite3_hosti
366e0 64 5f 6e 75 6d 20 3d 20 30 3b 0a 23 65 6e 64 69  d_num = 0;.#endi
366f0 66 0a 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59  f..#define PROXY
36700 5f 48 4f 53 54 49 44 4c 45 4e 20 20 20 20 31 36  _HOSTIDLEN    16
36710 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20    /* conch file 
36720 68 6f 73 74 20 69 64 20 6c 65 6e 67 74 68 20 2a  host id length *
36730 2f 0a 0a 23 69 66 64 65 66 20 48 41 56 45 5f 47  /..#ifdef HAVE_G
36740 45 54 48 4f 53 54 55 55 49 44 0a 2f 2a 20 4e 6f  ETHOSTUUID./* No
36750 74 20 61 6c 77 61 79 73 20 64 65 66 69 6e 65 64  t always defined
36760 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 73 20   in the headers 
36770 61 73 20 69 74 20 6f 75 67 68 74 20 74 6f 20 62  as it ought to b
36780 65 20 2a 2f 0a 65 78 74 65 72 6e 20 69 6e 74 20  e */.extern int 
36790 67 65 74 68 6f 73 74 75 75 69 64 28 75 75 69 64  gethostuuid(uuid
367a0 5f 74 20 69 64 2c 20 63 6f 6e 73 74 20 73 74 72  _t id, const str
367b0 75 63 74 20 74 69 6d 65 73 70 65 63 20 2a 77 61  uct timespec *wa
367c0 69 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  it);.#endif../* 
367d0 67 65 74 20 74 68 65 20 68 6f 73 74 20 49 44 20  get the host ID 
367e0 76 69 61 20 67 65 74 68 6f 73 74 75 75 69 64 28  via gethostuuid(
367f0 29 2c 20 70 48 6f 73 74 49 44 20 6d 75 73 74 20  ), pHostID must 
36800 70 6f 69 6e 74 20 74 6f 20 50 52 4f 58 59 5f 48  point to PROXY_H
36810 4f 53 54 49 44 4c 45 4e 20 0a 2a 2a 20 62 79 74  OSTIDLEN .** byt
36820 65 73 20 6f 66 20 77 72 69 74 61 62 6c 65 20 6d  es of writable m
36830 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
36840 20 69 6e 74 20 70 72 6f 78 79 47 65 74 48 6f 73   int proxyGetHos
36850 74 49 44 28 75 6e 73 69 67 6e 65 64 20 63 68 61  tID(unsigned cha
36860 72 20 2a 70 48 6f 73 74 49 44 2c 20 69 6e 74 20  r *pHostID, int 
36870 2a 70 45 72 72 6f 72 29 7b 0a 20 20 61 73 73 65  *pError){.  asse
36880 72 74 28 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c  rt(PROXY_HOSTIDL
36890 45 4e 20 3d 3d 20 73 69 7a 65 6f 66 28 75 75 69  EN == sizeof(uui
368a0 64 5f 74 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28  d_t));.  memset(
368b0 70 48 6f 73 74 49 44 2c 20 30 2c 20 50 52 4f 58  pHostID, 0, PROX
368c0 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b 0a 23 69  Y_HOSTIDLEN);.#i
368d0 66 64 65 66 20 48 41 56 45 5f 47 45 54 48 4f 53  fdef HAVE_GETHOS
368e0 54 55 55 49 44 0a 20 20 7b 0a 20 20 20 20 73 74  TUUID.  {.    st
368f0 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 74 69  ruct timespec ti
36900 6d 65 6f 75 74 20 3d 20 7b 31 2c 20 30 7d 3b 20  meout = {1, 0}; 
36910 2f 2a 20 31 20 73 65 63 20 74 69 6d 65 6f 75 74  /* 1 sec timeout
36920 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 68   */.    if( geth
36930 6f 73 74 75 75 69 64 28 70 48 6f 73 74 49 44 2c  ostuuid(pHostID,
36940 20 26 74 69 6d 65 6f 75 74 29 20 29 7b 0a 20 20   &timeout) ){.  
36950 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72      int err = er
36960 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70  rno;.      if( p
36970 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20  Error ){.       
36980 20 2a 70 45 72 72 6f 72 20 3d 20 65 72 72 3b 0a   *pError = err;.
36990 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
369a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
369b0 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  R;.    }.  }.#el
369c0 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
369d0 4d 45 54 45 52 28 70 45 72 72 6f 72 29 3b 0a 23  METER(pError);.#
369e0 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
369f0 49 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 73 69  ITE_TEST.  /* si
36a00 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65 20  mulate multiple 
36a10 68 6f 73 74 73 20 62 79 20 63 72 65 61 74 69 6e  hosts by creatin
36a20 67 20 75 6e 69 71 75 65 20 68 6f 73 74 69 64 20  g unique hostid 
36a30 66 69 6c 65 20 70 61 74 68 73 20 2a 2f 0a 20 20  file paths */.  
36a40 69 66 28 20 73 71 6c 69 74 65 33 5f 68 6f 73 74  if( sqlite3_host
36a50 69 64 5f 6e 75 6d 20 21 3d 20 30 29 7b 0a 20 20  id_num != 0){.  
36a60 20 20 70 48 6f 73 74 49 44 5b 30 5d 20 3d 20 28    pHostID[0] = (
36a70 63 68 61 72 29 28 70 48 6f 73 74 49 44 5b 30 5d  char)(pHostID[0]
36a80 20 2b 20 28 63 68 61 72 29 28 73 71 6c 69 74 65   + (char)(sqlite
36a90 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 26 20 30  3_hostid_num & 0
36aa0 78 46 46 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  xFF));.  }.#endi
36ab0 66 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51  f.  .  return SQ
36ac0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54  LITE_OK;.}../* T
36ad0 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f  he conch file co
36ae0 6e 74 61 69 6e 73 20 74 68 65 20 68 65 61 64 65  ntains the heade
36af0 72 2c 20 68 6f 73 74 20 69 64 20 61 6e 64 20 6c  r, host id and l
36b00 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 0a 20 2a  ock file path. *
36b10 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f  /.#define PROXY_
36b20 43 4f 4e 43 48 56 45 52 53 49 4f 4e 20 32 20 20  CONCHVERSION 2  
36b30 20 2f 2a 20 31 2d 62 79 74 65 20 68 65 61 64 65   /* 1-byte heade
36b40 72 2c 20 31 36 2d 62 79 74 65 20 68 6f 73 74 20  r, 16-byte host 
36b50 69 64 2c 20 70 61 74 68 20 2a 2f 0a 23 64 65 66  id, path */.#def
36b60 69 6e 65 20 50 52 4f 58 59 5f 48 45 41 44 45 52  ine PROXY_HEADER
36b70 4c 45 4e 20 20 20 20 31 20 20 20 2f 2a 20 63 6f  LEN    1   /* co
36b80 6e 63 68 20 66 69 6c 65 20 68 65 61 64 65 72 20  nch file header 
36b90 6c 65 6e 67 74 68 20 2a 2f 0a 23 64 65 66 69 6e  length */.#defin
36ba0 65 20 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  e PROXY_PATHINDE
36bb0 58 20 20 20 20 28 50 52 4f 58 59 5f 48 45 41 44  X    (PROXY_HEAD
36bc0 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54  ERLEN+PROXY_HOST
36bd0 49 44 4c 45 4e 29 0a 23 64 65 66 69 6e 65 20 50  IDLEN).#define P
36be0 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  ROXY_MAXCONCHLEN
36bf0 20 20 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c    (PROXY_HEADERL
36c00 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c  EN+PROXY_HOSTIDL
36c10 45 4e 2b 4d 41 58 50 41 54 48 4c 45 4e 29 0a 0a  EN+MAXPATHLEN)..
36c20 2f 2a 20 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20  /* .** Takes an 
36c30 6f 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 2c  open conch file,
36c40 20 63 6f 70 69 65 73 20 74 68 65 20 63 6f 6e 74   copies the cont
36c50 65 6e 74 73 20 74 6f 20 61 20 6e 65 77 20 70 61  ents to a new pa
36c60 74 68 20 61 6e 64 20 74 68 65 6e 20 6d 6f 76 65  th and then move
36c70 73 20 0a 2a 2a 20 69 74 20 62 61 63 6b 2e 20 20  s .** it back.  
36c80 54 68 65 20 6e 65 77 6c 79 20 63 72 65 61 74 65  The newly create
36c90 64 20 66 69 6c 65 27 73 20 66 69 6c 65 20 64 65  d file's file de
36ca0 73 63 72 69 70 74 6f 72 20 69 73 20 61 73 73 69  scriptor is assi
36cb0 67 6e 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 63  gned to the.** c
36cc0 6f 6e 63 68 20 66 69 6c 65 20 73 74 72 75 63 74  onch file struct
36cd0 75 72 65 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20  ure and finally 
36ce0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e  the original con
36cf0 63 68 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ch file descript
36d00 6f 72 20 69 73 20 0a 2a 2a 20 63 6c 6f 73 65 64  or is .** closed
36d10 2e 20 20 52 65 74 75 72 6e 73 20 7a 65 72 6f 20  .  Returns zero 
36d20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a  if successful..*
36d30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
36d40 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b  xyBreakConchLock
36d50 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
36d60 2c 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49  , uuid_t myHostI
36d70 44 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69  D){.  proxyLocki
36d80 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
36d90 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  = (proxyLockingC
36da0 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e  ontext *)pFile->
36db0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20  lockingContext; 
36dc0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e  .  unixFile *con
36dd0 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63  chFile = pCtx->c
36de0 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 63 68 61 72  onchFile;.  char
36df0 20 74 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45   tPath[MAXPATHLE
36e00 4e 5d 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 50  N];.  char buf[P
36e10 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  ROXY_MAXCONCHLEN
36e20 5d 3b 0a 20 20 63 68 61 72 20 2a 63 50 61 74 68  ];.  char *cPath
36e30 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69   = pCtx->conchFi
36e40 6c 65 50 61 74 68 3b 0a 20 20 73 69 7a 65 5f 74  lePath;.  size_t
36e50 20 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20 20   readLen = 0;.  
36e60 73 69 7a 65 5f 74 20 70 61 74 68 4c 65 6e 20 3d  size_t pathLen =
36e70 20 30 3b 0a 20 20 63 68 61 72 20 65 72 72 6d 73   0;.  char errms
36e80 67 5b 36 34 5d 20 3d 20 22 22 3b 0a 20 20 69 6e  g[64] = "";.  in
36e90 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 69 6e 74  t fd = -1;.  int
36ea0 20 72 63 20 3d 20 2d 31 3b 0a 20 20 55 4e 55 53   rc = -1;.  UNUS
36eb0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6d 79 48  ED_PARAMETER(myH
36ec0 6f 73 74 49 44 29 3b 0a 0a 20 20 2f 2a 20 63 72  ostID);..  /* cr
36ed0 65 61 74 65 20 61 20 6e 65 77 20 70 61 74 68 20  eate a new path 
36ee0 62 79 20 72 65 70 6c 61 63 65 20 74 68 65 20 74  by replace the t
36ef0 72 61 69 6c 69 6e 67 20 27 2d 63 6f 6e 63 68 27  railing '-conch'
36f00 20 77 69 74 68 20 27 2d 62 72 65 61 6b 27 20 2a   with '-break' *
36f10 2f 0a 20 20 70 61 74 68 4c 65 6e 20 3d 20 73 74  /.  pathLen = st
36f20 72 6c 63 70 79 28 74 50 61 74 68 2c 20 63 50 61  rlcpy(tPath, cPa
36f30 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b  th, MAXPATHLEN);
36f40 0a 20 20 69 66 28 20 70 61 74 68 4c 65 6e 3e 4d  .  if( pathLen>M
36f50 41 58 50 41 54 48 4c 45 4e 20 7c 7c 20 70 61 74  AXPATHLEN || pat
36f60 68 4c 65 6e 3c 36 20 7c 7c 20 0a 20 20 20 20 20  hLen<6 || .     
36f70 28 73 74 72 6c 63 70 79 28 26 74 50 61 74 68 5b  (strlcpy(&tPath[
36f80 70 61 74 68 4c 65 6e 2d 35 5d 2c 20 22 62 72 65  pathLen-5], "bre
36f90 61 6b 22 2c 20 36 29 20 21 3d 20 35 29 20 29 7b  ak", 6) != 5) ){
36fa0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
36fb0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72  rintf(sizeof(err
36fc0 6d 73 67 29 2c 65 72 72 6d 73 67 2c 22 70 61 74  msg),errmsg,"pat
36fd0 68 20 65 72 72 6f 72 20 28 6c 65 6e 20 25 64 29  h error (len %d)
36fe0 22 2c 28 69 6e 74 29 70 61 74 68 4c 65 6e 29 3b  ",(int)pathLen);
36ff0 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72  .    goto end_br
37000 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f  eaklock;.  }.  /
37010 2a 20 72 65 61 64 20 74 68 65 20 63 6f 6e 63 68  * read the conch
37020 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 72 65   content */.  re
37030 61 64 4c 65 6e 20 3d 20 6f 73 50 72 65 61 64 28  adLen = osPread(
37040 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 62 75  conchFile->h, bu
37050 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43  f, PROXY_MAXCONC
37060 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 69 66 28 20  HLEN, 0);.  if( 
37070 72 65 61 64 4c 65 6e 3c 50 52 4f 58 59 5f 50 41  readLen<PROXY_PA
37080 54 48 49 4e 44 45 58 20 29 7b 0a 20 20 20 20 73  THINDEX ){.    s
37090 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
370a0 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 65  sizeof(errmsg),e
370b0 72 72 6d 73 67 2c 22 72 65 61 64 20 65 72 72 6f  rrmsg,"read erro
370c0 72 20 28 6c 65 6e 20 25 64 29 22 2c 28 69 6e 74  r (len %d)",(int
370d0 29 72 65 61 64 4c 65 6e 29 3b 0a 20 20 20 20 67  )readLen);.    g
370e0 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63  oto end_breakloc
370f0 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20 77 72 69 74  k;.  }.  /* writ
37100 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65 20  e it out to the 
37110 74 65 6d 70 6f 72 61 72 79 20 62 72 65 61 6b 20  temporary break 
37120 66 69 6c 65 20 2a 2f 0a 20 20 66 64 20 3d 20 72  file */.  fd = r
37130 6f 62 75 73 74 5f 6f 70 65 6e 28 74 50 61 74 68  obust_open(tPath
37140 2c 20 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41  , (O_RDWR|O_CREA
37150 54 7c 4f 5f 45 58 43 4c 29 2c 20 30 29 3b 0a 20  T|O_EXCL), 0);. 
37160 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
37170 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
37180 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29  f(sizeof(errmsg)
37190 2c 20 65 72 72 6d 73 67 2c 20 22 63 72 65 61 74  , errmsg, "creat
371a0 65 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20  e failed (%d)", 
371b0 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f  errno);.    goto
371c0 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a   end_breaklock;.
371d0 20 20 7d 0a 20 20 69 66 28 20 6f 73 50 77 72 69    }.  if( osPwri
371e0 74 65 28 66 64 2c 20 62 75 66 2c 20 72 65 61 64  te(fd, buf, read
371f0 4c 65 6e 2c 20 30 29 20 21 3d 20 28 73 73 69 7a  Len, 0) != (ssiz
37200 65 5f 74 29 72 65 61 64 4c 65 6e 20 29 7b 0a 20  e_t)readLen ){. 
37210 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
37220 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73  ntf(sizeof(errms
37230 67 29 2c 20 65 72 72 6d 73 67 2c 20 22 77 72 69  g), errmsg, "wri
37240 74 65 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c  te failed (%d)",
37250 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74   errno);.    got
37260 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b  o end_breaklock;
37270 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 6e 61 6d  .  }.  if( renam
37280 65 28 74 50 61 74 68 2c 20 63 50 61 74 68 29 20  e(tPath, cPath) 
37290 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
372a0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65  nprintf(sizeof(e
372b0 72 72 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20  rrmsg), errmsg, 
372c0 22 72 65 6e 61 6d 65 20 66 61 69 6c 65 64 20 28  "rename failed (
372d0 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  %d)", errno);.  
372e0 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b    goto end_break
372f0 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  lock;.  }.  rc =
37300 20 30 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74   0;.  fprintf(st
37310 64 65 72 72 2c 20 22 62 72 6f 6b 65 20 73 74 61  derr, "broke sta
37320 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 5c 6e 22  le lock on %s\n"
37330 2c 20 63 50 61 74 68 29 3b 0a 20 20 72 6f 62 75  , cPath);.  robu
37340 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20  st_close(pFile, 
37350 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 5f 5f  conchFile->h, __
37360 4c 49 4e 45 5f 5f 29 3b 0a 20 20 63 6f 6e 63 68  LINE__);.  conch
37370 46 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20  File->h = fd;.  
37380 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46  conchFile->openF
37390 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20  lags = O_RDWR | 
373a0 4f 5f 43 52 45 41 54 3b 0a 0a 65 6e 64 5f 62 72  O_CREAT;..end_br
373b0 65 61 6b 6c 6f 63 6b 3a 0a 20 20 69 66 28 20 72  eaklock:.  if( r
373c0 63 20 29 7b 0a 20 20 20 20 69 66 28 20 66 64 3e  c ){.    if( fd>
373d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e  =0 ){.      osUn
373e0 6c 69 6e 6b 28 74 50 61 74 68 29 3b 0a 20 20 20  link(tPath);.   
373f0 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
37400 70 46 69 6c 65 2c 20 66 64 2c 20 5f 5f 4c 49 4e  pFile, fd, __LIN
37410 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E__);.    }.    
37420 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
37430 22 66 61 69 6c 65 64 20 74 6f 20 62 72 65 61 6b  "failed to break
37440 20 73 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25   stale lock on %
37450 73 2c 20 25 73 5c 6e 22 2c 20 63 50 61 74 68 2c  s, %s\n", cPath,
37460 20 65 72 72 6d 73 67 29 3b 0a 20 20 7d 0a 20 20   errmsg);.  }.  
37470 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
37480 20 54 61 6b 65 20 74 68 65 20 72 65 71 75 65 73   Take the reques
37490 74 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ted lock on the 
374a0 63 6f 6e 63 68 20 66 69 6c 65 20 61 6e 64 20 62  conch file and b
374b0 72 65 61 6b 20 61 20 73 74 61 6c 65 20 6c 6f 63  reak a stale loc
374c0 6b 20 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73  k if the .** hos
374d0 74 20 69 64 20 6d 61 74 63 68 65 73 2e 0a 2a 2f  t id matches..*/
374e0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
374f0 79 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46  yConchLock(unixF
37500 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 75 69 64  ile *pFile, uuid
37510 5f 74 20 6d 79 48 6f 73 74 49 44 2c 20 69 6e 74  _t myHostID, int
37520 20 6c 6f 63 6b 54 79 70 65 29 7b 0a 20 20 70 72   lockType){.  pr
37530 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
37540 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78 79  t *pCtx = (proxy
37550 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
37560 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
37570 6f 6e 74 65 78 74 3b 20 0a 20 20 75 6e 69 78 46  ontext; .  unixF
37580 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d  ile *conchFile =
37590 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65   pCtx->conchFile
375a0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
375b0 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 54  ITE_OK;.  int nT
375c0 72 69 65 73 20 3d 20 30 3b 0a 20 20 73 74 72 75  ries = 0;.  stru
375d0 63 74 20 74 69 6d 65 73 70 65 63 20 63 6f 6e 63  ct timespec conc
375e0 68 4d 6f 64 54 69 6d 65 3b 0a 20 20 0a 20 20 6d  hModTime;.  .  m
375f0 65 6d 73 65 74 28 26 63 6f 6e 63 68 4d 6f 64 54  emset(&conchModT
37600 69 6d 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63  ime, 0, sizeof(c
37610 6f 6e 63 68 4d 6f 64 54 69 6d 65 29 29 3b 0a 20  onchModTime));. 
37620 20 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 63   do {.    rc = c
37630 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  onchFile->pMetho
37640 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65  d->xLock((sqlite
37650 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c  3_file*)conchFil
37660 65 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20  e, lockType);.  
37670 20 20 6e 54 72 69 65 73 20 2b 2b 3b 0a 20 20 20    nTries ++;.   
37680 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
37690 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 2f 2a  BUSY ){.      /*
376a0 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 66 61 69   If the lock fai
376b0 6c 65 64 20 28 62 75 73 79 29 3a 0a 20 20 20 20  led (busy):.    
376c0 20 20 20 2a 20 31 73 74 20 74 72 79 3a 20 67 65     * 1st try: ge
376d0 74 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 6f  t the mod time o
376e0 66 20 74 68 65 20 63 6f 6e 63 68 2c 20 77 61 69  f the conch, wai
376f0 74 20 30 2e 35 73 20 61 6e 64 20 74 72 79 20 61  t 0.5s and try a
37700 67 61 69 6e 2e 20 0a 20 20 20 20 20 20 20 2a 20  gain. .       * 
37710 32 6e 64 20 74 72 79 3a 20 66 61 69 6c 20 69 66  2nd try: fail if
37720 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 63 68   the mod time ch
37730 61 6e 67 65 64 20 6f 72 20 68 6f 73 74 20 69 64  anged or host id
37740 20 69 73 20 64 69 66 66 65 72 65 6e 74 2c 20 77   is different, w
37750 61 69 74 20 0a 20 20 20 20 20 20 20 2a 20 20 20  ait .       *   
37760 20 20 20 20 20 20 20 20 31 30 20 73 65 63 20 61          10 sec a
37770 6e 64 20 74 72 79 20 61 67 61 69 6e 0a 20 20 20  nd try again.   
37780 20 20 20 20 2a 20 33 72 64 20 74 72 79 3a 20 62      * 3rd try: b
37790 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 75 6e  reak the lock un
377a0 6c 65 73 73 20 74 68 65 20 6d 6f 64 20 74 69 6d  less the mod tim
377b0 65 20 68 61 73 20 63 68 61 6e 67 65 64 2e 0a 20  e has changed.. 
377c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
377d0 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
377e0 20 20 20 20 20 20 69 66 28 20 6f 73 46 73 74 61        if( osFsta
377f0 74 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  t(conchFile->h, 
37800 26 62 75 66 29 20 29 7b 0a 20 20 20 20 20 20 20  &buf) ){.       
37810 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
37820 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20  pFile, errno);. 
37830 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
37840 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b  LITE_IOERR_LOCK;
37850 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a  .      }.      .
37860 20 20 20 20 20 20 69 66 28 20 6e 54 72 69 65 73        if( nTries
37870 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==1 ){.        c
37880 6f 6e 63 68 4d 6f 64 54 69 6d 65 20 3d 20 62 75  onchModTime = bu
37890 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 3b 0a  f.st_mtimespec;.
378a0 20 20 20 20 20 20 20 20 75 73 6c 65 65 70 28 35          usleep(5
378b0 30 30 30 30 30 29 3b 20 2f 2a 20 77 61 69 74 20  00000); /* wait 
378c0 30 2e 35 20 73 65 63 20 61 6e 64 20 74 72 79 20  0.5 sec and try 
378d0 74 68 65 20 6c 6f 63 6b 20 61 67 61 69 6e 2a 2f  the lock again*/
378e0 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
378f0 65 3b 20 20 0a 20 20 20 20 20 20 7d 0a 0a 20 20  e;  .      }..  
37900 20 20 20 20 61 73 73 65 72 74 28 20 6e 54 72 69      assert( nTri
37910 65 73 3e 31 20 29 3b 0a 20 20 20 20 20 20 69 66  es>1 );.      if
37920 28 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74  ( conchModTime.t
37930 76 5f 73 65 63 20 21 3d 20 62 75 66 2e 73 74 5f  v_sec != buf.st_
37940 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f 73 65 63  mtimespec.tv_sec
37950 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 63 6f   || .         co
37960 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76 5f 6e 73  nchModTime.tv_ns
37970 65 63 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69  ec != buf.st_mti
37980 6d 65 73 70 65 63 2e 74 76 5f 6e 73 65 63 20 29  mespec.tv_nsec )
37990 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
379a0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
379b0 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20      }.      .   
379c0 20 20 20 69 66 28 20 6e 54 72 69 65 73 3d 3d 32     if( nTries==2
379d0 20 29 7b 20 20 0a 20 20 20 20 20 20 20 20 63 68   ){  .        ch
379e0 61 72 20 74 42 75 66 5b 50 52 4f 58 59 5f 4d 41  ar tBuf[PROXY_MA
379f0 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20  XCONCHLEN];.    
37a00 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 6f 73      int len = os
37a10 50 72 65 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d  Pread(conchFile-
37a20 3e 68 2c 20 74 42 75 66 2c 20 50 52 4f 58 59 5f  >h, tBuf, PROXY_
37a30 4d 41 58 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b  MAXCONCHLEN, 0);
37a40 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e  .        if( len
37a50 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
37a60 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
37a70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  File, errno);.  
37a80 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
37a90 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
37aa0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
37ab0 20 20 20 20 69 66 28 20 6c 65 6e 3e 50 52 4f 58      if( len>PROX
37ac0 59 5f 50 41 54 48 49 4e 44 45 58 20 26 26 20 74  Y_PATHINDEX && t
37ad0 42 75 66 5b 30 5d 3d 3d 28 63 68 61 72 29 50 52  Buf[0]==(char)PR
37ae0 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e  OXY_CONCHVERSION
37af0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
37b00 64 6f 6e 27 74 20 62 72 65 61 6b 20 74 68 65 20  don't break the 
37b10 6c 6f 63 6b 20 69 66 20 74 68 65 20 68 6f 73 74  lock if the host
37b20 20 69 64 20 64 6f 65 73 6e 27 74 20 6d 61 74 63   id doesn't matc
37b30 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  h */.          i
37b40 66 28 20 30 21 3d 6d 65 6d 63 6d 70 28 26 74 42  f( 0!=memcmp(&tB
37b50 75 66 5b 50 52 4f 58 59 5f 48 45 41 44 45 52 4c  uf[PROXY_HEADERL
37b60 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20 50  EN], myHostID, P
37b70 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 20  ROXY_HOSTIDLEN) 
37b80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
37b90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
37ba0 59 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  Y;.          }. 
37bb0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
37bc0 20 20 20 20 20 20 20 20 2f 2a 20 64 6f 6e 27 74          /* don't
37bd0 20 62 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20   break the lock 
37be0 6f 6e 20 73 68 6f 72 74 20 72 65 61 64 20 6f 72  on short read or
37bf0 20 61 20 76 65 72 73 69 6f 6e 20 6d 69 73 6d 61   a version misma
37c00 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  tch */.         
37c10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
37c20 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  USY;.        }. 
37c30 20 20 20 20 20 20 20 75 73 6c 65 65 70 28 31 30         usleep(10
37c40 30 30 30 30 30 30 29 3b 20 2f 2a 20 77 61 69 74  000000); /* wait
37c50 20 31 30 20 73 65 63 20 61 6e 64 20 74 72 79 20   10 sec and try 
37c60 74 68 65 20 6c 6f 63 6b 20 61 67 61 69 6e 20 2a  the lock again *
37c70 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  /.        contin
37c80 75 65 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20  ue; .      }.   
37c90 20 20 20 0a 20 20 20 20 20 20 61 73 73 65 72 74     .      assert
37ca0 28 20 6e 54 72 69 65 73 3d 3d 33 20 29 3b 0a 20  ( nTries==3 );. 
37cb0 20 20 20 20 20 69 66 28 20 30 3d 3d 70 72 6f 78       if( 0==prox
37cc0 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28  yBreakConchLock(
37cd0 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44 29  pFile, myHostID)
37ce0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
37cf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
37d00 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65      if( lockType
37d10 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
37d20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
37d30 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d   = conchFile->pM
37d40 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71  ethod->xLock((sq
37d50 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63  lite3_file*)conc
37d60 68 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 4c 4f  hFile, SHARED_LO
37d70 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  CK);.        }. 
37d80 20 20 20 20 20 20 20 69 66 28 20 21 72 63 20 29         if( !rc )
37d90 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
37da0 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74   conchFile->pMet
37db0 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69  hod->xLock((sqli
37dc0 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46  te3_file*)conchF
37dd0 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a  ile, lockType);.
37de0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
37df0 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 77 68 69 6c  }.    }.  } whil
37e00 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
37e10 53 59 20 26 26 20 6e 54 72 69 65 73 3c 33 20 29  SY && nTries<3 )
37e20 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63  ;.  .  return rc
37e30 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 73 20 74 68  ;.}../* Takes th
37e40 65 20 63 6f 6e 63 68 20 62 79 20 74 61 6b 69 6e  e conch by takin
37e50 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  g a shared lock 
37e60 61 6e 64 20 72 65 61 64 20 74 68 65 20 63 6f 6e  and read the con
37e70 74 65 6e 74 73 20 63 6f 6e 63 68 2c 20 69 66 20  tents conch, if 
37e80 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 69 73 20  .** lockPath is 
37e90 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 20 68 6f  non-NULL, the ho
37ea0 73 74 20 49 44 20 61 6e 64 20 6c 6f 63 6b 20 66  st ID and lock f
37eb0 69 6c 65 20 70 61 74 68 20 6d 75 73 74 20 6d 61  ile path must ma
37ec0 74 63 68 2e 20 20 41 20 4e 55 4c 4c 20 0a 2a 2a  tch.  A NULL .**
37ed0 20 6c 6f 63 6b 50 61 74 68 20 6d 65 61 6e 73 20   lockPath means 
37ee0 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 50 61 74  that the lockPat
37ef0 68 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 20 66  h in the conch f
37f00 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ile will be used
37f10 20 69 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74   if the .** host
37f20 20 49 44 73 20 6d 61 74 63 68 2c 20 6f 72 20 61   IDs match, or a
37f30 20 6e 65 77 20 6c 6f 63 6b 20 70 61 74 68 20 77   new lock path w
37f40 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64  ill be generated
37f50 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a   automatically .
37f60 2a 2a 20 61 6e 64 20 77 72 69 74 74 65 6e 20 74  ** and written t
37f70 6f 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  o the conch file
37f80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
37f90 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28 75  proxyTakeConch(u
37fa0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
37fb0 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  .  proxyLockingC
37fc0 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28  ontext *pCtx = (
37fd0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
37fe0 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  ext *)pFile->loc
37ff0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20  kingContext; .  
38000 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e  .  if( pCtx->con
38010 63 68 48 65 6c 64 21 3d 30 20 29 7b 0a 20 20 20  chHeld!=0 ){.   
38020 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
38030 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
38040 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46  unixFile *conchF
38050 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63  ile = pCtx->conc
38060 68 46 69 6c 65 3b 0a 20 20 20 20 75 75 69 64 5f  hFile;.    uuid_
38070 74 20 6d 79 48 6f 73 74 49 44 3b 0a 20 20 20 20  t myHostID;.    
38080 69 6e 74 20 70 45 72 72 6f 72 20 3d 20 30 3b 0a  int pError = 0;.
38090 20 20 20 20 63 68 61 72 20 72 65 61 64 42 75 66      char readBuf
380a0 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c  [PROXY_MAXCONCHL
380b0 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20 6c 6f  EN];.    char lo
380c0 63 6b 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45  ckPath[MAXPATHLE
380d0 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 74 65  N];.    char *te
380e0 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20 4e 55 4c  mpLockPath = NUL
380f0 4c 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  L;.    int rc = 
38100 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69  SQLITE_OK;.    i
38110 6e 74 20 63 72 65 61 74 65 43 6f 6e 63 68 20 3d  nt createConch =
38120 20 30 3b 0a 20 20 20 20 69 6e 74 20 68 6f 73 74   0;.    int host
38130 49 64 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20  IdMatch = 0;.   
38140 20 69 6e 74 20 72 65 61 64 4c 65 6e 20 3d 20 30   int readLen = 0
38150 3b 0a 20 20 20 20 69 6e 74 20 74 72 79 4f 6c 64  ;.    int tryOld
38160 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20  LockPath = 0;.  
38170 20 20 69 6e 74 20 66 6f 72 63 65 4e 65 77 4c 6f    int forceNewLo
38180 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20 20 20  ckPath = 0;.    
38190 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54  .    OSTRACE(("T
381a0 41 4b 45 43 4f 4e 43 48 20 20 25 64 20 66 6f 72  AKECONCH  %d for
381b0 20 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 63   %s pid=%d\n", c
381c0 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  onchFile->h,.   
381d0 20 20 20 20 20 20 20 20 20 20 28 70 43 74 78 2d            (pCtx-
381e0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 3f  >lockProxyPath ?
381f0 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79   pCtx->lockProxy
38200 50 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29  Path : ":auto:")
38210 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  ,.             o
38220 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 0a 20  sGetpid(0)));.. 
38230 20 20 20 72 63 20 3d 20 70 72 6f 78 79 47 65 74     rc = proxyGet
38240 48 6f 73 74 49 44 28 6d 79 48 6f 73 74 49 44 2c  HostID(myHostID,
38250 20 26 70 45 72 72 6f 72 29 3b 0a 20 20 20 20 69   &pError);.    i
38260 66 28 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51  f( (rc&0xff)==SQ
38270 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20  LITE_IOERR ){.  
38280 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
38290 6e 6f 28 70 46 69 6c 65 2c 20 70 45 72 72 6f 72  no(pFile, pError
382a0 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  );.      goto en
382b0 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20  d_takeconch;.   
382c0 20 7d 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78   }.    rc = prox
382d0 79 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65  yConchLock(pFile
382e0 2c 20 6d 79 48 6f 73 74 49 44 2c 20 53 48 41 52  , myHostID, SHAR
382f0 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  ED_LOCK);.    if
38300 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
38310 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  ){.      goto en
38320 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20  d_takeconch;.   
38330 20 7d 0a 20 20 20 20 2f 2a 20 72 65 61 64 20 74   }.    /* read t
38340 68 65 20 65 78 69 73 74 69 6e 67 20 63 6f 6e 63  he existing conc
38350 68 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72 65  h file */.    re
38360 61 64 4c 65 6e 20 3d 20 73 65 65 6b 41 6e 64 52  adLen = seekAndR
38370 65 61 64 28 28 75 6e 69 78 46 69 6c 65 2a 29 63  ead((unixFile*)c
38380 6f 6e 63 68 46 69 6c 65 2c 20 30 2c 20 72 65 61  onchFile, 0, rea
38390 64 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43  dBuf, PROXY_MAXC
383a0 4f 4e 43 48 4c 45 4e 29 3b 0a 20 20 20 20 69 66  ONCHLEN);.    if
383b0 28 20 72 65 61 64 4c 65 6e 3c 30 20 29 7b 0a 20  ( readLen<0 ){. 
383c0 20 20 20 20 20 2f 2a 20 49 2f 4f 20 65 72 72 6f       /* I/O erro
383d0 72 3a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74  r: lastErrno set
383e0 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64 20   by seekAndRead 
383f0 2a 2f 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  */.      storeLa
38400 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 63  stErrno(pFile, c
38410 6f 6e 63 68 46 69 6c 65 2d 3e 6c 61 73 74 45 72  onchFile->lastEr
38420 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  rno);.      rc =
38430 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45   SQLITE_IOERR_RE
38440 41 44 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  AD;.      goto e
38450 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20  nd_takeconch;.  
38460 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 61 64    }else if( read
38470 4c 65 6e 3c 3d 28 50 52 4f 58 59 5f 48 45 41 44  Len<=(PROXY_HEAD
38480 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54  ERLEN+PROXY_HOST
38490 49 44 4c 45 4e 29 20 7c 7c 20 0a 20 20 20 20 20  IDLEN) || .     
384a0 20 20 20 20 20 20 20 20 72 65 61 64 42 75 66 5b          readBuf[
384b0 30 5d 21 3d 28 63 68 61 72 29 50 52 4f 58 59 5f  0]!=(char)PROXY_
384c0 43 4f 4e 43 48 56 45 52 53 49 4f 4e 20 29 7b 0a  CONCHVERSION ){.
384d0 20 20 20 20 20 20 2f 2a 20 61 20 73 68 6f 72 74        /* a short
384e0 20 72 65 61 64 20 6f 72 20 76 65 72 73 69 6f 6e   read or version
384f0 20 66 6f 72 6d 61 74 20 6d 69 73 6d 61 74 63 68   format mismatch
38500 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74   means we need t
38510 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 0a  o create a new .
38520 20 20 20 20 20 20 2a 2a 20 63 6f 6e 63 68 20 66        ** conch f
38530 69 6c 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20  ile. .      */. 
38540 20 20 20 20 20 63 72 65 61 74 65 43 6f 6e 63 68       createConch
38550 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
38560 2f 2a 20 69 66 20 74 68 65 20 68 6f 73 74 20 69  /* if the host i
38570 64 20 6d 61 74 63 68 65 73 20 61 6e 64 20 74 68  d matches and th
38580 65 20 6c 6f 63 6b 20 70 61 74 68 20 61 6c 72 65  e lock path alr