/ Hex Artifact Content
Login

Artifact 2b65298be9db161beb0e3ffadc9be0080d51c320:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e 64 61 72  f../*.** standar
0b40: 64 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 2e  d include files.
0b50: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .*/.#include <sy
0b60: 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c  s/types.h>.#incl
0b70: 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e  ude <sys/stat.h>
0b80: 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c  .#include <fcntl
0b90: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e  .h>.#include <un
0ba0: 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  istd.h>.#include
0bb0: 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75   <time.h>.#inclu
0bc0: 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a  de <sys/time.h>.
0bd0: 23 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e  #include <errno.
0be0: 68 3e 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  h>.#if !defined(
0bf0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
0c00: 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   || SQLITE_MAX_M
0c10: 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 69 6e 63  MAP_SIZE>0.# inc
0c20: 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e 2e 68  lude <sys/mman.h
0c30: 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  >.#endif..#if SQ
0c40: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
0c50: 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c  ING_STYLE.# incl
0c60: 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68  ude <sys/ioctl.h
0c70: 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73  >.# include <sys
0c80: 2f 66 69 6c 65 2e 68 3e 0a 23 20 69 6e 63 6c 75  /file.h>.# inclu
0c90: 64 65 20 3c 73 79 73 2f 70 61 72 61 6d 2e 68 3e  de <sys/param.h>
0ca0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
0cb0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
0cc0: 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 64  _STYLE */..#if d
0cd0: 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
0ce0: 29 20 26 26 20 28 28 5f 5f 4d 41 43 5f 4f 53 5f  ) && ((__MAC_OS_
0cf0: 58 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45  X_VERSION_MIN_RE
0d00: 51 55 49 52 45 44 20 3e 20 31 30 35 30 29 20 7c  QUIRED > 1050) |
0d10: 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  | \.            
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
0d30: 5f 5f 49 50 48 4f 4e 45 5f 4f 53 5f 56 45 52 53  __IPHONE_OS_VERS
0d40: 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44  ION_MIN_REQUIRED
0d50: 20 3e 20 32 30 30 30 29 29 0a 23 20 20 69 66 20   > 2000)).#  if 
0d60: 28 21 64 65 66 69 6e 65 64 28 54 41 52 47 45 54  (!defined(TARGET
0d70: 5f 4f 53 5f 45 4d 42 45 44 44 45 44 29 20 7c 7c  _OS_EMBEDDED) ||
0d80: 20 28 54 41 52 47 45 54 5f 4f 53 5f 45 4d 42 45   (TARGET_OS_EMBE
0d90: 44 44 45 44 3d 3d 30 29 29 20 5c 0a 20 20 20 20  DDED==0)) \.    
0da0: 20 20 20 26 26 20 28 21 64 65 66 69 6e 65 64 28     && (!defined(
0db0: 54 41 52 47 45 54 5f 49 50 48 4f 4e 45 5f 53 49  TARGET_IPHONE_SI
0dc0: 4d 55 4c 41 54 4f 52 29 20 7c 7c 20 28 54 41 52  MULATOR) || (TAR
0dd0: 47 45 54 5f 49 50 48 4f 4e 45 5f 53 49 4d 55 4c  GET_IPHONE_SIMUL
0de0: 41 54 4f 52 3d 3d 30 29 29 0a 23 20 20 20 20 64  ATOR==0)).#    d
0df0: 65 66 69 6e 65 20 48 41 56 45 5f 47 45 54 48 4f  efine HAVE_GETHO
0e00: 53 54 55 55 49 44 20 31 0a 23 20 20 65 6c 73 65  STUUID 1.#  else
0e10: 0a 23 20 20 20 20 77 61 72 6e 69 6e 67 20 22 67  .#    warning "g
0e20: 65 74 68 6f 73 74 75 75 69 64 28 29 20 69 73 20  ethostuuid() is 
0e30: 64 69 73 61 62 6c 65 64 2e 22 0a 23 20 20 65 6e  disabled.".#  en
0e40: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  dif.#endif...#if
0e50: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 23 20 69 6e   OS_VXWORKS.# in
0e60: 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c  clude <sys/ioctl
0e70: 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73  .h>.# include <s
0e80: 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20 69 6e  emaphore.h>.# in
0e90: 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e  clude <limits.h>
0ea0: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
0eb0: 57 4f 52 4b 53 20 2a 2f 0a 0a 23 69 66 20 64 65  WORKS */..#if de
0ec0: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0ed0: 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   || SQLITE_ENABL
0ee0: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
0ef0: 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d  # include <sys/m
0f00: 6f 75 6e 74 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a  ount.h>.#endif..
0f10: 23 69 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d  #ifdef HAVE_UTIM
0f20: 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 74 69  E.# include <uti
0f30: 6d 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a  me.h>.#endif../*
0f40: 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75  .** Allowed valu
0f50: 65 73 20 6f 66 20 75 6e 69 78 46 69 6c 65 2e 66  es of unixFile.f
0f60: 73 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e  sFlags.*/.#defin
0f70: 65 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53  e SQLITE_FSFLAGS
0f80: 5f 49 53 5f 4d 53 44 4f 53 20 20 20 20 20 30 78  _IS_MSDOS     0x
0f90: 31 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61  1../*.** If we a
0fa0: 72 65 20 74 6f 20 62 65 20 74 68 72 65 61 64 2d  re to be thread-
0fb0: 73 61 66 65 2c 20 69 6e 63 6c 75 64 65 20 74 68  safe, include th
0fc0: 65 20 70 74 68 72 65 61 64 73 20 68 65 61 64 65  e pthreads heade
0fd0: 72 20 61 6e 64 20 64 65 66 69 6e 65 0a 2a 2a 20  r and define.** 
0fe0: 74 68 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  the SQLITE_UNIX_
0ff0: 54 48 52 45 41 44 53 20 6d 61 63 72 6f 2e 0a 2a  THREADS macro..*
1000: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  /.#if SQLITE_THR
1010: 45 41 44 53 41 46 45 0a 23 20 69 6e 63 6c 75 64  EADSAFE.# includ
1020: 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 20  e <pthread.h>.# 
1030: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 55 4e  define SQLITE_UN
1040: 49 58 5f 54 48 52 45 41 44 53 20 31 0a 23 65 6e  IX_THREADS 1.#en
1050: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75  dif../*.** Defau
1060: 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 77  lt permissions w
1070: 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20 6e  hen creating a n
1080: 65 77 20 66 69 6c 65 0a 2a 2f 0a 23 69 66 6e 64  ew file.*/.#ifnd
1090: 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ef SQLITE_DEFAUL
10a0: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
10b0: 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  NS.# define SQLI
10c0: 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
10d0: 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 36 34 34  PERMISSIONS 0644
10e0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
10f0: 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f  efault permissio
1100: 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ns when creating
1110: 20 61 75 74 6f 20 70 72 6f 78 79 20 64 69 72 0a   auto proxy dir.
1120: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1130: 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44  E_DEFAULT_PROXYD
1140: 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 23  IR_PERMISSIONS.#
1150: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44   define SQLITE_D
1160: 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f  EFAULT_PROXYDIR_
1170: 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 37 35 35  PERMISSIONS 0755
1180: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
1190: 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64  aximum supported
11a0: 20 70 61 74 68 2d 6c 65 6e 67 74 68 2e 0a 2a 2f   path-length..*/
11b0: 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f 50 41 54  .#define MAX_PAT
11c0: 48 4e 41 4d 45 20 35 31 32 0a 0a 2f 2a 20 41 6c  HNAME 512../* Al
11d0: 77 61 79 73 20 63 61 73 74 20 74 68 65 20 67 65  ways cast the ge
11e0: 74 70 69 64 28 29 20 72 65 74 75 72 6e 20 74 79  tpid() return ty
11f0: 70 65 20 66 6f 72 20 63 6f 6d 70 61 74 69 62 69  pe for compatibi
1200: 6c 69 74 79 20 77 69 74 68 0a 2a 2a 20 6b 65 72  lity with.** ker
1210: 6e 65 6c 20 6d 6f 64 75 6c 65 73 20 69 6e 20 56  nel modules in V
1220: 78 57 6f 72 6b 73 2e 20 2a 2f 0a 23 64 65 66 69  xWorks. */.#defi
1230: 6e 65 20 6f 73 47 65 74 70 69 64 28 58 29 20 28  ne osGetpid(X) (
1240: 70 69 64 5f 74 29 67 65 74 70 69 64 28 29 0a 0a  pid_t)getpid()..
1250: 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74 20 74  /*.** Only set t
1260: 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 69 66 20  he lastErrno if 
1270: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  the error code i
1280: 73 20 61 20 72 65 61 6c 20 65 72 72 6f 72 20 61  s a real error a
1290: 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e 6f 72  nd not .** a nor
12a0: 6d 61 6c 20 65 78 70 65 63 74 65 64 20 72 65 74  mal expected ret
12b0: 75 72 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c 49  urn code of SQLI
12c0: 54 45 5f 42 55 53 59 20 6f 72 20 53 51 4c 49 54  TE_BUSY or SQLIT
12d0: 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  E_OK.*/.#define 
12e0: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 78 29  IS_LOCK_ERROR(x)
12f0: 20 20 28 28 78 20 21 3d 20 53 51 4c 49 54 45 5f    ((x != SQLITE_
1300: 4f 4b 29 20 26 26 20 28 78 20 21 3d 20 53 51 4c  OK) && (x != SQL
1310: 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f 2a 20 46  ITE_BUSY))../* F
1320: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
1330: 73 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  s */.typedef str
1340: 75 63 74 20 75 6e 69 78 53 68 6d 20 75 6e 69 78  uct unixShm unix
1350: 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Shm;            
1360: 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
1370: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
1380: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1390: 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 75 6e 69   unixShmNode uni
13a0: 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20  xShmNode;       
13b0: 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* Shared memory
13c0: 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 74 79 70   instance */.typ
13d0: 65 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78  edef struct unix
13e0: 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69 78 49 6e  InodeInfo unixIn
13f0: 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a 20 41 6e  odeInfo;   /* An
1400: 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79 70 65 64   i-node */.typed
1410: 65 66 20 73 74 72 75 63 74 20 55 6e 69 78 55 6e  ef struct UnixUn
1420: 75 73 65 64 46 64 20 55 6e 69 78 55 6e 75 73 65  usedFd UnixUnuse
1430: 64 46 64 3b 20 20 20 20 20 2f 2a 20 41 6e 20 75  dFd;     /* An u
1440: 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
1450: 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  iptor */../*.** 
1460: 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66 74 65 72  Sometimes, after
1470: 20 61 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 69   a file handle i
1480: 73 20 63 6c 6f 73 65 64 20 62 79 20 53 51 4c 69  s closed by SQLi
1490: 74 65 2c 20 74 68 65 20 66 69 6c 65 20 64 65 73  te, the file des
14a0: 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61 6e 6e 6f  criptor.** canno
14b0: 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65  t be closed imme
14c0: 64 69 61 74 65 6c 79 2e 20 49 6e 20 74 68 65 73  diately. In thes
14d0: 65 20 63 61 73 65 73 2c 20 69 6e 73 74 61 6e 63  e cases, instanc
14e0: 65 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  es of the follow
14f0: 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ing.** structure
1500: 20 61 72 65 20 75 73 65 64 20 74 6f 20 73 74 6f   are used to sto
1510: 72 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  re the file desc
1520: 72 69 70 74 6f 72 20 77 68 69 6c 65 20 77 61 69  riptor while wai
1530: 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a 20 6f  ting for an.** o
1540: 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 65 69  pportunity to ei
1550: 74 68 65 72 20 63 6c 6f 73 65 20 6f 72 20 72 65  ther close or re
1560: 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63  use it..*/.struc
1570: 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 7b  t UnixUnusedFd {
1580: 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20  .  int fd;      
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15a0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
15b0: 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 69 6e  to close */.  in
15c0: 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20  t flags;        
15d0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
15e0: 20 74 68 69 73 20 66 69 6c 65 20 64 65 73 63 72   this file descr
15f0: 69 70 74 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  iptor was opened
1600: 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69 78 55   with */.  UnixU
1610: 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 20  nusedFd *pNext; 
1620: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 75       /* Next unu
1630: 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  sed file descrip
1640: 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69 6c 65  tor on same file
1650: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.};../*.** Th
1660: 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  e unixFile struc
1670: 74 75 72 65 20 69 73 20 73 75 62 63 6c 61 73 73  ture is subclass
1680: 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65   of sqlite3_file
1690: 20 73 70 65 63 69 66 69 63 20 74 6f 20 74 68 65   specific to the
16a0: 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69 6d 70   unix.** VFS imp
16b0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a 2f  lementations..*/
16c0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
16d0: 75 6e 69 78 46 69 6c 65 20 75 6e 69 78 46 69 6c  unixFile unixFil
16e0: 65 3b 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69  e;.struct unixFi
16f0: 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  le {.  sqlite3_i
1700: 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20  o_methods const 
1710: 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41 6c  *pMethod;  /* Al
1720: 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20 65  ways the first e
1730: 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ntry */.  sqlite
1740: 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20  3_vfs *pVfs;    
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1760: 20 54 68 65 20 56 46 53 20 74 68 61 74 20 63 72   The VFS that cr
1770: 65 61 74 65 64 20 74 68 69 73 20 75 6e 69 78 46  eated this unixF
1780: 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  ile */.  unixIno
1790: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20  deInfo *pInode; 
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17b0: 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63 6b 73  Info about locks
17c0: 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a   on this inode *
17d0: 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20  /.  int h;      
17e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
1800: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
1810: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
1820: 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20  r eFileLock;    
1830: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
1840: 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65 6c 64  ype of lock held
1850: 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f 0a 20   on this fd */. 
1860: 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20   unsigned short 
1870: 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 3b 20 20  int ctrlFlags;  
1880: 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69 6f 72       /* Behavior
1890: 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58 46 49  al bits.  UNIXFI
18a0: 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20  LE_* flags */.  
18b0: 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20  int lastErrno;  
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d0: 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69 78 20      /* The unix 
18e0: 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73 74 20  errno from last 
18f0: 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 76  I/O error */.  v
1900: 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74  oid *lockingCont
1910: 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
1920: 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20 73 74     /* Locking st
1930: 79 6c 65 20 73 70 65 63 69 66 69 63 20 73 74 61  yle specific sta
1940: 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73  te */.  UnixUnus
1950: 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20  edFd *pUnused;  
1960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1970: 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55 6e 69  re-allocated Uni
1980: 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20 20 63  xUnusedFd */.  c
1990: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
19a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19b0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
19c0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  e file */.  unix
19d0: 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20 20 20  Shm *pShm;      
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f0: 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* Shared memory
1a00: 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72 6d 61   segment informa
1a10: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  tion */.  int sz
1a20: 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20  Chunk;          
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a40: 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46   Configured by F
1a50: 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20  CNTL_CHUNK_SIZE 
1a60: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  */.#if SQLITE_MA
1a70: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
1a80: 69 6e 74 20 6e 46 65 74 63 68 4f 75 74 3b 20 20  int nFetchOut;  
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1ab0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65   outstanding xFe
1ac0: 74 63 68 20 72 65 66 73 20 2a 2f 0a 20 20 73 71  tch refs */.  sq
1ad0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70  lite3_int64 mmap
1ae0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
1af0: 20 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65    /* Usable size
1b00: 20 6f 66 20 6d 61 70 70 69 6e 67 20 61 74 20 70   of mapping at p
1b10: 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73  MapRegion */.  s
1b20: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61  qlite3_int64 mma
1b30: 70 53 69 7a 65 41 63 74 75 61 6c 3b 20 20 20 20  pSizeActual;    
1b40: 20 20 20 2f 2a 20 41 63 74 75 61 6c 20 73 69 7a     /* Actual siz
1b50: 65 20 6f 66 20 6d 61 70 70 69 6e 67 20 61 74 20  e of mapping at 
1b60: 70 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20  pMapRegion */.  
1b70: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d  sqlite3_int64 mm
1b80: 61 70 53 69 7a 65 4d 61 78 3b 20 20 20 20 20 20  apSizeMax;      
1b90: 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65      /* Configure
1ba0: 64 20 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a  d FCNTL_MMAP_SIZ
1bb0: 45 20 76 61 6c 75 65 20 2a 2f 0a 20 20 76 6f 69  E value */.  voi
1bc0: 64 20 2a 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20  d *pMapRegion;  
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be0: 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65   /* Memory mappe
1bf0: 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 23 65 6e 64  d region */.#end
1c00: 69 66 0a 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e  if.#ifdef __QNXN
1c10: 54 4f 5f 5f 0a 20 20 69 6e 74 20 73 65 63 74 6f  TO__.  int secto
1c20: 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
1c30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
1c40: 76 69 63 65 20 73 65 63 74 6f 72 20 73 69 7a 65  vice sector size
1c50: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 76 69 63 65   */.  int device
1c60: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 3b  Characteristics;
1c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
1c80: 63 6f 6d 70 75 74 65 64 20 64 65 76 69 63 65 20  computed device 
1c90: 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
1ca0: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  */.#endif.#if SQ
1cb0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1cc0: 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20  ING_STYLE.  int 
1cd0: 6f 70 65 6e 46 6c 61 67 73 3b 20 20 20 20 20 20  openFlags;      
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf0: 2f 2a 20 54 68 65 20 66 6c 61 67 73 20 73 70 65  /* The flags spe
1d00: 63 69 66 69 65 64 20 61 74 20 6f 70 65 6e 28 29  cified at open()
1d10: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   */.#endif.#if S
1d20: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1d30: 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 64 65  KING_STYLE || de
1d40: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1d50: 0a 20 20 75 6e 73 69 67 6e 65 64 20 66 73 46 6c  .  unsigned fsFl
1d60: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
1d70: 20 20 20 20 20 20 20 2f 2a 20 63 61 63 68 65 64         /* cached
1d80: 20 64 65 74 61 69 6c 73 20 66 72 6f 6d 20 73 74   details from st
1d90: 61 74 66 73 28 29 20 2a 2f 0a 23 65 6e 64 69 66  atfs() */.#endif
1da0: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
1db0: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
1dc0: 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20  FileId *pId;    
1dd0: 20 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20        /* Unique 
1de0: 66 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69  file ID */.#endi
1df0: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
1e00: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 6e  DEBUG.  /* The n
1e10: 65 78 74 20 67 72 6f 75 70 20 6f 66 20 76 61 72  ext group of var
1e20: 69 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20  iables are used 
1e30: 74 6f 20 74 72 61 63 6b 20 77 68 65 74 68 65 72  to track whether
1e40: 20 6f 72 20 6e 6f 74 20 74 68 65 0a 20 20 2a 2a   or not the.  **
1e50: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1e60: 6e 74 65 72 20 69 6e 20 62 79 74 65 73 20 32 34  nter in bytes 24
1e70: 2d 32 37 20 6f 66 20 64 61 74 61 62 61 73 65 20  -27 of database 
1e80: 66 69 6c 65 73 20 61 72 65 20 75 70 64 61 74 65  files are update
1e90: 64 0a 20 20 2a 2a 20 77 68 65 6e 65 76 65 72 20  d.  ** whenever 
1ea0: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
1eb0: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
1ec0: 2e 20 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  .  An assertion 
1ed0: 66 61 75 6c 74 20 77 69 6c 6c 0a 20 20 2a 2a 20  fault will.  ** 
1ee0: 6f 63 63 75 72 20 69 66 20 61 20 66 69 6c 65 20  occur if a file 
1ef0: 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 6f  is updated witho
1f00: 75 74 20 61 6c 73 6f 20 75 70 64 61 74 69 6e 67  ut also updating
1f10: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1f20: 0a 20 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20 20  .  ** counter.  
1f30: 54 68 69 73 20 74 65 73 74 20 69 73 20 6d 61 64  This test is mad
1f40: 65 20 74 6f 20 61 76 6f 69 64 20 6e 65 77 20 70  e to avoid new p
1f50: 72 6f 62 6c 65 6d 73 20 73 69 6d 69 6c 61 72 20  roblems similar 
1f60: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6f 6e 65 20  to the.  ** one 
1f70: 64 65 73 63 72 69 62 65 64 20 62 79 20 74 69 63  described by tic
1f80: 6b 65 74 20 23 33 35 38 34 2e 20 0a 20 20 2a 2f  ket #3584. .  */
1f90: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1fa0: 20 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3b 20   transCntrChng; 
1fb0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
1fc0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1fd0: 6e 74 65 72 20 63 68 61 6e 67 65 64 20 2a 2f 0a  nter changed */.
1fe0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1ff0: 64 62 55 70 64 61 74 65 3b 20 20 20 20 20 20 20  dbUpdate;       
2000: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20   /* True if any 
2010: 70 61 72 74 20 6f 66 20 64 61 74 61 62 61 73 65  part of database
2020: 20 66 69 6c 65 20 63 68 61 6e 67 65 64 20 2a 2f   file changed */
2030: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2040: 20 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3b 20   inNormalWrite; 
2050: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 20    /* True if in 
2060: 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 6f  a normal write o
2070: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 23 65 6e  peration */..#en
2080: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
2090: 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 49 6e 20  TE_TEST.  /* In 
20a0: 74 65 73 74 20 6d 6f 64 65 2c 20 69 6e 63 72 65  test mode, incre
20b0: 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ase the size of 
20c0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 61  this structure a
20d0: 20 62 69 74 20 73 6f 20 74 68 61 74 20 0a 20 20   bit so that .  
20e0: 2a 2a 20 69 74 20 69 73 20 6c 61 72 67 65 72 20  ** it is larger 
20f0: 74 68 61 6e 20 74 68 65 20 73 74 72 75 63 74 20  than the struct 
2100: 43 72 61 73 68 46 69 6c 65 20 64 65 66 69 6e 65  CrashFile define
2110: 64 20 69 6e 20 74 65 73 74 36 2e 63 2e 0a 20 20  d in test6.c..  
2120: 2a 2f 0a 20 20 63 68 61 72 20 61 50 61 64 64 69  */.  char aPaddi
2130: 6e 67 5b 33 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d  ng[32];.#endif.}
2140: 3b 0a 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61  ;../* This varia
2150: 62 6c 65 20 68 6f 6c 64 73 20 74 68 65 20 70 72  ble holds the pr
2160: 6f 63 65 73 73 20 69 64 20 28 70 69 64 29 20 66  ocess id (pid) f
2170: 72 6f 6d 20 77 68 65 6e 20 74 68 65 20 78 52 61  rom when the xRa
2180: 6e 64 6f 6d 6e 65 73 73 28 29 0a 2a 2a 20 6d 65  ndomness().** me
2190: 74 68 6f 64 20 77 61 73 20 63 61 6c 6c 65 64 2e  thod was called.
21a0: 20 20 49 66 20 78 4f 70 65 6e 28 29 20 69 73 20    If xOpen() is 
21b0: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 20 64 69  called from a di
21c0: 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 20  fferent process 
21d0: 69 64 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e  id,.** indicatin
21e0: 67 20 74 68 61 74 20 61 20 66 6f 72 6b 28 29 20  g that a fork() 
21f0: 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 74 68  has occurred, th
2200: 65 20 50 52 4e 47 20 77 69 6c 6c 20 62 65 20 72  e PRNG will be r
2210: 65 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eset..*/.static 
2220: 70 69 64 5f 74 20 72 61 6e 64 6f 6d 6e 65 73 73  pid_t randomness
2230: 50 69 64 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  Pid = 0;../*.** 
2240: 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66  Allowed values f
2250: 6f 72 20 74 68 65 20 75 6e 69 78 46 69 6c 65 2e  or the unixFile.
2260: 63 74 72 6c 46 6c 61 67 73 20 62 69 74 6d 61 73  ctrlFlags bitmas
2270: 6b 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  k:.*/.#define UN
2280: 49 58 46 49 4c 45 5f 45 58 43 4c 20 20 20 20 20  IXFILE_EXCL     
2290: 20 20 20 30 78 30 31 20 20 20 20 20 2f 2a 20 43     0x01     /* C
22a0: 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20  onnections from 
22b0: 6f 6e 65 20 70 72 6f 63 65 73 73 20 6f 6e 6c 79  one process only
22c0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58   */.#define UNIX
22d0: 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20 20 20  FILE_RDONLY     
22e0: 20 30 78 30 32 20 20 20 20 20 2f 2a 20 43 6f 6e   0x02     /* Con
22f0: 6e 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 20  nection is read 
2300: 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20  only */.#define 
2310: 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53 54  UNIXFILE_PERSIST
2320: 5f 57 41 4c 20 30 78 30 34 20 20 20 20 20 2f 2a  _WAL 0x04     /*
2330: 20 50 65 72 73 69 73 74 65 6e 74 20 57 41 4c 20   Persistent WAL 
2340: 6d 6f 64 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20  mode */.#ifndef 
2350: 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44  SQLITE_DISABLE_D
2360: 49 52 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20  IRSYNC.# define 
2370: 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43  UNIXFILE_DIRSYNC
2380: 20 20 20 20 30 78 30 38 20 20 20 20 20 2f 2a 20      0x08     /* 
2390: 44 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 6e  Directory sync n
23a0: 65 65 64 65 64 20 2a 2f 0a 23 65 6c 73 65 0a 23  eeded */.#else.#
23b0: 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45   define UNIXFILE
23c0: 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78 30 30  _DIRSYNC    0x00
23d0: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
23e0: 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 20 20 20  UNIXFILE_PSOW   
23f0: 20 20 20 20 20 30 78 31 30 20 20 20 20 20 2f 2a       0x10     /*
2400: 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
2410: 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
2420: 45 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  E */.#define UNI
2430: 58 46 49 4c 45 5f 44 45 4c 45 54 45 20 20 20 20  XFILE_DELETE    
2440: 20 20 30 78 32 30 20 20 20 20 20 2f 2a 20 44 65    0x20     /* De
2450: 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f  lete on close */
2460: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
2470: 45 5f 55 52 49 20 20 20 20 20 20 20 20 20 30 78  E_URI         0x
2480: 34 30 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61  40     /* Filena
2490: 6d 65 20 6d 69 67 68 74 20 68 61 76 65 20 71 75  me might have qu
24a0: 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20 2a  ery parameters *
24b0: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49  /.#define UNIXFI
24c0: 4c 45 5f 4e 4f 4c 4f 43 4b 20 20 20 20 20 20 30  LE_NOLOCK      0
24d0: 78 38 30 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  x80     /* Do no
24e0: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f   file locking */
24f0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20  ../*.** Include 
2500: 63 6f 64 65 20 74 68 61 74 20 69 73 20 63 6f 6d  code that is com
2510: 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e  mon to all os_*.
2520: 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c  c files.*/.#incl
2530: 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68  ude "os_common.h
2540: 22 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  "../*.** Define 
2550: 76 61 72 69 6f 75 73 20 6d 61 63 72 6f 73 20 74  various macros t
2560: 68 61 74 20 61 72 65 20 6d 69 73 73 69 6e 67 20  hat are missing 
2570: 66 72 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d  from some system
2580: 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f  s..*/.#ifndef O_
2590: 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69  LARGEFILE.# defi
25a0: 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30  ne O_LARGEFILE 0
25b0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
25c0: 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46  QLITE_DISABLE_LF
25d0: 53 0a 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47  S.# undef O_LARG
25e0: 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f  EFILE.# define O
25f0: 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e  _LARGEFILE 0.#en
2600: 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f  dif.#ifndef O_NO
2610: 46 4f 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20  FOLLOW.# define 
2620: 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e  O_NOFOLLOW 0.#en
2630: 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49  dif.#ifndef O_BI
2640: 4e 41 52 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f  NARY.# define O_
2650: 42 49 4e 41 52 59 20 30 0a 23 65 6e 64 69 66 0a  BINARY 0.#endif.
2660: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65 61  ./*.** The threa
2670: 64 69 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76  did macro resolv
2680: 65 73 20 74 6f 20 74 68 65 20 74 68 72 65 61 64  es to the thread
2690: 2d 69 64 20 6f 72 20 74 6f 20 30 2e 20 20 55 73  -id or to 0.  Us
26a0: 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
26b0: 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  g and debugging 
26c0: 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  only..*/.#if SQL
26d0: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23  ITE_THREADSAFE.#
26e0: 64 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20  define threadid 
26f0: 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23  pthread_self().#
2700: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 74 68 72  else.#define thr
2710: 65 61 64 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a  eadid 0.#endif..
2720: 2f 2a 0a 2a 2a 20 48 41 56 45 5f 4d 52 45 4d 41  /*.** HAVE_MREMA
2730: 50 20 64 65 66 61 75 6c 74 73 20 74 6f 20 74 72  P defaults to tr
2740: 75 65 20 6f 6e 20 4c 69 6e 75 78 20 61 6e 64 20  ue on Linux and 
2750: 66 61 6c 73 65 20 65 76 65 72 79 77 68 65 72 65  false everywhere
2760: 20 65 6c 73 65 2e 0a 2a 2f 0a 23 69 66 20 21 64   else..*/.#if !d
2770: 65 66 69 6e 65 64 28 48 41 56 45 5f 4d 52 45 4d  efined(HAVE_MREM
2780: 41 50 29 0a 23 20 69 66 20 64 65 66 69 6e 65 64  AP).# if defined
2790: 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26 26 20 64  (__linux__) && d
27a0: 65 66 69 6e 65 64 28 5f 47 4e 55 5f 53 4f 55 52  efined(_GNU_SOUR
27b0: 43 45 29 0a 23 20 20 64 65 66 69 6e 65 20 48 41  CE).#  define HA
27c0: 56 45 5f 4d 52 45 4d 41 50 20 31 0a 23 20 65 6c  VE_MREMAP 1.# el
27d0: 73 65 0a 23 20 20 64 65 66 69 6e 65 20 48 41 56  se.#  define HAV
27e0: 45 5f 4d 52 45 4d 41 50 20 30 0a 23 20 65 6e 64  E_MREMAP 0.# end
27f0: 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  if.#endif../*.**
2800: 20 45 78 70 6c 69 63 69 74 6c 79 20 63 61 6c 6c   Explicitly call
2810: 20 74 68 65 20 36 34 2d 62 69 74 20 76 65 72 73   the 64-bit vers
2820: 69 6f 6e 20 6f 66 20 6c 73 65 65 6b 28 29 20 6f  ion of lseek() o
2830: 6e 20 41 6e 64 72 6f 69 64 2e 20 4f 74 68 65 72  n Android. Other
2840: 77 69 73 65 2c 20 6c 73 65 65 6b 28 29 0a 2a 2a  wise, lseek().**
2850: 20 69 73 20 74 68 65 20 33 32 2d 62 69 74 20 76   is the 32-bit v
2860: 65 72 73 69 6f 6e 2c 20 65 76 65 6e 20 69 66 20  ersion, even if 
2870: 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54  _FILE_OFFSET_BIT
2880: 53 3d 36 34 20 69 73 20 64 65 66 69 6e 65 64 2e  S=64 is defined.
2890: 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 41 4e 44  .*/.#ifdef __AND
28a0: 52 4f 49 44 5f 5f 0a 23 20 64 65 66 69 6e 65 20  ROID__.# define 
28b0: 6c 73 65 65 6b 20 6c 73 65 65 6b 36 34 0a 23 65  lseek lseek64.#e
28c0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 69 66 66  ndif../*.** Diff
28d0: 65 72 65 6e 74 20 55 6e 69 78 20 73 79 73 74 65  erent Unix syste
28e0: 6d 73 20 64 65 63 6c 61 72 65 20 6f 70 65 6e 28  ms declare open(
28f0: 29 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 77  ) in different w
2900: 61 79 73 2e 20 20 53 61 6d 65 20 75 73 65 0a 2a  ays.  Same use.*
2910: 2a 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61  * open(const cha
2920: 72 2a 2c 69 6e 74 2c 6d 6f 64 65 5f 74 29 2e 20  r*,int,mode_t). 
2930: 20 4f 74 68 65 72 73 20 75 73 65 20 6f 70 65 6e   Others use open
2940: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74  (const char*,int
2950: 2c 2e 2e 2e 29 2e 0a 2a 2a 20 54 68 65 20 64 69  ,...)..** The di
2960: 66 66 65 72 65 6e 63 65 20 69 73 20 69 6d 70 6f  fference is impo
2970: 72 74 61 6e 74 20 77 68 65 6e 20 75 73 69 6e 67  rtant when using
2980: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
2990: 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  e function..**.*
29a0: 2a 20 54 68 65 20 73 61 66 65 73 74 20 77 61 79  * The safest way
29b0: 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68   to deal with th
29c0: 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 74 6f 20  e problem is to 
29d0: 61 6c 77 61 79 73 20 75 73 65 20 74 68 69 73 20  always use this 
29e0: 77 72 61 70 70 65 72 0a 2a 2a 20 77 68 69 63 68  wrapper.** which
29f0: 20 61 6c 77 61 79 73 20 68 61 73 20 74 68 65 20   always has the 
2a00: 73 61 6d 65 20 77 65 6c 6c 2d 64 65 66 69 6e 65  same well-define
2a10: 64 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a  d interface..*/.
2a20: 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78  static int posix
2a30: 4f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  Open(const char 
2a40: 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 66 6c 61 67  *zFile, int flag
2a50: 73 2c 20 69 6e 74 20 6d 6f 64 65 29 7b 0a 20 20  s, int mode){.  
2a60: 72 65 74 75 72 6e 20 6f 70 65 6e 28 7a 46 69 6c  return open(zFil
2a70: 65 2c 20 66 6c 61 67 73 2c 20 6d 6f 64 65 29 3b  e, flags, mode);
2a80: 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72  .}../* Forward r
2a90: 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74  eference */.stat
2aa0: 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72 65 63  ic int openDirec
2ab0: 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61 72 2a  tory(const char*
2ac0: 2c 20 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20  , int*);.static 
2ad0: 69 6e 74 20 75 6e 69 78 47 65 74 70 61 67 65 73  int unixGetpages
2ae0: 69 7a 65 28 76 6f 69 64 29 3b 0a 0a 2f 2a 0a 2a  ize(void);../*.*
2af0: 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d 20 63 61  * Many system ca
2b00: 6c 6c 73 20 61 72 65 20 61 63 63 65 73 73 65 64  lls are accessed
2b10: 20 74 68 72 6f 75 67 68 20 70 6f 69 6e 74 65 72   through pointer
2b20: 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20 73 6f  -to-functions so
2b30: 20 74 68 61 74 0a 2a 2a 20 74 68 65 79 20 6d 61   that.** they ma
2b40: 79 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20  y be overridden 
2b50: 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20 66 61  at runtime to fa
2b60: 63 69 6c 69 74 61 74 65 20 66 61 75 6c 74 20 69  cilitate fault i
2b70: 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e 67 0a  njection during.
2b80: 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 73  ** testing and s
2b90: 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68 65 20  andboxing.  The 
2ba0: 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 20  following array 
2bb0: 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 73 20  holds the names 
2bc0: 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20  and pointers.** 
2bd0: 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64 65 61  to all overridea
2be0: 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ble system calls
2bf0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ..*/.static stru
2c00: 63 74 20 75 6e 69 78 5f 73 79 73 63 61 6c 6c 20  ct unix_syscall 
2c10: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
2c20: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
2c30: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2c40: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a   system call */.
2c50: 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c    sqlite3_syscal
2c60: 6c 5f 70 74 72 20 70 43 75 72 72 65 6e 74 3b 20  l_ptr pCurrent; 
2c70: 2f 2a 20 43 75 72 72 65 6e 74 20 76 61 6c 75 65  /* Current value
2c80: 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 63   of the system c
2c90: 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  all */.  sqlite3
2ca0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 44 65  _syscall_ptr pDe
2cb0: 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61 75 6c  fault; /* Defaul
2cc0: 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61 53 79  t value */.} aSy
2cd0: 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 20 20 7b 20  scall[] = {.  { 
2ce0: 22 6f 70 65 6e 22 2c 20 20 20 20 20 20 20 20 20  "open",         
2cf0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
2d00: 5f 70 74 72 29 70 6f 73 69 78 4f 70 65 6e 2c 20  _ptr)posixOpen, 
2d10: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
2d20: 73 4f 70 65 6e 20 20 20 20 20 20 28 28 69 6e 74  sOpen      ((int
2d30: 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  (*)(const char*,
2d40: 69 6e 74 2c 69 6e 74 29 29 61 53 79 73 63 61 6c  int,int))aSyscal
2d50: 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[0].pCurrent)..
2d60: 20 20 7b 20 22 63 6c 6f 73 65 22 2c 20 20 20 20    { "close",    
2d70: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
2d80: 63 61 6c 6c 5f 70 74 72 29 63 6c 6f 73 65 2c 20  call_ptr)close, 
2d90: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
2da0: 6e 65 20 6f 73 43 6c 6f 73 65 20 20 20 20 20 28  ne osClose     (
2db0: 28 69 6e 74 28 2a 29 28 69 6e 74 29 29 61 53 79  (int(*)(int))aSy
2dc0: 73 63 61 6c 6c 5b 31 5d 2e 70 43 75 72 72 65 6e  scall[1].pCurren
2dd0: 74 29 0a 0a 20 20 7b 20 22 61 63 63 65 73 73 22  t)..  { "access"
2de0: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
2df0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 61 63 63  _syscall_ptr)acc
2e00: 65 73 73 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23  ess,     0  },.#
2e10: 64 65 66 69 6e 65 20 6f 73 41 63 63 65 73 73 20  define osAccess 
2e20: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
2e30: 74 20 63 68 61 72 2a 2c 69 6e 74 29 29 61 53 79  t char*,int))aSy
2e40: 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65 6e  scall[2].pCurren
2e50: 74 29 0a 0a 20 20 7b 20 22 67 65 74 63 77 64 22  t)..  { "getcwd"
2e60: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
2e70: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 67 65 74  _syscall_ptr)get
2e80: 63 77 64 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23  cwd,     0  },.#
2e90: 64 65 66 69 6e 65 20 6f 73 47 65 74 63 77 64 20  define osGetcwd 
2ea0: 20 20 20 28 28 63 68 61 72 2a 28 2a 29 28 63 68     ((char*(*)(ch
2eb0: 61 72 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73  ar*,size_t))aSys
2ec0: 63 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74  call[3].pCurrent
2ed0: 29 0a 0a 20 20 7b 20 22 73 74 61 74 22 2c 20 20  )..  { "stat",  
2ee0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
2ef0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 73 74 61 74  syscall_ptr)stat
2f00: 2c 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  ,       0  },.#d
2f10: 65 66 69 6e 65 20 6f 73 53 74 61 74 20 20 20 20  efine osStat    
2f20: 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74    ((int(*)(const
2f30: 20 63 68 61 72 2a 2c 73 74 72 75 63 74 20 73 74   char*,struct st
2f40: 61 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 34 5d  at*))aSyscall[4]
2f50: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 2f 2a 0a 2a  .pCurrent)../*.*
2f60: 2a 20 54 68 65 20 44 4a 47 50 50 20 63 6f 6d 70  * The DJGPP comp
2f70: 69 6c 65 72 20 65 6e 76 69 72 6f 6e 6d 65 6e 74  iler environment
2f80: 20 6c 6f 6f 6b 73 20 6d 6f 73 74 6c 79 20 6c 69   looks mostly li
2f90: 6b 65 20 55 6e 69 78 2c 20 62 75 74 20 69 74 0a  ke Unix, but it.
2fa0: 2a 2a 20 6c 61 63 6b 73 20 74 68 65 20 66 63 6e  ** lacks the fcn
2fb0: 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  tl() system call
2fc0: 2e 20 20 53 6f 20 72 65 64 65 66 69 6e 65 20 66  .  So redefine f
2fd0: 63 6e 74 6c 28 29 20 74 6f 20 62 65 20 73 6f 6d  cntl() to be som
2fe0: 65 74 68 69 6e 67 0a 2a 2a 20 74 68 61 74 20 61  ething.** that a
2ff0: 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20  lways succeeds. 
3000: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
3010: 20 6c 6f 63 6b 69 6e 67 20 64 6f 65 73 20 6e 6f   locking does no
3020: 74 20 6f 63 63 75 72 20 75 6e 64 65 72 0a 2a 2a  t occur under.**
3030: 20 44 4a 47 50 50 2e 20 20 42 75 74 20 69 74 20   DJGPP.  But it 
3040: 69 73 20 44 4f 53 20 2d 20 77 68 61 74 20 64 69  is DOS - what di
3050: 64 20 79 6f 75 20 65 78 70 65 63 74 3f 0a 2a 2f  d you expect?.*/
3060: 0a 23 69 66 64 65 66 20 5f 5f 44 4a 47 50 50 5f  .#ifdef __DJGPP_
3070: 5f 0a 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20  _.  { "fstat",  
3080: 20 20 20 20 20 20 30 2c 20 20 20 20 20 20 20 20        0,        
3090: 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23           0  },.#
30a0: 64 65 66 69 6e 65 20 6f 73 46 73 74 61 74 28 61  define osFstat(a
30b0: 2c 62 2c 63 29 20 20 20 20 30 0a 23 65 6c 73 65  ,b,c)    0.#else
30c0: 20 20 20 20 20 0a 20 20 7b 20 22 66 73 74 61 74       .  { "fstat
30d0: 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ",        (sqlit
30e0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66  e3_syscall_ptr)f
30f0: 73 74 61 74 2c 20 20 20 20 20 20 30 20 20 7d 2c  stat,      0  },
3100: 0a 23 64 65 66 69 6e 65 20 6f 73 46 73 74 61 74  .#define osFstat
3110: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e       ((int(*)(in
3120: 74 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29 29  t,struct stat*))
3130: 61 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72  aSyscall[5].pCur
3140: 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 20 20  rent).#endif..  
3150: 7b 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 20  { "ftruncate",  
3160: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3170: 6c 6c 5f 70 74 72 29 66 74 72 75 6e 63 61 74 65  ll_ptr)ftruncate
3180: 2c 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65  ,  0  },.#define
3190: 20 6f 73 46 74 72 75 6e 63 61 74 65 20 28 28 69   osFtruncate ((i
31a0: 6e 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 29  nt(*)(int,off_t)
31b0: 29 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75  )aSyscall[6].pCu
31c0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63 6e  rrent)..  { "fcn
31d0: 74 6c 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c  tl",        (sql
31e0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
31f0: 29 66 63 6e 74 6c 2c 20 20 20 20 20 20 30 20 20  )fcntl,      0  
3200: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 6e  },.#define osFcn
3210: 74 6c 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28  tl     ((int(*)(
3220: 69 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53 79  int,int,...))aSy
3230: 73 63 61 6c 6c 5b 37 5d 2e 70 43 75 72 72 65 6e  scall[7].pCurren
3240: 74 29 0a 0a 20 20 7b 20 22 72 65 61 64 22 2c 20  t)..  { "read", 
3250: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
3260: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 65 61  _syscall_ptr)rea
3270: 64 2c 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23  d,       0  },.#
3280: 64 65 66 69 6e 65 20 6f 73 52 65 61 64 20 20 20  define osRead   
3290: 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28     ((ssize_t(*)(
32a0: 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  int,void*,size_t
32b0: 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70 43  ))aSyscall[8].pC
32c0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
32d0: 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20  ined(USE_PREAD) 
32e0: 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  || SQLITE_ENABLE
32f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
3300: 20 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20 20   { "pread",     
3310: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3320: 61 6c 6c 5f 70 74 72 29 70 72 65 61 64 2c 20 20  all_ptr)pread,  
3330: 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a      0  },.#else.
3340: 20 20 7b 20 22 70 72 65 61 64 22 2c 20 20 20 20    { "pread",    
3350: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3360: 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20  call_ptr)0,     
3370: 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69       0  },.#endi
3380: 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 72 65 61  f.#define osPrea
3390: 64 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28  d     ((ssize_t(
33a0: 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a  *)(int,void*,siz
33b0: 65 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63  e_t,off_t))aSysc
33c0: 61 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29  all[9].pCurrent)
33d0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53  ..#if defined(US
33e0: 45 5f 50 52 45 41 44 36 34 29 0a 20 20 7b 20 22  E_PREAD64).  { "
33f0: 70 72 65 61 64 36 34 22 2c 20 20 20 20 20 20 28  pread64",      (
3400: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3410: 70 74 72 29 70 72 65 61 64 36 34 2c 20 20 20 20  ptr)pread64,    
3420: 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20  0  },.#else.  { 
3430: 22 70 72 65 61 64 36 34 22 2c 20 20 20 20 20 20  "pread64",      
3440: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3450: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
3460: 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64   0  },.#endif.#d
3470: 65 66 69 6e 65 20 6f 73 50 72 65 61 64 36 34 20  efine osPread64 
3480: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
3490: 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c  nt,void*,size_t,
34a0: 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  off_t))aSyscall[
34b0: 31 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  10].pCurrent).. 
34c0: 20 7b 20 22 77 72 69 74 65 22 2c 20 20 20 20 20   { "write",     
34d0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
34e0: 61 6c 6c 5f 70 74 72 29 77 72 69 74 65 2c 20 20  all_ptr)write,  
34f0: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
3500: 65 20 6f 73 57 72 69 74 65 20 20 20 20 20 28 28  e osWrite     ((
3510: 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63  ssize_t(*)(int,c
3520: 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f  onst void*,size_
3530: 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 31 5d 2e  t))aSyscall[11].
3540: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
3550: 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
3560: 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) || SQLITE_ENAB
3570: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
3580: 0a 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20 20  .  { "pwrite",  
3590: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
35a0: 73 63 61 6c 6c 5f 70 74 72 29 70 77 72 69 74 65  scall_ptr)pwrite
35b0: 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73  ,     0  },.#els
35c0: 65 0a 20 20 7b 20 22 70 77 72 69 74 65 22 2c 20  e.  { "pwrite", 
35d0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
35e0: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
35f0: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e         0  },.#en
3600: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 77  dif.#define osPw
3610: 72 69 74 65 20 20 20 20 28 28 73 73 69 7a 65 5f  rite    ((ssize_
3620: 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76  t(*)(int,const v
3630: 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f  oid*,size_t,off_
3640: 74 29 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20  t))\.           
3650: 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c           aSyscal
3660: 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[12].pCurrent).
3670: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
3680: 5f 50 52 45 41 44 36 34 29 0a 20 20 7b 20 22 70  _PREAD64).  { "p
3690: 77 72 69 74 65 36 34 22 2c 20 20 20 20 20 28 73  write64",     (s
36a0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
36b0: 74 72 29 70 77 72 69 74 65 36 34 2c 20 20 20 30  tr)pwrite64,   0
36c0: 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22    },.#else.  { "
36d0: 70 77 72 69 74 65 36 34 22 2c 20 20 20 20 20 28  pwrite64",     (
36e0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
36f0: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
3700: 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65  0  },.#endif.#de
3710: 66 69 6e 65 20 6f 73 50 77 72 69 74 65 36 34 20  fine osPwrite64 
3720: 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e   ((ssize_t(*)(in
3730: 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69  t,const void*,si
3740: 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a 20 20  ze_t,off_t))\.  
3750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3760: 20 20 61 53 79 73 63 61 6c 6c 5b 31 33 5d 2e 70    aSyscall[13].p
3770: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66  Current)..  { "f
3780: 63 68 6d 6f 64 22 2c 20 20 20 20 20 20 20 28 73  chmod",       (s
3790: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
37a0: 74 72 29 66 63 68 6d 6f 64 2c 20 20 20 20 20 20  tr)fchmod,      
37b0: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
37c0: 65 20 6f 73 46 63 68 6d 6f 64 20 20 20 20 28 28  e osFchmod    ((
37d0: 69 6e 74 28 2a 29 28 69 6e 74 2c 6d 6f 64 65 5f  int(*)(int,mode_
37e0: 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 34 5d 2e  t))aSyscall[14].
37f0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
3800: 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49  efined(HAVE_POSI
3810: 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20  X_FALLOCATE) && 
3820: 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f  HAVE_POSIX_FALLO
3830: 43 41 54 45 0a 20 20 7b 20 22 66 61 6c 6c 6f 63  CATE.  { "falloc
3840: 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69 74 65  ate",    (sqlite
3850: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f  3_syscall_ptr)po
3860: 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 2c 20 20  six_fallocate,  
3870: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3880: 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20 28  fallocate",    (
3890: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
38a0: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
38b0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
38c0: 66 0a 23 64 65 66 69 6e 65 20 6f 73 46 61 6c 6c  f.#define osFall
38d0: 6f 63 61 74 65 20 28 28 69 6e 74 28 2a 29 28 69  ocate ((int(*)(i
38e0: 6e 74 2c 6f 66 66 5f 74 2c 6f 66 66 5f 74 29 29  nt,off_t,off_t))
38f0: 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75  aSyscall[15].pCu
3900: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 75 6e 6c  rrent)..  { "unl
3910: 69 6e 6b 22 2c 20 20 20 20 20 20 20 28 73 71 6c  ink",       (sql
3920: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3930: 29 75 6e 6c 69 6e 6b 2c 20 20 20 20 20 20 20 20  )unlink,        
3940: 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20     0 },.#define 
3950: 6f 73 55 6e 6c 69 6e 6b 20 20 20 20 28 28 69 6e  osUnlink    ((in
3960: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
3970: 29 29 61 53 79 73 63 61 6c 6c 5b 31 36 5d 2e 70  ))aSyscall[16].p
3980: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 6f  Current)..  { "o
3990: 70 65 6e 44 69 72 65 63 74 6f 72 79 22 2c 20 20  penDirectory",  
39a0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
39b0: 6c 6c 5f 70 74 72 29 6f 70 65 6e 44 69 72 65 63  ll_ptr)openDirec
39c0: 74 6f 72 79 2c 20 20 20 20 20 20 30 20 7d 2c 0a  tory,      0 },.
39d0: 23 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e 44 69  #define osOpenDi
39e0: 72 65 63 74 6f 72 79 20 28 28 69 6e 74 28 2a 29  rectory ((int(*)
39f0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74  (const char*,int
3a00: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 37 5d 2e  *))aSyscall[17].
3a10: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3a20: 6d 6b 64 69 72 22 2c 20 20 20 20 20 20 20 20 28  mkdir",        (
3a30: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3a40: 70 74 72 29 6d 6b 64 69 72 2c 20 20 20 20 20 20  ptr)mkdir,      
3a50: 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e       0 },.#defin
3a60: 65 20 6f 73 4d 6b 64 69 72 20 20 20 20 20 28 28  e osMkdir     ((
3a70: 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  int(*)(const cha
3a80: 72 2a 2c 6d 6f 64 65 5f 74 29 29 61 53 79 73 63  r*,mode_t))aSysc
3a90: 61 6c 6c 5b 31 38 5d 2e 70 43 75 72 72 65 6e 74  all[18].pCurrent
3aa0: 29 0a 0a 20 20 7b 20 22 72 6d 64 69 72 22 2c 20  )..  { "rmdir", 
3ab0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
3ac0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 6d 64 69  syscall_ptr)rmdi
3ad0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  r,           0 }
3ae0: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52 6d 64 69  ,.#define osRmdi
3af0: 72 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63  r     ((int(*)(c
3b00: 6f 6e 73 74 20 63 68 61 72 2a 29 29 61 53 79 73  onst char*))aSys
3b10: 63 61 6c 6c 5b 31 39 5d 2e 70 43 75 72 72 65 6e  call[19].pCurren
3b20: 74 29 0a 0a 20 20 7b 20 22 66 63 68 6f 77 6e 22  t)..  { "fchown"
3b30: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
3b40: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 68  _syscall_ptr)fch
3b50: 6f 77 6e 2c 20 20 20 20 20 20 20 20 20 20 30 20  own,          0 
3b60: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 68  },.#define osFch
3b70: 6f 77 6e 20 20 20 20 28 28 69 6e 74 28 2a 29 28  own    ((int(*)(
3b80: 69 6e 74 2c 75 69 64 5f 74 2c 67 69 64 5f 74 29  int,uid_t,gid_t)
3b90: 29 61 53 79 73 63 61 6c 6c 5b 32 30 5d 2e 70 43  )aSyscall[20].pC
3ba0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 67 65  urrent)..  { "ge
3bb0: 74 65 75 69 64 22 2c 20 20 20 20 20 20 28 73 71  teuid",      (sq
3bc0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3bd0: 72 29 67 65 74 65 75 69 64 2c 20 20 20 20 20 20  r)geteuid,      
3be0: 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20     0 },.#define 
3bf0: 6f 73 47 65 74 65 75 69 64 20 20 20 28 28 75 69  osGeteuid   ((ui
3c00: 64 5f 74 28 2a 29 28 76 6f 69 64 29 29 61 53 79  d_t(*)(void))aSy
3c10: 73 63 61 6c 6c 5b 32 31 5d 2e 70 43 75 72 72 65  scall[21].pCurre
3c20: 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  nt)..#if !define
3c30: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
3c40: 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  L) || SQLITE_MAX
3c50: 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 7b  _MMAP_SIZE>0.  {
3c60: 20 22 6d 6d 61 70 22 2c 20 20 20 20 20 20 20 28   "mmap",       (
3c70: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3c80: 70 74 72 29 6d 6d 61 70 2c 20 20 20 20 20 30 20  ptr)mmap,     0 
3c90: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4d 6d 61  },.#define osMma
3ca0: 70 20 28 28 76 6f 69 64 2a 28 2a 29 28 76 6f 69  p ((void*(*)(voi
3cb0: 64 2a 2c 73 69 7a 65 5f 74 2c 69 6e 74 2c 69 6e  d*,size_t,int,in
3cc0: 74 2c 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53 79  t,int,off_t))aSy
3cd0: 73 63 61 6c 6c 5b 32 32 5d 2e 70 43 75 72 72 65  scall[22].pCurre
3ce0: 6e 74 29 0a 0a 20 20 7b 20 22 6d 75 6e 6d 61 70  nt)..  { "munmap
3cf0: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
3d00: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6d 75  3_syscall_ptr)mu
3d10: 6e 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20 30  nmap,          0
3d20: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4d 75   },.#define osMu
3d30: 6e 6d 61 70 20 28 28 76 6f 69 64 2a 28 2a 29 28  nmap ((void*(*)(
3d40: 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53  void*,size_t))aS
3d50: 79 73 63 61 6c 6c 5b 32 33 5d 2e 70 43 75 72 72  yscall[23].pCurr
3d60: 65 6e 74 29 0a 0a 23 69 66 20 48 41 56 45 5f 4d  ent)..#if HAVE_M
3d70: 52 45 4d 41 50 0a 20 20 7b 20 22 6d 72 65 6d 61  REMAP.  { "mrema
3d80: 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  p",       (sqlit
3d90: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6d  e3_syscall_ptr)m
3da0: 72 65 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20  remap,          
3db0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3dc0: 6d 72 65 6d 61 70 22 2c 20 20 20 20 20 20 20 28  mremap",       (
3dd0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3de0: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
3df0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
3e00: 0a 23 64 65 66 69 6e 65 20 6f 73 4d 72 65 6d 61  .#define osMrema
3e10: 70 20 28 28 76 6f 69 64 2a 28 2a 29 28 76 6f 69  p ((void*(*)(voi
3e20: 64 2a 2c 73 69 7a 65 5f 74 2c 73 69 7a 65 5f 74  d*,size_t,size_t
3e30: 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53 79 73 63 61  ,int,...))aSysca
3e40: 6c 6c 5b 32 34 5d 2e 70 43 75 72 72 65 6e 74 29  ll[24].pCurrent)
3e50: 0a 0a 20 20 7b 20 22 67 65 74 70 61 67 65 73 69  ..  { "getpagesi
3e60: 7a 65 22 2c 20 20 28 73 71 6c 69 74 65 33 5f 73  ze",  (sqlite3_s
3e70: 79 73 63 61 6c 6c 5f 70 74 72 29 75 6e 69 78 47  yscall_ptr)unixG
3e80: 65 74 70 61 67 65 73 69 7a 65 2c 20 30 20 7d 2c  etpagesize, 0 },
3e90: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 70 61  .#define osGetpa
3ea0: 67 65 73 69 7a 65 20 28 28 69 6e 74 28 2a 29 28  gesize ((int(*)(
3eb0: 76 6f 69 64 29 29 61 53 79 73 63 61 6c 6c 5b 32  void))aSyscall[2
3ec0: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  5].pCurrent)..  
3ed0: 7b 20 22 72 65 61 64 6c 69 6e 6b 22 2c 20 20 20  { "readlink",   
3ee0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3ef0: 6c 6c 5f 70 74 72 29 72 65 61 64 6c 69 6e 6b 2c  ll_ptr)readlink,
3f00: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65          0 },.#de
3f10: 66 69 6e 65 20 6f 73 52 65 61 64 6c 69 6e 6b 20  fine osReadlink 
3f20: 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 63 6f 6e  ((ssize_t(*)(con
3f30: 73 74 20 63 68 61 72 2a 2c 63 68 61 72 2a 2c 73  st char*,char*,s
3f40: 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  ize_t))aSyscall[
3f50: 32 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  26].pCurrent)..#
3f60: 65 6e 64 69 66 0a 0a 7d 3b 20 2f 2a 20 45 6e 64  endif..}; /* End
3f70: 20 6f 66 20 74 68 65 20 6f 76 65 72 72 69 64 65   of the override
3f80: 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c  able system call
3f90: 73 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20  s */.../*.** On 
3fa0: 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 63 61  some systems, ca
3fb0: 6c 6c 73 20 74 6f 20 66 63 68 6f 77 6e 28 29 20  lls to fchown() 
3fc0: 77 69 6c 6c 20 74 72 69 67 67 65 72 20 61 20 6d  will trigger a m
3fd0: 65 73 73 61 67 65 20 69 6e 20 61 20 73 65 63 75  essage in a secu
3fe0: 72 69 74 79 0a 2a 2a 20 6c 6f 67 20 69 66 20 74  rity.** log if t
3ff0: 68 65 79 20 63 6f 6d 65 20 66 72 6f 6d 20 6e 6f  hey come from no
4000: 6e 2d 72 6f 6f 74 20 70 72 6f 63 65 73 73 65 73  n-root processes
4010: 2e 20 20 53 6f 20 61 76 6f 69 64 20 63 61 6c 6c  .  So avoid call
4020: 69 6e 67 20 66 63 68 6f 77 6e 28 29 20 69 66 0a  ing fchown() if.
4030: 2a 2a 20 77 65 20 61 72 65 20 6e 6f 74 20 72 75  ** we are not ru
4040: 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74 2e 0a 2a  nning as root..*
4050: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62  /.static int rob
4060: 75 73 74 46 63 68 6f 77 6e 28 69 6e 74 20 66 64  ustFchown(int fd
4070: 2c 20 75 69 64 5f 74 20 75 69 64 2c 20 67 69 64  , uid_t uid, gid
4080: 5f 74 20 67 69 64 29 7b 0a 23 69 66 20 4f 53 5f  _t gid){.#if OS_
4090: 56 58 57 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e  VXWORKS.  return
40a0: 20 30 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75   0;.#else.  retu
40b0: 72 6e 20 6f 73 47 65 74 65 75 69 64 28 29 20 3f  rn osGeteuid() ?
40c0: 20 30 20 3a 20 6f 73 46 63 68 6f 77 6e 28 66 64   0 : osFchown(fd
40d0: 2c 75 69 64 2c 67 69 64 29 3b 0a 23 65 6e 64 69  ,uid,gid);.#endi
40e0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  f.}../*.** This 
40f0: 69 73 20 74 68 65 20 78 53 65 74 53 79 73 74 65  is the xSetSyste
4100: 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64 20 6f  mCall() method o
4110: 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20 66 6f  f sqlite3_vfs fo
4120: 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a 20  r all of the.** 
4130: 22 75 6e 69 78 22 20 56 46 53 65 73 2e 20 20 52  "unix" VFSes.  R
4140: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
4150: 6f 70 6f 6e 20 73 75 63 63 65 73 73 66 75 6c 6c  opon successfull
4160: 79 20 75 70 64 61 74 69 6e 67 20 74 68 65 0a 2a  y updating the.*
4170: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 70 6f  * system call po
4180: 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49 54 45  inter, or SQLITE
4190: 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74 68 65  _NOTFOUND if the
41a0: 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69 67 75  re is no configu
41b0: 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65 6d 20  rable.** system 
41c0: 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61 6d 65  call named zName
41d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
41e0: 75 6e 69 78 53 65 74 53 79 73 74 65 6d 43 61 6c  unixSetSystemCal
41f0: 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  l(.  sqlite3_vfs
4200: 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20 20 20   *pNotUsed,     
4210: 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 70 6f     /* The VFS po
4220: 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73 65 64  inter.  Not used
4230: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
4240: 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *zName,        
4250: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73      /* Name of s
4260: 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 6f 76  ystem call to ov
4270: 65 72 72 69 64 65 20 2a 2f 0a 20 20 73 71 6c 69  erride */.  sqli
4280: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
4290: 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50 6f 69  pNewFunc  /* Poi
42a0: 6e 74 65 72 20 74 6f 20 6e 65 77 20 73 79 73 74  nter to new syst
42b0: 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20 2a 2f  em call value */
42c0: 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  .){.  unsigned i
42d0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d  nt i;.  int rc =
42e0: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
42f0: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
4300: 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b  METER(pNotUsed);
4310: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
4320: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20  ){.    /* If no 
4330: 7a 4e 61 6d 65 20 69 73 20 67 69 76 65 6e 2c 20  zName is given, 
4340: 72 65 73 74 6f 72 65 20 61 6c 6c 20 73 79 73 74  restore all syst
4350: 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 69  em calls to thei
4360: 72 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a  r default.    **
4370: 20 73 65 74 74 69 6e 67 73 20 61 6e 64 20 72 65   settings and re
4380: 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a 2f  turn NULL.    */
4390: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
43a0: 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  _OK;.    for(i=0
43b0: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63  ; i<sizeof(aSysc
43c0: 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73  all)/sizeof(aSys
43d0: 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  call[0]); i++){.
43e0: 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61        if( aSysca
43f0: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 29  ll[i].pDefault )
4400: 7b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61  {.        aSysca
4410: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d  ll[i].pCurrent =
4420: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
4430: 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a 20  fault;.      }. 
4440: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
4450: 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73    /* If zName is
4460: 20 73 70 65 63 69 66 69 65 64 2c 20 6f 70 65 72   specified, oper
4470: 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68 65 20  ate on only the 
4480: 6f 6e 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a  one system call.
4490: 20 20 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64      ** specified
44a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
44b0: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
44c0: 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28  Syscall)/sizeof(
44d0: 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b  aSyscall[0]); i+
44e0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
44f0: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73  rcmp(zName, aSys
4500: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  call[i].zName)==
4510: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
4520: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
4530: 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20  fault==0 ){.    
4540: 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69        aSyscall[i
4550: 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20 61 53 79  ].pDefault = aSy
4560: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
4570: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
4580: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
4590: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  _OK;.        if(
45a0: 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20 70   pNewFunc==0 ) p
45b0: 4e 65 77 46 75 6e 63 20 3d 20 61 53 79 73 63 61  NewFunc = aSysca
45c0: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a  ll[i].pDefault;.
45d0: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
45e0: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 70  [i].pCurrent = p
45f0: 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20 20 20 20  NewFunc;.       
4600: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4610: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
4620: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4630: 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
4640: 20 6f 66 20 61 20 73 79 73 74 65 6d 20 63 61 6c   of a system cal
4650: 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  l.  Return NULL 
4660: 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20  if zName is not 
4670: 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64 20  a.** recognized 
4680: 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65  system call name
4690: 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f 20  .  NULL is also 
46a0: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
46b0: 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20 69  system call.** i
46c0: 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  s currently unde
46d0: 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  fined..*/.static
46e0: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
46f0: 5f 70 74 72 20 75 6e 69 78 47 65 74 53 79 73 74  _ptr unixGetSyst
4700: 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65  emCall(.  sqlite
4710: 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c  3_vfs *pNotUsed,
4720: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
4730: 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  Name.){.  unsign
4740: 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55  ed int i;..  UNU
4750: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e  SED_PARAMETER(pN
4760: 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f 72 28 69  otUsed);.  for(i
4770: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79  =0; i<sizeof(aSy
4780: 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53  scall)/sizeof(aS
4790: 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29  yscall[0]); i++)
47a0: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
47b0: 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c  (zName, aSyscall
47c0: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [i].zName)==0 ) 
47d0: 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b  return aSyscall[
47e0: 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d  i].pCurrent;.  }
47f0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
4800: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
4810: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72   name of the fir
4820: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 61  st system call a
4830: 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20  fter zName.  If 
4840: 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74  zName==NULL.** t
4850: 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 6e  hen return the n
4860: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  ame of the first
4870: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52   system call.  R
4880: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e  eturn NULL if zN
4890: 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61  ame.** is the la
48a0: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f  st system call o
48b0: 72 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f  r if zName is no
48c0: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  t the name of a 
48d0: 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20  valid.** system 
48e0: 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  call..*/.static 
48f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 69 78  const char *unix
4900: 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 28 73  NextSystemCall(s
4910: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c 20 63  qlite3_vfs *p, c
4920: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
4930: 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b  ){.  int i = -1;
4940: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
4950: 45 54 45 52 28 70 29 3b 0a 20 20 69 66 28 20 7a  ETER(p);.  if( z
4960: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72 28  Name ){.    for(
4970: 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
4980: 28 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b  (aSyscall)-1; i+
4990: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
49a0: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73  rcmp(zName, aSys
49b0: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  call[i].zName)==
49c0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  0 ) break;.    }
49d0: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20  .  }.  for(i++; 
49e0: 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73  i<ArraySize(aSys
49f0: 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  call); i++){.   
4a00: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
4a10: 2e 70 43 75 72 72 65 6e 74 21 3d 30 20 29 20 72  .pCurrent!=0 ) r
4a20: 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69  eturn aSyscall[i
4a30: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72  ].zName;.  }.  r
4a40: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
4a50: 2a 20 44 6f 20 6e 6f 74 20 61 63 63 65 70 74 20  * Do not accept 
4a60: 61 6e 79 20 66 69 6c 65 20 64 65 73 63 72 69 70  any file descrip
4a70: 74 6f 72 20 6c 65 73 73 20 74 68 61 6e 20 74 68  tor less than th
4a80: 69 73 20 76 61 6c 75 65 2c 20 69 6e 20 6f 72 64  is value, in ord
4a90: 65 72 20 74 6f 20 61 76 6f 69 64 0a 2a 2a 20 6f  er to avoid.** o
4aa0: 70 65 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20  pening database 
4ab0: 66 69 6c 65 20 75 73 69 6e 67 20 66 69 6c 65 20  file using file 
4ac0: 64 65 73 63 72 69 70 74 6f 72 73 20 74 68 61 74  descriptors that
4ad0: 20 61 72 65 20 63 6f 6d 6d 6f 6e 6c 79 20 75 73   are commonly us
4ae0: 65 64 20 66 6f 72 20 0a 2a 2a 20 73 74 61 6e 64  ed for .** stand
4af0: 61 72 64 20 69 6e 70 75 74 2c 20 6f 75 74 70 75  ard input, outpu
4b00: 74 2c 20 61 6e 64 20 65 72 72 6f 72 2e 0a 2a 2f  t, and error..*/
4b10: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4b20: 4d 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44 45 53  MINIMUM_FILE_DES
4b30: 43 52 49 50 54 4f 52 0a 23 20 64 65 66 69 6e 65  CRIPTOR.# define
4b40: 20 53 51 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d 5f   SQLITE_MINIMUM_
4b50: 46 49 4c 45 5f 44 45 53 43 52 49 50 54 4f 52 20  FILE_DESCRIPTOR 
4b60: 33 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  3.#endif../*.** 
4b70: 49 6e 76 6f 6b 65 20 6f 70 65 6e 28 29 2e 20 20  Invoke open().  
4b80: 44 6f 20 73 6f 20 6d 75 6c 74 69 70 6c 65 20 74  Do so multiple t
4b90: 69 6d 65 73 2c 20 75 6e 74 69 6c 20 69 74 20 65  imes, until it e
4ba0: 69 74 68 65 72 20 73 75 63 63 65 65 64 73 20 6f  ither succeeds o
4bb0: 72 0a 2a 2a 20 66 61 69 6c 73 20 66 6f 72 20 73  r.** fails for s
4bc0: 6f 6d 65 20 72 65 61 73 6f 6e 20 6f 74 68 65 72  ome reason other
4bd0: 20 74 68 61 6e 20 45 49 4e 54 52 2e 0a 2a 2a 0a   than EINTR..**.
4be0: 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 63  ** If the file c
4bf0: 72 65 61 74 69 6f 6e 20 6d 6f 64 65 20 22 6d 22  reation mode "m"
4c00: 20 69 73 20 30 20 74 68 65 6e 20 73 65 74 20 69   is 0 then set i
4c10: 74 20 74 6f 20 74 68 65 20 64 65 66 61 75 6c 74  t to the default
4c20: 20 66 6f 72 0a 2a 2a 20 53 51 4c 69 74 65 2e 20   for.** SQLite. 
4c30: 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20   The default is 
4c40: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
4c50: 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20  ILE_PERMISSIONS 
4c60: 28 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 30 36 34  (normally.** 064
4c70: 34 29 20 61 73 20 6d 6f 64 69 66 69 65 64 20 62  4) as modified b
4c80: 79 20 74 68 65 20 73 79 73 74 65 6d 20 75 6d 61  y the system uma
4c90: 73 6b 2e 20 20 49 66 20 6d 20 69 73 20 6e 6f 74  sk.  If m is not
4ca0: 20 30 2c 20 74 68 65 6e 0a 2a 2a 20 6d 61 6b 65   0, then.** make
4cb0: 20 74 68 65 20 66 69 6c 65 20 63 72 65 61 74 69   the file creati
4cc0: 6f 6e 20 6d 6f 64 65 20 62 65 20 65 78 61 63 74  on mode be exact
4cd0: 6c 79 20 6d 20 69 67 6e 6f 72 69 6e 67 20 74 68  ly m ignoring th
4ce0: 65 20 75 6d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54  e umask..**.** T
4cf0: 68 65 20 6d 20 70 61 72 61 6d 65 74 65 72 20 77  he m parameter w
4d00: 69 6c 6c 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20  ill be non-zero 
4d10: 6f 6e 6c 79 20 77 68 65 6e 20 63 72 65 61 74 69  only when creati
4d20: 6e 67 20 2d 77 61 6c 2c 20 2d 6a 6f 75 72 6e 61  ng -wal, -journa
4d30: 6c 2c 0a 2a 2a 20 61 6e 64 20 2d 73 68 6d 20 66  l,.** and -shm f
4d40: 69 6c 65 73 2e 20 20 57 65 20 77 61 6e 74 20 74  iles.  We want t
4d50: 68 6f 73 65 20 66 69 6c 65 73 20 74 6f 20 68 61  hose files to ha
4d60: 76 65 20 2a 65 78 61 63 74 6c 79 2a 20 74 68 65  ve *exactly* the
4d70: 20 73 61 6d 65 0a 2a 2a 20 70 65 72 6d 69 73 73   same.** permiss
4d80: 69 6f 6e 73 20 61 73 20 74 68 65 69 72 20 6f 72  ions as their or
4d90: 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 2c  iginal database,
4da0: 20 75 6e 61 64 75 6c 74 65 72 61 74 65 64 20 62   unadulterated b
4db0: 79 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a 20  y the umask..** 
4dc0: 49 6e 20 74 68 61 74 20 77 61 79 2c 20 69 66 20  In that way, if 
4dd0: 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
4de0: 69 73 20 2d 72 77 2d 72 77 2d 72 77 20 6f 72 20  is -rw-rw-rw or 
4df0: 2d 72 77 2d 72 77 2d 72 2d 2c 20 61 6e 64 20 61  -rw-rw-r-, and a
4e00: 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
4e10: 63 72 61 73 68 65 73 20 61 6e 64 20 6c 65 61 76  crashes and leav
4e20: 65 73 20 62 65 68 69 6e 64 20 68 6f 74 20 6a 6f  es behind hot jo
4e30: 75 72 6e 61 6c 73 2c 20 74 68 65 6e 20 61 6e 79  urnals, then any
4e40: 0a 2a 2a 20 70 72 6f 63 65 73 73 20 74 68 61 74  .** process that
4e50: 20 69 73 20 61 62 6c 65 20 74 6f 20 77 72 69 74   is able to writ
4e60: 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
4e70: 65 20 77 69 6c 6c 20 61 6c 73 6f 20 62 65 20 61  e will also be a
4e80: 62 6c 65 20 74 6f 0a 2a 2a 20 72 65 63 6f 76 65  ble to.** recove
4e90: 72 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61  r the hot journa
4ea0: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
4eb0: 74 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 63 6f  t robust_open(co
4ec0: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
4ed0: 20 66 2c 20 6d 6f 64 65 5f 74 20 6d 29 7b 0a 20   f, mode_t m){. 
4ee0: 20 69 6e 74 20 66 64 3b 0a 20 20 6d 6f 64 65 5f   int fd;.  mode_
4ef0: 74 20 6d 32 20 3d 20 6d 20 3f 20 6d 20 3a 20 53  t m2 = m ? m : S
4f00: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
4f10: 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 3b 0a  LE_PERMISSIONS;.
4f20: 20 20 77 68 69 6c 65 28 31 29 7b 0a 23 69 66 20    while(1){.#if 
4f30: 64 65 66 69 6e 65 64 28 4f 5f 43 4c 4f 45 58 45  defined(O_CLOEXE
4f40: 43 29 0a 20 20 20 20 66 64 20 3d 20 6f 73 4f 70  C).    fd = osOp
4f50: 65 6e 28 7a 2c 66 7c 4f 5f 43 4c 4f 45 58 45 43  en(z,f|O_CLOEXEC
4f60: 2c 6d 32 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  ,m2);.#else.    
4f70: 66 64 20 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66 2c  fd = osOpen(z,f,
4f80: 6d 32 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  m2);.#endif.    
4f90: 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
4fa0: 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 49 4e    if( errno==EIN
4fb0: 54 52 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  TR ) continue;. 
4fc0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4fd0: 7d 0a 20 20 20 20 69 66 28 20 66 64 3e 3d 53 51  }.    if( fd>=SQ
4fe0: 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d 5f 46 49 4c  LITE_MINIMUM_FIL
4ff0: 45 5f 44 45 53 43 52 49 50 54 4f 52 20 29 20 62  E_DESCRIPTOR ) b
5000: 72 65 61 6b 3b 0a 20 20 20 20 6f 73 43 6c 6f 73  reak;.    osClos
5010: 65 28 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  e(fd);.    sqlit
5020: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41  e3_log(SQLITE_WA
5030: 52 4e 49 4e 47 2c 20 0a 20 20 20 20 20 20 20 20  RNING, .        
5040: 20 20 20 20 20 20 20 20 22 61 74 74 65 6d 70 74          "attempt
5050: 20 74 6f 20 6f 70 65 6e 20 5c 22 25 73 5c 22 20   to open \"%s\" 
5060: 61 73 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  as file descript
5070: 6f 72 20 25 64 22 2c 20 7a 2c 20 66 64 29 3b 0a  or %d", z, fd);.
5080: 20 20 20 20 66 64 20 3d 20 2d 31 3b 0a 20 20 20      fd = -1;.   
5090: 20 69 66 28 20 6f 73 4f 70 65 6e 28 22 2f 64 65   if( osOpen("/de
50a0: 76 2f 6e 75 6c 6c 22 2c 20 66 2c 20 6d 29 3c 30  v/null", f, m)<0
50b0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
50c0: 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20  if( fd>=0 ){.   
50d0: 20 69 66 28 20 6d 21 3d 30 20 29 7b 0a 20 20 20   if( m!=0 ){.   
50e0: 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73     struct stat s
50f0: 74 61 74 62 75 66 3b 0a 20 20 20 20 20 20 69 66  tatbuf;.      if
5100: 28 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73  ( osFstat(fd, &s
5110: 74 61 74 62 75 66 29 3d 3d 30 20 0a 20 20 20 20  tatbuf)==0 .    
5120: 20 20 20 26 26 20 73 74 61 74 62 75 66 2e 73 74     && statbuf.st
5130: 5f 73 69 7a 65 3d 3d 30 0a 20 20 20 20 20 20 20  _size==0.       
5140: 26 26 20 28 73 74 61 74 62 75 66 2e 73 74 5f 6d  && (statbuf.st_m
5150: 6f 64 65 26 30 37 37 37 29 21 3d 6d 20 0a 20 20  ode&0777)!=m .  
5160: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 6f      ){.        o
5170: 73 46 63 68 6d 6f 64 28 66 64 2c 20 6d 29 3b 0a  sFchmod(fd, m);.
5180: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
5190: 66 20 64 65 66 69 6e 65 64 28 46 44 5f 43 4c 4f  f defined(FD_CLO
51a0: 45 58 45 43 29 20 26 26 20 28 21 64 65 66 69 6e  EXEC) && (!defin
51b0: 65 64 28 4f 5f 43 4c 4f 45 58 45 43 29 20 7c 7c  ed(O_CLOEXEC) ||
51c0: 20 4f 5f 43 4c 4f 45 58 45 43 3d 3d 30 29 0a 20   O_CLOEXEC==0). 
51d0: 20 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46     osFcntl(fd, F
51e0: 5f 53 45 54 46 44 2c 20 6f 73 46 63 6e 74 6c 28  _SETFD, osFcntl(
51f0: 66 64 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20  fd, F_GETFD, 0) 
5200: 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23  | FD_CLOEXEC);.#
5210: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75  endif.  }.  retu
5220: 72 6e 20 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn fd;.}../*.** 
5230: 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 73  Helper functions
5240: 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20 72   to obtain and r
5250: 65 6c 69 6e 71 75 69 73 68 20 74 68 65 20 67 6c  elinquish the gl
5260: 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a  obal mutex. The.
5270: 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20  ** global mutex 
5280: 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 74 65  is used to prote
5290: 63 74 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65  ct the unixInode
52a0: 49 6e 66 6f 20 61 6e 64 0a 2a 2a 20 76 78 77 6f  Info and.** vxwo
52b0: 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74  rksFileId object
52c0: 73 20 75 73 65 64 20 62 79 20 74 68 69 73 20 66  s used by this f
52d0: 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63  ile, all of whic
52e0: 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20 73 68 61  h may be .** sha
52f0: 72 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20  red by multiple 
5300: 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46  threads..**.** F
5310: 75 6e 63 74 69 6f 6e 20 75 6e 69 78 4d 75 74 65  unction unixMute
5320: 78 48 65 6c 64 28 29 20 69 73 20 75 73 65 64 20  xHeld() is used 
5330: 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74  to assert() that
5340: 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65   the global mute
5350: 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77 68  x .** is held wh
5360: 65 6e 20 72 65 71 75 69 72 65 64 2e 20 54 68 69  en required. Thi
5370: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
5380: 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20  ly used as part 
5390: 6f 66 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20  of assert() .** 
53a0: 73 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e  statements. e.g.
53b0: 0a 2a 2a 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74  .**.**   unixEnt
53c0: 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20 20  erMutex().**    
53d0: 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
53e0: 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20  exHeld() );.**  
53f0: 20 75 6e 69 78 45 6e 74 65 72 4c 65 61 76 65 28   unixEnterLeave(
5400: 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ).*/.static void
5410: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
5420: 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
5430: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c  _mutex_enter(sql
5440: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
5450: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
5460: 49 43 5f 56 46 53 31 29 29 3b 0a 7d 0a 73 74 61  IC_VFS1));.}.sta
5470: 74 69 63 20 76 6f 69 64 20 75 6e 69 78 4c 65 61  tic void unixLea
5480: 76 65 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20  veMutex(void){. 
5490: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
54a0: 65 61 76 65 28 73 71 6c 69 74 65 33 4d 75 74 65  eave(sqlite3Mute
54b0: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
54c0: 54 45 58 5f 53 54 41 54 49 43 5f 56 46 53 31 29  TEX_STATIC_VFS1)
54d0: 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  );.}.#ifdef SQLI
54e0: 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20  TE_DEBUG.static 
54f0: 69 6e 74 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  int unixMutexHel
5500: 64 28 76 6f 69 64 29 20 7b 0a 20 20 72 65 74 75  d(void) {.  retu
5510: 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  rn sqlite3_mutex
5520: 5f 68 65 6c 64 28 73 71 6c 69 74 65 33 4d 75 74  _held(sqlite3Mut
5530: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
5540: 55 54 45 58 5f 53 54 41 54 49 43 5f 56 46 53 31  UTEX_STATIC_VFS1
5550: 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23  ));.}.#endif...#
5560: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 56  ifdef SQLITE_HAV
5570: 45 5f 4f 53 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a  E_OS_TRACE./*.**
5580: 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e   Helper function
5590: 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f 75   for printing ou
55a0: 74 20 74 72 61 63 65 20 69 6e 66 6f 72 6d 61 74  t trace informat
55b0: 69 6f 6e 20 66 72 6f 6d 20 64 65 62 75 67 67 69  ion from debuggi
55c0: 6e 67 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e 20  ng.** binaries. 
55d0: 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68 65  This returns the
55e0: 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e   string represen
55f0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75  tation of the su
5600: 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65  pplied.** intege
5610: 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a  r lock-type..*/.
5620: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
5630: 72 20 2a 61 7a 46 69 6c 65 4c 6f 63 6b 28 69 6e  r *azFileLock(in
5640: 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20  t eFileLock){.  
5650: 73 77 69 74 63 68 28 20 65 46 69 6c 65 4c 6f 63  switch( eFileLoc
5660: 6b 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4e 4f  k ){.    case NO
5670: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e  _LOCK: return "N
5680: 4f 4e 45 22 3b 0a 20 20 20 20 63 61 73 65 20 53  ONE";.    case S
5690: 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75  HARED_LOCK: retu
56a0: 72 6e 20 22 53 48 41 52 45 44 22 3b 0a 20 20 20  rn "SHARED";.   
56b0: 20 63 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c   case RESERVED_L
56c0: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 52 45 53  OCK: return "RES
56d0: 45 52 56 45 44 22 3b 0a 20 20 20 20 63 61 73 65  ERVED";.    case
56e0: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72   PENDING_LOCK: r
56f0: 65 74 75 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b  eturn "PENDING";
5700: 0a 20 20 20 20 63 61 73 65 20 45 58 43 4c 55 53  .    case EXCLUS
5710: 49 56 45 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e  IVE_LOCK: return
5720: 20 22 45 58 43 4c 55 53 49 56 45 22 3b 0a 20 20   "EXCLUSIVE";.  
5730: 7d 0a 20 20 72 65 74 75 72 6e 20 22 45 52 52 4f  }.  return "ERRO
5740: 52 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  R";.}.#endif..#i
5750: 66 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  fdef SQLITE_LOCK
5760: 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69  _TRACE./*.** Pri
5770: 6e 74 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69  nt out informati
5780: 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63  on about all loc
5790: 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e  king operations.
57a0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
57b0: 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
57c0: 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20  troubleshooting 
57d0: 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68  locks on multith
57e0: 72 65 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f  readed.** platfo
57f0: 72 6d 73 2e 20 20 45 6e 61 62 6c 65 20 62 79 20  rms.  Enable by 
5800: 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 74  compiling with t
5810: 68 65 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b  he -DSQLITE_LOCK
5820: 5f 54 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e  _TRACE.** comman
5830: 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e  d-line option on
5840: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20   the compiler.  
5850: 54 68 69 73 20 63 6f 64 65 20 69 73 20 6e 6f 72  This code is nor
5860: 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20  mally.** turned 
5870: 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  off..*/.static i
5880: 6e 74 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74  nt lockTrace(int
5890: 20 66 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72   fd, int op, str
58a0: 75 63 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20  uct flock *p){. 
58b0: 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20   char *zOpName, 
58c0: 2a 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b  *zType;.  int s;
58d0: 0a 20 20 69 6e 74 20 73 61 76 65 64 45 72 72 6e  .  int savedErrn
58e0: 6f 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47  o;.  if( op==F_G
58f0: 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e  ETLK ){.    zOpN
5900: 61 6d 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20  ame = "GETLK";. 
5910: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46   }else if( op==F
5920: 5f 53 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f  _SETLK ){.    zO
5930: 70 4e 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b  pName = "SETLK";
5940: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20  .  }else{.    s 
5950: 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70  = osFcntl(fd, op
5960: 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , p);.    sqlite
5970: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63  3DebugPrintf("fc
5980: 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20 25  ntl unknown %d %
5990: 64 20 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c  d %d\n", fd, op,
59a0: 20 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   s);.    return 
59b0: 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  s;.  }.  if( p->
59c0: 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20  l_type==F_RDLCK 
59d0: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22  ){.    zType = "
59e0: 52 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20  RDLCK";.  }else 
59f0: 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  if( p->l_type==F
5a00: 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54  _WRLCK ){.    zT
5a10: 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20  ype = "WRLCK";. 
5a20: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f   }else if( p->l_
5a30: 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  type==F_UNLCK ){
5a40: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e  .    zType = "UN
5a50: 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  LCK";.  }else{. 
5a60: 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a     assert( 0 );.
5a70: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
5a80: 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b 5f  >l_whence==SEEK_
5a90: 53 45 54 20 29 3b 0a 20 20 73 20 3d 20 6f 73 46  SET );.  s = osF
5aa0: 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b  cntl(fd, op, p);
5ab0: 0a 20 20 73 61 76 65 64 45 72 72 6e 6f 20 3d 20  .  savedErrno = 
5ac0: 65 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33  errno;.  sqlite3
5ad0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e  DebugPrintf("fcn
5ae0: 74 6c 20 25 64 20 25 64 20 25 73 20 25 73 20 25  tl %d %d %s %s %
5af0: 64 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20  d %d %d %d\n",. 
5b00: 20 20 20 20 74 68 72 65 61 64 69 64 2c 20 66 64      threadid, fd
5b10: 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65  , zOpName, zType
5b20: 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72  , (int)p->l_star
5b30: 74 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e  t, (int)p->l_len
5b40: 2c 0a 20 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c  ,.     (int)p->l
5b50: 5f 70 69 64 2c 20 73 29 3b 0a 20 20 69 66 28 20  _pid, s);.  if( 
5b60: 73 3d 3d 28 2d 31 29 20 26 26 20 6f 70 3d 3d 46  s==(-1) && op==F
5b70: 5f 53 45 54 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f  _SETLK && (p->l_
5b80: 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c  type==F_RDLCK ||
5b90: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52   p->l_type==F_WR
5ba0: 4c 43 4b 29 20 29 7b 0a 20 20 20 20 73 74 72 75  LCK) ){.    stru
5bb0: 63 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20  ct flock l2;.   
5bc0: 20 6c 32 20 3d 20 2a 70 3b 0a 20 20 20 20 6f 73   l2 = *p;.    os
5bd0: 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c  Fcntl(fd, F_GETL
5be0: 4b 2c 20 26 6c 32 29 3b 0a 20 20 20 20 69 66 28  K, &l2);.    if(
5bf0: 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44   l2.l_type==F_RD
5c00: 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79  LCK ){.      zTy
5c10: 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20  pe = "RDLCK";.  
5c20: 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c    }else if( l2.l
5c30: 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  _type==F_WRLCK )
5c40: 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  {.      zType = 
5c50: 22 57 52 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c  "WRLCK";.    }el
5c60: 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65  se if( l2.l_type
5c70: 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  ==F_UNLCK ){.   
5c80: 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43     zType = "UNLC
5c90: 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  K";.    }else{. 
5ca0: 20 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29       assert( 0 )
5cb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
5cc0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
5cd0: 66 63 6e 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65  fcntl-failure-re
5ce0: 61 73 6f 6e 3a 20 25 73 20 25 64 20 25 64 20 25  ason: %s %d %d %
5cf0: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 7a 54 79  d\n",.       zTy
5d00: 70 65 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74  pe, (int)l2.l_st
5d10: 61 72 74 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c  art, (int)l2.l_l
5d20: 65 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69  en, (int)l2.l_pi
5d30: 64 29 3b 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20  d);.  }.  errno 
5d40: 3d 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20  = savedErrno;.  
5d50: 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 23 75 6e 64  return s;.}.#und
5d60: 65 66 20 6f 73 46 63 6e 74 6c 0a 23 64 65 66 69  ef osFcntl.#defi
5d70: 6e 65 20 6f 73 46 63 6e 74 6c 20 6c 6f 63 6b 54  ne osFcntl lockT
5d80: 72 61 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  race.#endif /* S
5d90: 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45  QLITE_LOCK_TRACE
5da0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79   */../*.** Retry
5db0: 20 66 74 72 75 6e 63 61 74 65 28 29 20 63 61 6c   ftruncate() cal
5dc0: 6c 73 20 74 68 61 74 20 66 61 69 6c 20 64 75 65  ls that fail due
5dd0: 20 74 6f 20 45 49 4e 54 52 0a 2a 2a 0a 2a 2a 20   to EINTR.**.** 
5de0: 41 6c 6c 20 63 61 6c 6c 73 20 74 6f 20 66 74 72  All calls to ftr
5df0: 75 6e 63 61 74 65 28 29 20 77 69 74 68 69 6e 20  uncate() within 
5e00: 74 68 69 73 20 66 69 6c 65 20 73 68 6f 75 6c 64  this file should
5e10: 20 62 65 20 6d 61 64 65 20 74 68 72 6f 75 67 68   be made through
5e20: 0a 2a 2a 20 74 68 69 73 20 77 72 61 70 70 65 72  .** this wrapper
5e30: 2e 20 20 4f 6e 20 74 68 65 20 41 6e 64 72 6f 69  .  On the Androi
5e40: 64 20 70 6c 61 74 66 6f 72 6d 2c 20 62 79 70 61  d platform, bypa
5e50: 73 73 69 6e 67 20 74 68 65 20 6c 6f 67 69 63 20  ssing the logic 
5e60: 62 65 6c 6f 77 0a 2a 2a 20 63 6f 75 6c 64 20 6c  below.** could l
5e70: 65 61 64 20 74 6f 20 61 20 63 6f 72 72 75 70 74  ead to a corrupt
5e80: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74   database..*/.st
5e90: 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f  atic int robust_
5ea0: 66 74 72 75 6e 63 61 74 65 28 69 6e 74 20 68 2c  ftruncate(int h,
5eb0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
5ec0: 7a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 23 69  z){.  int rc;.#i
5ed0: 66 64 65 66 20 5f 5f 41 4e 44 52 4f 49 44 5f 5f  fdef __ANDROID__
5ee0: 0a 20 20 2f 2a 20 4f 6e 20 41 6e 64 72 6f 69 64  .  /* On Android
5ef0: 2c 20 66 74 72 75 6e 63 61 74 65 28 29 20 61 6c  , ftruncate() al
5f00: 77 61 79 73 20 75 73 65 73 20 33 32 2d 62 69 74  ways uses 32-bit
5f10: 20 6f 66 66 73 65 74 73 2c 20 65 76 65 6e 20 69   offsets, even i
5f20: 66 20 0a 20 20 2a 2a 20 5f 46 49 4c 45 5f 4f 46  f .  ** _FILE_OF
5f30: 46 53 45 54 5f 42 49 54 53 3d 36 34 20 69 73 20  FSET_BITS=64 is 
5f40: 64 65 66 69 6e 65 64 2e 20 54 68 69 73 20 6d 65  defined. This me
5f50: 61 6e 73 20 69 74 20 69 73 20 75 6e 73 61 66 65  ans it is unsafe
5f60: 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 0a 20   to attempt to. 
5f70: 20 2a 2a 20 74 72 75 6e 63 61 74 65 20 61 20 66   ** truncate a f
5f80: 69 6c 65 20 74 6f 20 61 6e 79 20 73 69 7a 65 20  ile to any size 
5f90: 6c 61 72 67 65 72 20 74 68 61 6e 20 32 47 69 42  larger than 2GiB
5fa0: 2e 20 53 69 6c 65 6e 74 6c 79 20 69 67 6e 6f 72  . Silently ignor
5fb0: 65 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20  e any.  ** such 
5fc0: 61 74 74 65 6d 70 74 73 2e 20 20 2a 2f 0a 20 20  attempts.  */.  
5fd0: 69 66 28 20 73 7a 3e 28 73 71 6c 69 74 65 33 5f  if( sz>(sqlite3_
5fe0: 69 6e 74 36 34 29 30 78 37 46 46 46 46 46 46 46  int64)0x7FFFFFFF
5ff0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
6000: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 0a  ITE_OK;.  }else.
6010: 23 65 6e 64 69 66 0a 20 20 64 6f 7b 20 72 63 20  #endif.  do{ rc 
6020: 3d 20 6f 73 46 74 72 75 6e 63 61 74 65 28 68 2c  = osFtruncate(h,
6030: 73 7a 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c  sz); }while( rc<
6040: 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
6050: 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  R );.  return rc
6060: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
6070: 72 6f 75 74 69 6e 65 20 74 72 61 6e 73 6c 61 74  routine translat
6080: 65 73 20 61 20 73 74 61 6e 64 61 72 64 20 50 4f  es a standard PO
6090: 53 49 58 20 65 72 72 6e 6f 20 63 6f 64 65 20 69  SIX errno code i
60a0: 6e 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a  nto something.**
60b0: 20 75 73 65 66 75 6c 20 74 6f 20 74 68 65 20 63   useful to the c
60c0: 6c 69 65 6e 74 73 20 6f 66 20 74 68 65 20 73 71  lients of the sq
60d0: 6c 69 74 65 33 20 66 75 6e 63 74 69 6f 6e 73 2e  lite3 functions.
60e0: 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20    Specifically, 
60f0: 69 74 20 69 73 0a 2a 2a 20 69 6e 74 65 6e 64 65  it is.** intende
6100: 64 20 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 61  d to translate a
6110: 20 76 61 72 69 65 74 79 20 6f 66 20 22 74 72 79   variety of "try
6120: 20 61 67 61 69 6e 22 20 65 72 72 6f 72 73 20 69   again" errors i
6130: 6e 74 6f 20 53 51 4c 49 54 45 5f 42 55 53 59 0a  nto SQLITE_BUSY.
6140: 2a 2a 20 61 6e 64 20 61 20 76 61 72 69 65 74 79  ** and a variety
6150: 20 6f 66 20 22 70 6c 65 61 73 65 20 63 6c 6f 73   of "please clos
6160: 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
6170: 69 70 74 6f 72 20 4e 4f 57 22 20 65 72 72 6f 72  iptor NOW" error
6180: 73 20 69 6e 74 6f 20 0a 2a 2a 20 53 51 4c 49 54  s into .** SQLIT
6190: 45 5f 49 4f 45 52 52 0a 2a 2a 20 0a 2a 2a 20 45  E_IOERR.** .** E
61a0: 72 72 6f 72 73 20 64 75 72 69 6e 67 20 69 6e 69  rrors during ini
61b0: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 6c  tialization of l
61c0: 6f 63 6b 73 2c 20 6f 72 20 66 69 6c 65 20 73 79  ocks, or file sy
61d0: 73 74 65 6d 20 73 75 70 70 6f 72 74 20 66 6f 72  stem support for
61e0: 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 73 68 6f 75 6c   locks,.** shoul
61f0: 64 20 68 61 6e 64 6c 65 20 45 4e 4f 4c 43 4b 2c  d handle ENOLCK,
6200: 20 45 4e 4f 54 53 55 50 2c 20 45 4f 50 4e 4f 54   ENOTSUP, EOPNOT
6210: 53 55 50 50 20 73 65 70 61 72 61 74 65 6c 79 2e  SUPP separately.
6220: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
6230: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
6240: 73 69 78 45 72 72 6f 72 28 69 6e 74 20 70 6f 73  sixError(int pos
6250: 69 78 45 72 72 6f 72 2c 20 69 6e 74 20 73 71 6c  ixError, int sql
6260: 69 74 65 49 4f 45 72 72 29 20 7b 0a 20 20 61 73  iteIOErr) {.  as
6270: 73 65 72 74 28 20 28 73 71 6c 69 74 65 49 4f 45  sert( (sqliteIOE
6280: 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  rr == SQLITE_IOE
6290: 52 52 5f 4c 4f 43 4b 29 20 7c 7c 20 0a 20 20 20  RR_LOCK) || .   
62a0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f         (sqliteIO
62b0: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
62c0: 45 52 52 5f 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a  ERR_UNLOCK) || .
62d0: 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
62e0: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
62f0: 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 20 7c  _IOERR_RDLOCK) |
6300: 7c 0a 20 20 20 20 20 20 20 20 20 20 28 73 71 6c  |.          (sql
6310: 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49  iteIOErr == SQLI
6320: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
6330: 53 45 52 56 45 44 4c 4f 43 4b 29 20 29 3b 0a 20  SERVEDLOCK) );. 
6340: 20 73 77 69 74 63 68 20 28 70 6f 73 69 78 45 72   switch (posixEr
6350: 72 6f 72 29 20 7b 0a 20 20 63 61 73 65 20 45 41  ror) {.  case EA
6360: 43 43 45 53 3a 20 0a 20 20 63 61 73 65 20 45 41  CCES: .  case EA
6370: 47 41 49 4e 3a 0a 20 20 63 61 73 65 20 45 54 49  GAIN:.  case ETI
6380: 4d 45 44 4f 55 54 3a 0a 20 20 63 61 73 65 20 45  MEDOUT:.  case E
6390: 42 55 53 59 3a 0a 20 20 63 61 73 65 20 45 49 4e  BUSY:.  case EIN
63a0: 54 52 3a 0a 20 20 63 61 73 65 20 45 4e 4f 4c 43  TR:.  case ENOLC
63b0: 4b 3a 20 20 0a 20 20 20 20 2f 2a 20 72 61 6e 64  K:  .    /* rand
63c0: 6f 6d 20 4e 46 53 20 72 65 74 72 79 20 65 72 72  om NFS retry err
63d0: 6f 72 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e  or, unless durin
63e0: 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75  g file system su
63f0: 70 70 6f 72 74 20 0a 20 20 20 20 20 2a 20 69 6e  pport .     * in
6400: 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20  trospection, in 
6410: 77 68 69 63 68 20 69 74 20 61 63 74 75 61 6c 6c  which it actuall
6420: 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20  y means what it 
6430: 73 61 79 73 20 2a 2f 0a 20 20 20 20 72 65 74 75  says */.    retu
6440: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
6450: 20 20 20 20 0a 20 20 63 61 73 65 20 45 50 45 52      .  case EPER
6460: 4d 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53  M: .    return S
6470: 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20  QLITE_PERM;.    
6480: 0a 20 20 64 65 66 61 75 6c 74 3a 20 0a 20 20 20  .  default: .   
6490: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 49 4f   return sqliteIO
64a0: 45 72 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 2a  Err;.  }.}.../**
64b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
64c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
64d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
64e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
64f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
6500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
6510: 42 65 67 69 6e 20 55 6e 69 71 75 65 20 46 69 6c  Begin Unique Fil
6520: 65 20 49 44 20 55 74 69 6c 69 74 79 20 55 73 65  e ID Utility Use
6530: 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a  d By VxWorks ***
6540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
6550: 2a 2a 20 4f 6e 20 6d 6f 73 74 20 76 65 72 73 69  ** On most versi
6560: 6f 6e 73 20 6f 66 20 75 6e 69 78 2c 20 77 65 20  ons of unix, we 
6570: 63 61 6e 20 67 65 74 20 61 20 75 6e 69 71 75 65  can get a unique
6580: 20 49 44 20 66 6f 72 20 61 20 66 69 6c 65 20 62   ID for a file b
6590: 79 20 63 6f 6e 63 61 74 65 6e 61 74 69 6e 67 0a  y concatenating.
65a0: 2a 2a 20 74 68 65 20 64 65 76 69 63 65 20 6e 75  ** the device nu
65b0: 6d 62 65 72 20 61 6e 64 20 74 68 65 20 69 6e 6f  mber and the ino
65c0: 64 65 20 6e 75 6d 62 65 72 2e 20 20 42 75 74 20  de number.  But 
65d0: 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f  this does not wo
65e0: 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  rk on VxWorks..*
65f0: 2a 20 4f 6e 20 56 78 57 6f 72 6b 73 2c 20 61 20  * On VxWorks, a 
6600: 75 6e 69 71 75 65 20 66 69 6c 65 20 69 64 20 6d  unique file id m
6610: 75 73 74 20 62 65 20 62 61 73 65 64 20 6f 6e 20  ust be based on 
6620: 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69  the canonical fi
6630: 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  lename..**.** A 
6640: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e  pointer to an in
6650: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
6660: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
6670: 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 73  e can be used as
6680: 20 61 0a 2a 2a 20 75 6e 69 71 75 65 20 66 69 6c   a.** unique fil
6690: 65 20 49 44 20 69 6e 20 56 78 57 6f 72 6b 73 2e  e ID in VxWorks.
66a0: 20 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20    Each instance 
66b0: 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
66c0: 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20  e contains.** a 
66d0: 63 6f 70 79 20 6f 66 20 74 68 65 20 63 61 6e 6f  copy of the cano
66e0: 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 20  nical filename. 
66f0: 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61   There is also a
6700: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
6710: 2e 20 20 0a 2a 2a 20 54 68 65 20 73 74 72 75 63  .  .** The struc
6720: 74 75 72 65 20 69 73 20 72 65 63 6c 61 69 6d 65  ture is reclaime
6730: 64 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  d when the numbe
6740: 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f  r of pointers to
6750: 20 69 74 20 64 72 6f 70 73 20 74 6f 0a 2a 2a 20   it drops to.** 
6760: 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  zero..**.** Ther
6770: 65 20 61 72 65 20 6e 65 76 65 72 20 76 65 72 79  e are never very
6780: 20 6d 61 6e 79 20 66 69 6c 65 73 20 6f 70 65 6e   many files open
6790: 20 61 74 20 6f 6e 65 20 74 69 6d 65 20 61 6e 64   at one time and
67a0: 20 6c 6f 6f 6b 75 70 73 20 61 72 65 20 6e 6f 74   lookups are not
67b0: 0a 2a 2a 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  .** a performanc
67c0: 65 2d 63 72 69 74 69 63 61 6c 20 70 61 74 68 2c  e-critical path,
67d0: 20 73 6f 20 69 74 20 69 73 20 73 75 66 66 69 63   so it is suffic
67e0: 69 65 6e 74 20 74 6f 20 70 75 74 20 74 68 65 73  ient to put thes
67f0: 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20  e.** structures 
6800: 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74  on a linked list
6810: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 76 78 77 6f  ..*/.struct vxwo
6820: 72 6b 73 46 69 6c 65 49 64 20 7b 0a 20 20 73 74  rksFileId {.  st
6830: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
6840: 49 64 20 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e  Id *pNext;  /* N
6850: 65 78 74 20 69 6e 20 61 20 6c 69 73 74 20 6f 66  ext in a list of
6860: 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20 20 69   them all */.  i
6870: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
6880: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6890: 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  Number of refere
68a0: 6e 63 65 73 20 74 6f 20 74 68 69 73 20 6f 6e 65  nces to this one
68b0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b   */.  int nName;
68c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68d0: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
68e0: 20 74 68 65 20 7a 43 61 6e 6f 6e 69 63 61 6c 4e   the zCanonicalN
68f0: 61 6d 65 5b 5d 20 73 74 72 69 6e 67 20 2a 2f 0a  ame[] string */.
6900: 20 20 63 68 61 72 20 2a 7a 43 61 6e 6f 6e 69 63    char *zCanonic
6910: 61 6c 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  alName;         
6920: 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c 20 66 69 6c  /* Canonical fil
6930: 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66  ename */.};..#if
6940: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 20 0a   OS_VXWORKS./* .
6950: 2a 2a 20 41 6c 6c 20 75 6e 69 71 75 65 20 66 69  ** All unique fi
6960: 6c 65 6e 61 6d 65 73 20 61 72 65 20 68 65 6c 64  lenames are held
6970: 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73   on a linked lis
6980: 74 20 68 65 61 64 65 64 20 62 79 20 74 68 69 73  t headed by this
6990: 0a 2a 2a 20 76 61 72 69 61 62 6c 65 3a 0a 2a 2f  .** variable:.*/
69a0: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 76  .static struct v
69b0: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78  xworksFileId *vx
69c0: 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20  worksFileList = 
69d0: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 70 6c 69  0;../*.** Simpli
69e0: 66 79 20 61 20 66 69 6c 65 6e 61 6d 65 20 69 6e  fy a filename in
69f0: 74 6f 20 69 74 73 20 63 61 6e 6f 6e 69 63 61 6c  to its canonical
6a00: 20 66 6f 72 6d 0a 2a 2a 20 62 79 20 6d 61 6b 69   form.** by maki
6a10: 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
6a20: 20 63 68 61 6e 67 65 73 3a 0a 2a 2a 0a 2a 2a 20   changes:.**.** 
6a30: 20 2a 20 72 65 6d 6f 76 69 6e 67 20 61 6e 79 20   * removing any 
6a40: 74 72 61 69 6c 69 6e 67 20 61 6e 64 20 64 75 70  trailing and dup
6a50: 6c 69 63 61 74 65 20 2f 0a 2a 2a 20 20 2a 20 63  licate /.**  * c
6a60: 6f 6e 76 65 72 74 20 2f 2e 2f 20 69 6e 74 6f 20  onvert /./ into 
6a70: 6a 75 73 74 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e  just /.**  * con
6a80: 76 65 72 74 20 2f 41 2f 2e 2e 2f 20 77 68 65 72  vert /A/../ wher
6a90: 65 20 41 20 69 73 20 61 6e 79 20 73 69 6d 70 6c  e A is any simpl
6aa0: 65 20 6e 61 6d 65 20 69 6e 74 6f 20 6a 75 73 74  e name into just
6ab0: 20 2f 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 73   /.**.** Changes
6ac0: 20 61 72 65 20 6d 61 64 65 20 69 6e 2d 70 6c 61   are made in-pla
6ad0: 63 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ce.  Return the 
6ae0: 6e 65 77 20 6e 61 6d 65 20 6c 65 6e 67 74 68 2e  new name length.
6af0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69  .**.** The origi
6b00: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  nal filename is 
6b10: 69 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20 20 52  in z[0..n-1].  R
6b20: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
6b30: 20 6f 66 0a 2a 2a 20 63 68 61 72 61 63 74 65 72   of.** character
6b40: 73 20 69 6e 20 74 68 65 20 73 69 6d 70 6c 69 66  s in the simplif
6b50: 69 65 64 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61  ied name..*/.sta
6b60: 74 69 63 20 69 6e 74 20 76 78 77 6f 72 6b 73 53  tic int vxworksS
6b70: 69 6d 70 6c 69 66 79 4e 61 6d 65 28 63 68 61 72  implifyName(char
6b80: 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69   *z, int n){.  i
6b90: 6e 74 20 69 2c 20 6a 3b 0a 20 20 77 68 69 6c 65  nt i, j;.  while
6ba0: 28 20 6e 3e 31 20 26 26 20 7a 5b 6e 2d 31 5d 3d  ( n>1 && z[n-1]=
6bb0: 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20  ='/' ){ n--; }. 
6bc0: 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b   for(i=j=0; i<n;
6bd0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a   i++){.    if( z
6be0: 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [i]=='/' ){.    
6bf0: 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2f    if( z[i+1]=='/
6c00: 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ' ) continue;.  
6c10: 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d      if( z[i+1]==
6c20: 27 2e 27 20 26 26 20 69 2b 32 3c 6e 20 26 26 20  '.' && i+2<n && 
6c30: 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20  z[i+2]=='/' ){. 
6c40: 20 20 20 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20         i += 1;. 
6c50: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
6c60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
6c70: 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26  f( z[i+1]=='.' &
6c80: 26 20 69 2b 33 3c 6e 20 26 26 20 7a 5b 69 2b 32  & i+3<n && z[i+2
6c90: 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b 69 2b 33 5d  ]=='.' && z[i+3]
6ca0: 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20  =='/' ){.       
6cb0: 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a   while( j>0 && z
6cc0: 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d  [j-1]!='/' ){ j-
6cd0: 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28  -; }.        if(
6ce0: 20 6a 3e 30 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20   j>0 ){ j--; }. 
6cf0: 20 20 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20         i += 2;. 
6d00: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
6d10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6d20: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d     z[j++] = z[i]
6d30: 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30  ;.  }.  z[j] = 0
6d40: 3b 0a 20 20 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a  ;.  return j;.}.
6d50: 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 75 6e  ./*.** Find a un
6d60: 69 71 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72  ique file ID for
6d70: 20 74 68 65 20 67 69 76 65 6e 20 61 62 73 6f 6c   the given absol
6d80: 75 74 65 20 70 61 74 68 6e 61 6d 65 2e 20 20 52  ute pathname.  R
6d90: 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
6da0: 65 72 20 74 6f 20 74 68 65 20 76 78 77 6f 72 6b  er to the vxwork
6db0: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20  sFileId object. 
6dc0: 20 54 68 69 73 20 70 6f 69 6e 74 65 72 20 69 73   This pointer is
6dd0: 20 74 68 65 20 75 6e 69 71 75 65 0a 2a 2a 20 66   the unique.** f
6de0: 69 6c 65 20 49 44 2e 0a 2a 2a 0a 2a 2a 20 54 68  ile ID..**.** Th
6df0: 65 20 6e 52 65 66 20 66 69 65 6c 64 20 6f 66 20  e nRef field of 
6e00: 74 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  the vxworksFileI
6e10: 64 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 63 72  d object is incr
6e20: 65 6d 65 6e 74 65 64 20 62 65 66 6f 72 65 0a 2a  emented before.*
6e30: 2a 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20  * the object is 
6e40: 72 65 74 75 72 6e 65 64 2e 20 20 41 20 6e 65 77  returned.  A new
6e50: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f   vxworksFileId o
6e60: 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64  bject is created
6e70: 0a 2a 2a 20 61 6e 64 20 61 64 64 65 64 20 74 6f  .** and added to
6e80: 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74   the global list
6e90: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
6ea0: 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79  *.** If a memory
6eb0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
6ec0: 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
6ed0: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63   NULL..*/.static
6ee0: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
6ef0: 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69  ileId *vxworksFi
6f00: 6e 64 46 69 6c 65 49 64 28 63 6f 6e 73 74 20 63  ndFileId(const c
6f10: 68 61 72 20 2a 7a 41 62 73 6f 6c 75 74 65 4e 61  har *zAbsoluteNa
6f20: 6d 65 29 7b 0a 20 20 73 74 72 75 63 74 20 76 78  me){.  struct vx
6f30: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65  worksFileId *pNe
6f40: 77 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65  w;         /* se
6f50: 61 72 63 68 20 6b 65 79 20 61 6e 64 20 6e 65 77  arch key and new
6f60: 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 73 74   file ID */.  st
6f70: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
6f80: 49 64 20 2a 70 43 61 6e 64 69 64 61 74 65 3b 20  Id *pCandidate; 
6f90: 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
6fa0: 20 6f 76 65 72 20 65 78 69 73 74 69 6e 67 20 66   over existing f
6fb0: 69 6c 65 20 49 44 73 20 2a 2f 0a 20 20 69 6e 74  ile IDs */.  int
6fc0: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
6fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6fe0: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 41   /* Length of zA
6ff0: 62 73 6f 6c 75 74 65 4e 61 6d 65 20 73 74 72 69  bsoluteName stri
7000: 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ng */..  assert(
7010: 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 5b 30   zAbsoluteName[0
7020: 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20 6e 20 3d 20  ]=='/' );.  n = 
7030: 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 41 62 73  (int)strlen(zAbs
7040: 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a 20 20 70 4e  oluteName);.  pN
7050: 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ew = sqlite3_mal
7060: 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70  loc64( sizeof(*p
7070: 4e 65 77 29 20 2b 20 28 6e 2b 31 29 20 29 3b 0a  New) + (n+1) );.
7080: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
7090: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
70a0: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
70b0: 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b   = (char*)&pNew[
70c0: 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65  1];.  memcpy(pNe
70d0: 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  w->zCanonicalNam
70e0: 65 2c 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65  e, zAbsoluteName
70f0: 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20 76 78  , n+1);.  n = vx
7100: 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d  worksSimplifyNam
7110: 65 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63  e(pNew->zCanonic
7120: 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20 20 2f  alName, n);..  /
7130: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20  * Search for an 
7140: 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20 74  existing entry t
7150: 68 61 74 20 6d 61 74 63 68 69 6e 67 20 74 68 65  hat matching the
7160: 20 63 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65 2e   canonical name.
7170: 0a 20 20 2a 2a 20 49 66 20 66 6f 75 6e 64 2c 20  .  ** If found, 
7180: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  increment the re
7190: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 61 6e  ference count an
71a0: 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
71b0: 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65  er to.  ** the e
71c0: 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44 2e  xisting file ID.
71d0: 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65  .  */.  unixEnte
71e0: 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 28  rMutex();.  for(
71f0: 70 43 61 6e 64 69 64 61 74 65 3d 76 78 77 6f 72  pCandidate=vxwor
7200: 6b 73 46 69 6c 65 4c 69 73 74 3b 20 70 43 61 6e  ksFileList; pCan
7210: 64 69 64 61 74 65 3b 20 70 43 61 6e 64 69 64 61  didate; pCandida
7220: 74 65 3d 70 43 61 6e 64 69 64 61 74 65 2d 3e 70  te=pCandidate->p
7230: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
7240: 43 61 6e 64 69 64 61 74 65 2d 3e 6e 4e 61 6d 65  Candidate->nName
7250: 3d 3d 6e 20 0a 20 20 20 20 20 26 26 20 6d 65 6d  ==n .     && mem
7260: 63 6d 70 28 70 43 61 6e 64 69 64 61 74 65 2d 3e  cmp(pCandidate->
7270: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20  zCanonicalName, 
7280: 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  pNew->zCanonical
7290: 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20 20 20  Name, n)==0.    
72a0: 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65  ){.       sqlite
72b0: 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  3_free(pNew);.  
72c0: 20 20 20 20 20 70 43 61 6e 64 69 64 61 74 65 2d       pCandidate-
72d0: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRef++;.       
72e0: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
72f0: 3b 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  ;.       return 
7300: 70 43 61 6e 64 69 64 61 74 65 3b 0a 20 20 20 20  pCandidate;.    
7310: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d  }.  }..  /* No m
7320: 61 74 63 68 20 77 61 73 20 66 6f 75 6e 64 2e 20  atch was found. 
7330: 20 57 65 20 77 69 6c 6c 20 6d 61 6b 65 20 61 20   We will make a 
7340: 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20  new file ID */. 
7350: 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b   pNew->nRef = 1;
7360: 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65 20 3d  .  pNew->nName =
7370: 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78   n;.  pNew->pNex
7380: 74 20 3d 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c  t = vxworksFileL
7390: 69 73 74 3b 0a 20 20 76 78 77 6f 72 6b 73 46 69  ist;.  vxworksFi
73a0: 6c 65 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20  leList = pNew;. 
73b0: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
73c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  );.  return pNew
73d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65  ;.}../*.** Decre
73e0: 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
73f0: 63 65 20 63 6f 75 6e 74 20 6f 6e 20 61 20 76 78  ce count on a vx
7400: 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65  worksFileId obje
7410: 63 74 2e 20 20 46 72 65 65 0a 2a 2a 20 74 68 65  ct.  Free.** the
7420: 20 6f 62 6a 65 63 74 20 77 68 65 6e 20 74 68 65   object when the
7430: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
7440: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 0a 2a   reaches zero..*
7450: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 78  /.static void vx
7460: 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65  worksReleaseFile
7470: 49 64 28 73 74 72 75 63 74 20 76 78 77 6f 72 6b  Id(struct vxwork
7480: 73 46 69 6c 65 49 64 20 2a 70 49 64 29 7b 0a 20  sFileId *pId){. 
7490: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
74a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  );.  assert( pId
74b0: 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 49  ->nRef>0 );.  pI
74c0: 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  d->nRef--;.  if(
74d0: 20 70 49 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pId->nRef==0 ){
74e0: 0a 20 20 20 20 73 74 72 75 63 74 20 76 78 77 6f  .    struct vxwo
74f0: 72 6b 73 46 69 6c 65 49 64 20 2a 2a 70 70 3b 0a  rksFileId **pp;.
7500: 20 20 20 20 66 6f 72 28 70 70 3d 26 76 78 77 6f      for(pp=&vxwo
7510: 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 2a 70 70  rksFileList; *pp
7520: 20 26 26 20 2a 70 70 21 3d 70 49 64 3b 20 70 70   && *pp!=pId; pp
7530: 20 3d 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78   = &((*pp)->pNex
7540: 74 29 29 7b 7d 0a 20 20 20 20 61 73 73 65 72 74  t)){}.    assert
7550: 28 20 2a 70 70 3d 3d 70 49 64 20 29 3b 0a 20 20  ( *pp==pId );.  
7560: 20 20 2a 70 70 20 3d 20 70 49 64 2d 3e 70 4e 65    *pp = pId->pNe
7570: 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  xt;.    sqlite3_
7580: 66 72 65 65 28 70 49 64 29 3b 0a 20 20 7d 0a 20  free(pId);.  }. 
7590: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
75a0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f  );.}.#endif /* O
75b0: 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a  S_VXWORKS */./**
75c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
75d0: 64 20 6f 66 20 55 6e 69 71 75 65 20 46 69 6c 65  d of Unique File
75e0: 20 49 44 20 55 74 69 6c 69 74 79 20 55 73 65 64   ID Utility Used
75f0: 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a   By VxWorks ****
7600: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
7610: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f  ***********/.../
7660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
76a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
76b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
76c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73 69 78  ********** Posix
76d0: 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e   Advisory Lockin
76e0: 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
76f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
7700: 2a 0a 2a 2a 20 50 4f 53 49 58 20 61 64 76 69 73  *.** POSIX advis
7710: 6f 72 79 20 6c 6f 63 6b 73 20 61 72 65 20 62 72  ory locks are br
7720: 6f 6b 65 6e 20 62 79 20 64 65 73 69 67 6e 2e 20  oken by design. 
7730: 20 41 4e 53 49 20 53 54 44 20 31 30 30 33 2e 31   ANSI STD 1003.1
7740: 20 28 31 39 39 36 29 0a 2a 2a 20 73 65 63 74 69   (1996).** secti
7750: 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73  on 6.5.2.2 lines
7760: 20 34 38 33 20 74 68 72 6f 75 67 68 20 34 39 30   483 through 490
7770: 20 73 70 65 63 69 66 79 20 74 68 61 74 20 77 68   specify that wh
7780: 65 6e 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20  en a process.** 
7790: 73 65 74 73 20 6f 72 20 63 6c 65 61 72 73 20 61  sets or clears a
77a0: 20 6c 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65 72   lock, that oper
77b0: 61 74 69 6f 6e 20 6f 76 65 72 72 69 64 65 73 20  ation overrides 
77c0: 61 6e 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20  any prior locks 
77d0: 73 65 74 0a 2a 2a 20 62 79 20 74 68 65 20 73 61  set.** by the sa
77e0: 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 49 74 20  me process.  It 
77f0: 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69 63 69  does not explici
7800: 74 6c 79 20 73 61 79 20 73 6f 2c 20 62 75 74 20  tly say so, but 
7810: 74 68 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20  this implies.** 
7820: 74 68 61 74 20 69 74 20 6f 76 65 72 72 69 64 65  that it override
7830: 73 20 6c 6f 63 6b 73 20 73 65 74 20 62 79 20 74  s locks set by t
7840: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  he same process 
7850: 75 73 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e  using a differen
7860: 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69  t.** file descri
7870: 70 74 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72 20  ptor.  Consider 
7880: 74 68 69 73 20 74 65 73 74 20 63 61 73 65 3a 0a  this test case:.
7890: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20  **.**       int 
78a0: 66 64 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69  fd1 = open("./fi
78b0: 6c 65 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43  le1", O_RDWR|O_C
78c0: 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20  REAT, 0644);.** 
78d0: 20 20 20 20 20 20 69 6e 74 20 66 64 32 20 3d 20        int fd2 = 
78e0: 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20  open("./file2", 
78f0: 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20  O_RDWR|O_CREAT, 
7900: 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70  0644);.**.** Sup
7910: 70 6f 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64  pose ./file1 and
7920: 20 2e 2f 66 69 6c 65 32 20 61 72 65 20 72 65 61   ./file2 are rea
7930: 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 66 69 6c  lly the same fil
7940: 65 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e  e (because.** on
7950: 65 20 69 73 20 61 20 68 61 72 64 20 6f 72 20 73  e is a hard or s
7960: 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20  ymbolic link to 
7970: 74 68 65 20 6f 74 68 65 72 29 20 74 68 65 6e 20  the other) then 
7980: 69 66 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e  if you set.** an
7990: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
79a0: 6f 6e 20 66 64 31 2c 20 74 68 65 6e 20 74 72 79  on fd1, then try
79b0: 20 74 6f 20 67 65 74 20 61 6e 20 65 78 63 6c 75   to get an exclu
79c0: 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20  sive lock.** on 
79d0: 66 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20  fd2, it works.  
79e0: 49 20 77 6f 75 6c 64 20 68 61 76 65 20 65 78 70  I would have exp
79f0: 65 63 74 65 64 20 74 68 65 20 73 65 63 6f 6e 64  ected the second
7a00: 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c   lock to.** fail
7a10: 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 61 73   since there was
7a20: 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20   already a lock 
7a30: 6f 6e 20 74 68 65 20 66 69 6c 65 20 64 75 65 20  on the file due 
7a40: 74 6f 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e  to fd1..** But n
7a50: 6f 74 20 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f  ot so.  Since bo
7a60: 74 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72  th locks came fr
7a70: 6f 6d 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  om the same proc
7a80: 65 73 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f  ess, the.** seco
7a90: 6e 64 20 6f 76 65 72 72 69 64 65 73 20 74 68 65  nd overrides the
7aa0: 20 66 69 72 73 74 2c 20 65 76 65 6e 20 74 68 6f   first, even tho
7ab0: 75 67 68 20 74 68 65 79 20 77 65 72 65 20 6f 6e  ugh they were on
7ac0: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69   different.** fi
7ad0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f  le descriptors o
7ae0: 70 65 6e 65 64 20 6f 6e 20 64 69 66 66 65 72 65  pened on differe
7af0: 6e 74 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a  nt file names..*
7b00: 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73 20  *.** This means 
7b10: 74 68 61 74 20 77 65 20 63 61 6e 6e 6f 74 20 75  that we cannot u
7b20: 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 74  se POSIX locks t
7b30: 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 66 69  o synchronize fi
7b40: 6c 65 20 61 63 63 65 73 73 0a 2a 2a 20 61 6d 6f  le access.** amo
7b50: 6e 67 20 63 6f 6d 70 65 74 69 6e 67 20 74 68 72  ng competing thr
7b60: 65 61 64 73 20 6f 66 20 74 68 65 20 73 61 6d 65  eads of the same
7b70: 20 70 72 6f 63 65 73 73 2e 20 20 50 4f 53 49 58   process.  POSIX
7b80: 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77 6f 72 6b   locks will work
7b90: 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e 63   fine.** to sync
7ba0: 68 72 6f 6e 69 7a 65 20 61 63 63 65 73 73 20 66  hronize access f
7bb0: 6f 72 20 74 68 72 65 61 64 73 20 69 6e 20 73 65  or threads in se
7bc0: 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 65 73  parate processes
7bd0: 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20 74 68 72  , but not.** thr
7be0: 65 61 64 73 20 77 69 74 68 69 6e 20 74 68 65 20  eads within the 
7bf0: 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a 2a 2a  same process..**
7c00: 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75  .** To work arou
7c10: 6e 64 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c 20  nd the problem, 
7c20: 53 51 4c 69 74 65 20 68 61 73 20 74 6f 20 6d 61  SQLite has to ma
7c30: 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63 6b 73 20  nage file locks 
7c40: 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e  internally.** on
7c50: 20 69 74 73 20 6f 77 6e 2e 20 20 57 68 65 6e 65   its own.  Whene
7c60: 76 65 72 20 61 20 6e 65 77 20 64 61 74 61 62 61  ver a new databa
7c70: 73 65 20 69 73 20 6f 70 65 6e 65 64 2c 20 77 65  se is opened, we
7c80: 20 68 61 76 65 20 74 6f 20 66 69 6e 64 20 74 68   have to find th
7c90: 65 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 69 6e  e.** specific in
7ca0: 6f 64 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ode of the datab
7cb0: 61 73 65 20 66 69 6c 65 20 28 74 68 65 20 69 6e  ase file (the in
7cc0: 6f 64 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65  ode is determine
7cd0: 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 5f 64  d by the.** st_d
7ce0: 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f 20 66 69  ev and st_ino fi
7cf0: 65 6c 64 73 20 6f 66 20 74 68 65 20 73 74 61 74  elds of the stat
7d00: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
7d10: 66 73 74 61 74 28 29 20 66 69 6c 6c 73 20 69 6e  fstat() fills in
7d20: 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63 6b 20 66  ).** and check f
7d30: 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65 61 64 79  or locks already
7d40: 20 65 78 69 73 74 69 6e 67 20 6f 6e 20 74 68 61   existing on tha
7d50: 74 20 69 6e 6f 64 65 2e 20 20 57 68 65 6e 20 6c  t inode.  When l
7d60: 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63 72 65 61  ocks are.** crea
7d70: 74 65 64 20 6f 72 20 72 65 6d 6f 76 65 64 2c 20  ted or removed, 
7d80: 77 65 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b 20  we have to look 
7d90: 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e 74 65 72  at our own inter
7da0: 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68  nal record of th
7db0: 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20 73 65  e.** locks to se
7dc0: 65 20 69 66 20 61 6e 6f 74 68 65 72 20 74 68 72  e if another thr
7dd0: 65 61 64 20 68 61 73 20 70 72 65 76 69 6f 75 73  ead has previous
7de0: 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b 20 6f 6e  ly set a lock on
7df0: 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 69 6e   that same.** in
7e00: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73 69 64  ode..**.** (Asid
7e10: 65 3a 20 54 68 65 20 75 73 65 20 6f 66 20 69 6e  e: The use of in
7e20: 6f 64 65 20 6e 75 6d 62 65 72 73 20 61 73 20 75  ode numbers as u
7e30: 6e 69 71 75 65 20 49 44 73 20 64 6f 65 73 20 6e  nique IDs does n
7e40: 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72  ot work on VxWor
7e50: 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56 78 57 6f 72  ks..** For VxWor
7e60: 6b 73 2c 20 77 65 20 68 61 76 65 20 74 6f 20 75  ks, we have to u
7e70: 73 65 20 74 68 65 20 61 6c 74 65 72 6e 61 74 69  se the alternati
7e80: 76 65 20 75 6e 69 71 75 65 20 49 44 20 73 79 73  ve unique ID sys
7e90: 74 65 6d 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  tem based on.** 
7ea0: 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61  canonical filena
7eb0: 6d 65 20 61 6e 64 20 69 6d 70 6c 65 6d 65 6e 74  me and implement
7ec0: 65 64 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  ed in the previo
7ed0: 75 73 20 64 69 76 69 73 69 6f 6e 2e 29 0a 2a 2a  us division.).**
7ee0: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f  .** The sqlite3_
7ef0: 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 66  file structure f
7f00: 6f 72 20 50 4f 53 49 58 20 69 73 20 6e 6f 20 6c  or POSIX is no l
7f10: 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e 20 69 6e  onger just an in
7f20: 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65  teger file.** de
7f30: 73 63 72 69 70 74 6f 72 2e 20 20 49 74 20 69 73  scriptor.  It is
7f40: 20 6e 6f 77 20 61 20 73 74 72 75 63 74 75 72 65   now a structure
7f50: 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
7f60: 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20  integer file.** 
7f70: 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 20 61  descriptor and a
7f80: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
7f90: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
7fa0: 63 72 69 62 65 73 20 74 68 65 20 69 6e 74 65 72  cribes the inter
7fb0: 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20  nal.** locks on 
7fc0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
7fd0: 67 20 69 6e 6f 64 65 2e 20 20 54 68 65 72 65 20  g inode.  There 
7fe0: 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 73  is one locking s
7ff0: 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20  tructure.** per 
8000: 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20 74 68 65  inode, so if the
8010: 20 73 61 6d 65 20 69 6e 6f 64 65 20 69 73 20 6f   same inode is o
8020: 70 65 6e 65 64 20 74 77 69 63 65 2c 20 62 6f 74  pened twice, bot
8030: 68 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  h unixFile struc
8040: 74 75 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20 74  tures.** point t
8050: 6f 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69  o the same locki
8060: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  ng structure.  T
8070: 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63  he locking struc
8080: 74 75 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61 20  ture keeps.** a 
8090: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
80a0: 28 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77  (so we will know
80b0: 20 77 68 65 6e 20 74 6f 20 64 65 6c 65 74 65 20   when to delete 
80c0: 69 74 29 20 61 6e 64 20 61 20 22 63 6e 74 22 0a  it) and a "cnt".
80d0: 2a 2a 20 66 69 65 6c 64 20 74 68 61 74 20 74 65  ** field that te
80e0: 6c 6c 73 20 75 73 20 69 74 73 20 69 6e 74 65 72  lls us its inter
80f0: 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73 2e  nal lock status.
8100: 20 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74    cnt==0 means t
8110: 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75 6e  he.** file is un
8120: 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d 31  locked.  cnt==-1
8130: 20 6d 65 61 6e 73 20 74 68 65 20 66 69 6c 65 20   means the file 
8140: 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65  has an exclusive
8150: 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20   lock..** cnt>0 
8160: 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72 65 20  means there are 
8170: 63 6e 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  cnt shared locks
8180: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a   on the file..**
8190: 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70 74 20  .** Any attempt 
81a0: 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63  to lock or unloc
81b0: 6b 20 61 20 66 69 6c 65 20 66 69 72 73 74 20 63  k a file first c
81c0: 68 65 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69 6e  hecks the lockin
81d0: 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20  g.** structure. 
81e0: 20 54 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73   The fcntl() sys
81f0: 74 65 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c 79  tem call is only
8200: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20   invoked to set 
8210: 61 20 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b  a .** POSIX lock
8220: 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c   if the internal
8230: 20 6c 6f 63 6b 20 73 74 72 75 63 74 75 72 65 20   lock structure 
8240: 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 65 74 77  transitions betw
8250: 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64 20  een.** a locked 
8260: 61 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20  and an unlocked 
8270: 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42 75 74  state..**.** But
8280: 20 77 61 69 74 3a 20 20 74 68 65 72 65 20 61 72   wait:  there ar
8290: 65 20 79 65 74 20 6d 6f 72 65 20 70 72 6f 62 6c  e yet more probl
82a0: 65 6d 73 20 77 69 74 68 20 50 4f 53 49 58 20 61  ems with POSIX a
82b0: 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 0a 2a  dvisory locks..*
82c0: 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f 73  *.** If you clos
82d0: 65 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  e a file descrip
82e0: 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20  tor that points 
82f0: 74 6f 20 61 20 66 69 6c 65 20 74 68 61 74 20 68  to a file that h
8300: 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c  as locks,.** all
8310: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20 66   locks on that f
8320: 69 6c 65 20 74 68 61 74 20 61 72 65 20 6f 77 6e  ile that are own
8330: 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e  ed by the curren
8340: 74 20 70 72 6f 63 65 73 73 20 61 72 65 0a 2a 2a  t process are.**
8350: 20 72 65 6c 65 61 73 65 64 2e 20 20 54 6f 20 77   released.  To w
8360: 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 20  ork around this 
8370: 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68 20 75 6e  problem, each un
8380: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
8390: 63 74 0a 2a 2a 20 6d 61 69 6e 74 61 69 6e 73 20  ct.** maintains 
83a0: 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e  a count of the n
83b0: 75 6d 62 65 72 20 6f 66 20 70 65 6e 64 69 6e 67  umber of pending
83c0: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 20 69 6e   locks on tha in
83d0: 6f 64 65 2e 0a 2a 2a 20 57 68 65 6e 20 61 6e 20  ode..** When an 
83e0: 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
83f0: 74 6f 20 63 6c 6f 73 65 20 61 6e 20 75 6e 69 78  to close an unix
8400: 46 69 6c 65 2c 20 69 66 20 74 68 65 72 65 20 61  File, if there a
8410: 72 65 0a 2a 2a 20 6f 74 68 65 72 20 75 6e 69 78  re.** other unix
8420: 46 69 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65  File open on the
8430: 20 73 61 6d 65 20 69 6e 6f 64 65 20 74 68 61 74   same inode that
8440: 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63   are holding loc
8450: 6b 73 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20  ks, the call.** 
8460: 74 6f 20 63 6c 6f 73 65 28 29 20 74 68 65 20 66  to close() the f
8470: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
8480: 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c  s deferred until
8490: 20 61 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b   all of the lock
84a0: 73 20 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20  s clear..** The 
84b0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74  unixInodeInfo st
84c0: 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 61 20  ructure keeps a 
84d0: 6c 69 73 74 20 6f 66 20 66 69 6c 65 20 64 65 73  list of file des
84e0: 63 72 69 70 74 6f 72 73 20 74 68 61 74 20 6e 65  criptors that ne
84f0: 65 64 20 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73  ed to.** be clos
8500: 65 64 20 61 6e 64 20 74 68 61 74 20 6c 69 73 74  ed and that list
8510: 20 69 73 20 77 61 6c 6b 65 64 20 28 61 6e 64 20   is walked (and 
8520: 63 6c 65 61 72 65 64 29 20 77 68 65 6e 20 74 68  cleared) when th
8530: 65 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63  e last lock.** c
8540: 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74  lears..**.** Yet
8550: 20 61 6e 6f 74 68 65 72 20 70 72 6f 62 6c 65 6d   another problem
8560: 3a 20 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20  :  LinuxThreads 
8570: 64 6f 20 6e 6f 74 20 70 6c 61 79 20 77 65 6c 6c  do not play well
8580: 20 77 69 74 68 20 70 6f 73 69 78 20 6c 6f 63 6b   with posix lock
8590: 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c  s..**.** Many ol
85a0: 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  der versions of 
85b0: 6c 69 6e 75 78 20 75 73 65 20 74 68 65 20 4c 69  linux use the Li
85c0: 6e 75 78 54 68 72 65 61 64 73 20 6c 69 62 72 61  nuxThreads libra
85d0: 72 79 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 6e  ry which is.** n
85e0: 6f 74 20 70 6f 73 69 78 20 63 6f 6d 70 6c 69 61  ot posix complia
85f0: 6e 74 2e 20 20 55 6e 64 65 72 20 4c 69 6e 75 78  nt.  Under Linux
8600: 54 68 72 65 61 64 73 2c 20 61 20 6c 6f 63 6b 20  Threads, a lock 
8610: 63 72 65 61 74 65 64 20 62 79 20 74 68 72 65 61  created by threa
8620: 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f 74 20 62 65  d.** A cannot be
8630: 20 6d 6f 64 69 66 69 65 64 20 6f 72 20 6f 76 65   modified or ove
8640: 72 72 69 64 64 65 6e 20 62 79 20 61 20 64 69 66  rridden by a dif
8650: 66 65 72 65 6e 74 20 74 68 72 65 61 64 20 42 2e  ferent thread B.
8660: 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72 65 61 64 20  .** Only thread 
8670: 41 20 63 61 6e 20 6d 6f 64 69 66 79 20 74 68 65  A can modify the
8680: 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20   lock.  Locking 
8690: 62 65 68 61 76 69 6f 72 20 69 73 20 63 6f 72 72  behavior is corr
86a0: 65 63 74 0a 2a 2a 20 69 66 20 74 68 65 20 61 70  ect.** if the ap
86b0: 70 6c 69 61 74 69 6f 6e 20 75 73 65 73 20 74 68  pliation uses th
86c0: 65 20 6e 65 77 65 72 20 4e 61 74 69 76 65 20 50  e newer Native P
86d0: 6f 73 69 78 20 54 68 72 65 61 64 20 4c 69 62 72  osix Thread Libr
86e0: 61 72 79 20 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e  ary (NPTL).** on
86f0: 20 6c 69 6e 75 78 20 2d 20 77 69 74 68 20 4e 50   linux - with NP
8700: 54 4c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65  TL a lock create
8710: 64 20 62 79 20 74 68 72 65 61 64 20 41 20 63 61  d by thread A ca
8720: 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73  n override locks
8730: 0a 2a 2a 20 69 6e 20 74 68 72 65 61 64 20 42 2e  .** in thread B.
8740: 20 20 42 75 74 20 74 68 65 72 65 20 69 73 20 6e    But there is n
8750: 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74  o way to know at
8760: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68   compile-time wh
8770: 69 63 68 0a 2a 2a 20 74 68 72 65 61 64 69 6e 67  ich.** threading
8780: 20 6c 69 62 72 61 72 79 20 69 73 20 62 65 69 6e   library is bein
8790: 67 20 75 73 65 64 2e 20 20 53 6f 20 74 68 65 72  g used.  So ther
87a0: 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b  e is no way to k
87b0: 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c  now at.** compil
87c0: 65 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f  e-time whether o
87d0: 72 20 6e 6f 74 20 74 68 72 65 61 64 20 41 20 63  r not thread A c
87e0: 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b  an override lock
87f0: 73 20 6f 6e 20 74 68 72 65 61 64 20 42 2e 0a 2a  s on thread B..*
8800: 2a 20 4f 6e 65 20 68 61 73 20 74 6f 20 64 6f 20  * One has to do 
8810: 61 20 72 75 6e 2d 74 69 6d 65 20 63 68 65 63 6b  a run-time check
8820: 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65   to discover the
8830: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65   behavior of the
8840: 0a 2a 2a 20 63 75 72 72 65 6e 74 20 70 72 6f 63  .** current proc
8850: 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74  ess..**.** SQLit
8860: 65 20 75 73 65 64 20 74 6f 20 73 75 70 70 6f 72  e used to suppor
8870: 74 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2e 20  t LinuxThreads. 
8880: 20 42 75 74 20 73 75 70 70 6f 72 74 20 66 6f 72   But support for
8890: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 0a 2a 2a   LinuxThreads.**
88a0: 20 77 61 73 20 64 72 6f 70 70 65 64 20 62 65 67   was dropped beg
88b0: 69 6e 6e 69 6e 67 20 77 69 74 68 20 76 65 72 73  inning with vers
88c0: 69 6f 6e 20 33 2e 37 2e 30 2e 20 20 53 51 4c 69  ion 3.7.0.  SQLi
88d0: 74 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 77 6f  te will still wo
88e0: 72 6b 20 77 69 74 68 0a 2a 2a 20 4c 69 6e 75 78  rk with.** Linux
88f0: 54 68 72 65 61 64 73 20 70 72 6f 76 69 64 65 64  Threads provided
8900: 20 74 68 61 74 20 28 31 29 20 74 68 65 72 65 20   that (1) there 
8910: 69 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20  is no more than 
8920: 6f 6e 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  one connection .
8930: 2a 2a 20 70 65 72 20 64 61 74 61 62 61 73 65 20  ** per database 
8940: 66 69 6c 65 20 69 6e 20 74 68 65 20 73 61 6d 65  file in the same
8950: 20 70 72 6f 63 65 73 73 20 61 6e 64 20 28 32 29   process and (2)
8960: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
8970: 74 69 6f 6e 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20  tions.** do not 
8980: 6d 6f 76 65 20 61 63 72 6f 73 73 20 74 68 72 65  move across thre
8990: 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  ads..*/../*.** A
89a0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
89b0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
89c0: 63 74 75 72 65 20 73 65 72 76 65 73 20 61 73 20  cture serves as 
89d0: 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20  the key used.** 
89e0: 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 72 74  to locate a part
89f0: 69 63 75 6c 61 72 20 75 6e 69 78 49 6e 6f 64 65  icular unixInode
8a00: 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  Info object..*/.
8a10: 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49  struct unixFileI
8a20: 64 20 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b  d {.  dev_t dev;
8a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a40: 20 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62    /* Device numb
8a50: 65 72 20 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57  er */.#if OS_VXW
8a60: 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 76 78  ORKS.  struct vx
8a70: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64  worksFileId *pId
8a80: 3b 20 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c  ;  /* Unique fil
8a90: 65 20 49 44 20 66 6f 72 20 76 78 77 6f 72 6b 73  e ID for vxworks
8aa0: 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 69 6e 6f  . */.#else.  ino
8ab0: 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20 20 20 20  _t ino;         
8ac0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 6f 64           /* Inod
8ad0: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 65 6e 64  e number */.#end
8ae0: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  if.};../*.** An 
8af0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
8b00: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
8b10: 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
8b20: 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a   for each open.*
8b30: 2a 20 69 6e 6f 64 65 2e 20 20 4f 72 2c 20 6f 6e  * inode.  Or, on
8b40: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2c 20 74   LinuxThreads, t
8b50: 68 65 72 65 20 69 73 20 6f 6e 65 20 6f 66 20 74  here is one of t
8b60: 68 65 73 65 20 73 74 72 75 63 74 75 72 65 73 20  hese structures 
8b70: 66 6f 72 0a 2a 2a 20 65 61 63 68 20 69 6e 6f 64  for.** each inod
8b80: 65 20 6f 70 65 6e 65 64 20 62 79 20 65 61 63 68  e opened by each
8b90: 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41   thread..**.** A
8ba0: 20 73 69 6e 67 6c 65 20 69 6e 6f 64 65 20 63 61   single inode ca
8bb0: 6e 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20  n have multiple 
8bc0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
8bd0: 2c 20 73 6f 20 65 61 63 68 20 75 6e 69 78 46 69  , so each unixFi
8be0: 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  le.** structure 
8bf0: 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
8c00: 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63  er to an instanc
8c10: 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74  e of this object
8c20: 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20 6f 62 6a   and this.** obj
8c30: 65 63 74 20 6b 65 65 70 73 20 61 20 63 6f 75 6e  ect keeps a coun
8c40: 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  t of the number 
8c50: 6f 66 20 75 6e 69 78 46 69 6c 65 20 70 6f 69 6e  of unixFile poin
8c60: 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73  ting to it..*/.s
8c70: 74 72 75 63 74 20 75 6e 69 78 49 6e 6f 64 65 49  truct unixInodeI
8c80: 6e 66 6f 20 7b 0a 20 20 73 74 72 75 63 74 20 75  nfo {.  struct u
8c90: 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64  nixFileId fileId
8ca0: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c  ;       /* The l
8cb0: 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69  ookup key */.  i
8cc0: 6e 74 20 6e 53 68 61 72 65 64 3b 20 20 20 20 20  nt nShared;     
8cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8ce0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 53 48 41 52  * Number of SHAR
8cf0: 45 44 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ED locks held */
8d00: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
8d10: 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20 20   eFileLock;     
8d20: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 48 41     /* One of SHA
8d30: 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56  RED_LOCK, RESERV
8d40: 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a  ED_LOCK etc. */.
8d50: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
8d60: 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3b 20 20 20  bProcessLock;   
8d70: 20 20 2f 2a 20 41 6e 20 65 78 63 6c 75 73 69 76    /* An exclusiv
8d80: 65 20 70 72 6f 63 65 73 73 20 6c 6f 63 6b 20 69  e process lock i
8d90: 73 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20  s held */.  int 
8da0: 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
8db0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
8dc0: 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72  umber of pointer
8dd0: 73 20 74 6f 20 74 68 69 73 20 73 74 72 75 63 74  s to this struct
8de0: 75 72 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ure */.  unixShm
8df0: 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20  Node *pShmNode; 
8e00: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72           /* Shar
8e10: 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ed memory associ
8e20: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 69  ated with this i
8e30: 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  node */.  int nL
8e40: 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ock;            
8e50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8e60: 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69  ber of outstandi
8e70: 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 2a 2f  ng file locks */
8e80: 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
8e90: 2a 70 55 6e 75 73 65 64 3b 20 20 20 20 20 20 20  *pUnused;       
8ea0: 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 66 69 6c     /* Unused fil
8eb0: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 74 6f  e descriptors to
8ec0: 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 75 6e 69 78   close */.  unix
8ed0: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 4e 65 78 74  InodeInfo *pNext
8ee0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
8ef0: 69 73 74 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49  ist of all unixI
8f00: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73  nodeInfo objects
8f10: 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49   */.  unixInodeI
8f20: 6e 66 6f 20 2a 70 50 72 65 76 3b 20 20 20 20 20  nfo *pPrev;     
8f30: 20 20 20 20 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e        /*    ....
8f40: 20 64 6f 75 62 6c 79 20 6c 69 6e 6b 65 64 20 2a   doubly linked *
8f50: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  /.#if SQLITE_ENA
8f60: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
8f70: 45 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  E.  unsigned lon
8f80: 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 42 79 74  g long sharedByt
8f90: 65 3b 20 20 2f 2a 20 66 6f 72 20 41 46 50 20 73  e;  /* for AFP s
8fa0: 69 6d 75 6c 61 74 65 64 20 73 68 61 72 65 64 20  imulated shared 
8fb0: 6c 6f 63 6b 20 2a 2f 0a 23 65 6e 64 69 66 0a 23  lock */.#endif.#
8fc0: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
8fd0: 73 65 6d 5f 74 20 2a 70 53 65 6d 3b 20 20 20 20  sem_t *pSem;    
8fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ff0: 2f 2a 20 4e 61 6d 65 64 20 50 4f 53 49 58 20 73  /* Named POSIX s
9000: 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 20 20 63 68  emaphore */.  ch
9010: 61 72 20 61 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f  ar aSemName[MAX_
9020: 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 20 20 2f 2a  PATHNAME+2];  /*
9030: 20 4e 61 6d 65 20 6f 66 20 74 68 61 74 20 73 65   Name of that se
9040: 6d 61 70 68 6f 72 65 20 2a 2f 0a 23 65 6e 64 69  maphore */.#endi
9050: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69  f.};../*.** A li
9060: 73 74 73 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49  sts of all unixI
9070: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73  nodeInfo objects
9080: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 69 78  ..*/.static unix
9090: 49 6e 6f 64 65 49 6e 66 6f 20 2a 69 6e 6f 64 65  InodeInfo *inode
90a0: 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  List = 0;../*.**
90b0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
90c0: 6e 20 2d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  n - unixLogError
90d0: 41 74 4c 69 6e 65 28 29 2c 20 69 73 20 6f 6e 6c  AtLine(), is onl
90e0: 79 20 65 76 65 72 20 63 61 6c 6c 65 64 20 76 69  y ever called vi
90f0: 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 75  a the macro.** u
9100: 6e 69 78 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a  nixLogError()..*
9110: 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6e 76 6f 6b  *.** It is invok
9120: 65 64 20 61 66 74 65 72 20 61 6e 20 65 72 72 6f  ed after an erro
9130: 72 20 6f 63 63 75 72 73 20 69 6e 20 61 6e 20 4f  r occurs in an O
9140: 53 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 65  S function and e
9150: 72 72 6e 6f 20 68 61 73 20 62 65 65 6e 0a 2a 2a  rrno has been.**
9160: 20 73 65 74 2e 20 49 74 20 6c 6f 67 73 20 61 20   set. It logs a 
9170: 6d 65 73 73 61 67 65 20 75 73 69 6e 67 20 73 71  message using sq
9180: 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74  lite3_log() cont
9190: 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65  aining the curre
91a0: 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65  nt value of.** e
91b0: 72 72 6e 6f 20 61 6e 64 2c 20 69 66 20 70 6f 73  rrno and, if pos
91c0: 73 69 62 6c 65 2c 20 74 68 65 20 68 75 6d 61 6e  sible, the human
91d0: 2d 72 65 61 64 61 62 6c 65 20 65 71 75 69 76 61  -readable equiva
91e0: 6c 65 6e 74 20 66 72 6f 6d 20 73 74 72 65 72 72  lent from strerr
91f0: 6f 72 28 29 20 6f 72 0a 2a 2a 20 73 74 72 65 72  or() or.** strer
9200: 72 6f 72 5f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  ror_r()..**.** T
9210: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
9220: 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  t passed to the 
9230: 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 20  macro should be 
9240: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74  the error code t
9250: 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72  hat.** will be r
9260: 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74  eturned to SQLit
9270: 65 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49  e (e.g. SQLITE_I
9280: 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c  OERR_DELETE, SQL
9290: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 20 0a  ITE_CANTOPEN). .
92a0: 2a 2a 20 54 68 65 20 74 77 6f 20 73 75 62 73 65  ** The two subse
92b0: 71 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20  quent arguments 
92c0: 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6e 61  should be the na
92d0: 6d 65 20 6f 66 20 74 68 65 20 4f 53 20 66 75 6e  me of the OS fun
92e0: 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61  ction that.** fa
92f0: 69 6c 65 64 20 28 65 2e 67 2e 20 22 75 6e 6c 69  iled (e.g. "unli
9300: 6e 6b 22 2c 20 22 6f 70 65 6e 22 29 20 61 6e 64  nk", "open") and
9310: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
9320: 66 69 6c 65 2d 73 79 73 74 65 6d 20 70 61 74 68  file-system path
9330: 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a  ,.** if any..*/.
9340: 23 64 65 66 69 6e 65 20 75 6e 69 78 4c 6f 67 45  #define unixLogE
9350: 72 72 6f 72 28 61 2c 62 2c 63 29 20 20 20 20 20  rror(a,b,c)     
9360: 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69  unixLogErrorAtLi
9370: 6e 65 28 61 2c 62 2c 63 2c 5f 5f 4c 49 4e 45 5f  ne(a,b,c,__LINE_
9380: 5f 29 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  _).static int un
9390: 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65  ixLogErrorAtLine
93a0: 28 0a 20 20 69 6e 74 20 65 72 72 63 6f 64 65 2c  (.  int errcode,
93b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93c0: 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 65 72      /* SQLite er
93d0: 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  ror code */.  co
93e0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c  nst char *zFunc,
93f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9400: 20 4e 61 6d 65 20 6f 66 20 4f 53 20 66 75 6e 63   Name of OS func
9410: 74 69 6f 6e 20 74 68 61 74 20 66 61 69 6c 65 64  tion that failed
9420: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
9430: 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
9440: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 70 61        /* File pa
9450: 74 68 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  th associated wi
9460: 74 68 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69 6e  th error */.  in
9470: 74 20 69 4c 69 6e 65 20 20 20 20 20 20 20 20 20  t iLine         
9480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9490: 20 53 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75 6d   Source line num
94a0: 62 65 72 20 77 68 65 72 65 20 65 72 72 6f 72 20  ber where error 
94b0: 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a 20  occurred */.){. 
94c0: 20 63 68 61 72 20 2a 7a 45 72 72 3b 20 20 20 20   char *zErr;    
94d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94e0: 20 2f 2a 20 4d 65 73 73 61 67 65 20 66 72 6f 6d   /* Message from
94f0: 20 73 74 72 65 72 72 6f 72 28 29 20 6f 72 20 65   strerror() or e
9500: 71 75 69 76 61 6c 65 6e 74 20 2a 2f 0a 20 20 69  quivalent */.  i
9510: 6e 74 20 69 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt iErrno = errn
9520: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  o;             /
9530: 2a 20 53 61 76 65 64 20 73 79 73 63 61 6c 6c 20  * Saved syscall 
9540: 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a  error number */.
9550: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
9560: 20 6e 6f 74 20 61 20 74 68 72 65 61 64 73 61 66   not a threadsaf
9570: 65 20 62 75 69 6c 64 20 28 53 51 4c 49 54 45 5f  e build (SQLITE_
9580: 54 48 52 45 41 44 53 41 46 45 3d 3d 30 29 2c 20  THREADSAFE==0), 
9590: 74 68 65 6e 20 75 73 65 0a 20 20 2a 2a 20 74 68  then use.  ** th
95a0: 65 20 73 74 72 65 72 72 6f 72 28 29 20 66 75 6e  e strerror() fun
95b0: 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20  ction to obtain 
95c0: 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  the human-readab
95d0: 6c 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  le error message
95e0: 0a 20 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74  .  ** equivalent
95f0: 20 74 6f 20 65 72 72 6e 6f 2e 20 4f 74 68 65 72   to errno. Other
9600: 77 69 73 65 2c 20 75 73 65 20 73 74 72 65 72 72  wise, use strerr
9610: 6f 72 5f 72 28 29 2e 0a 20 20 2a 2f 20 0a 23 69  or_r()..  */ .#i
9620: 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  f SQLITE_THREADS
9630: 41 46 45 20 26 26 20 64 65 66 69 6e 65 64 28 48  AFE && defined(H
9640: 41 56 45 5f 53 54 52 45 52 52 4f 52 5f 52 29 0a  AVE_STRERROR_R).
9650: 20 20 63 68 61 72 20 61 45 72 72 5b 38 30 5d 3b    char aErr[80];
9660: 0a 20 20 6d 65 6d 73 65 74 28 61 45 72 72 2c 20  .  memset(aErr, 
9670: 30 2c 20 73 69 7a 65 6f 66 28 61 45 72 72 29 29  0, sizeof(aErr))
9680: 3b 0a 20 20 7a 45 72 72 20 3d 20 61 45 72 72 3b  ;.  zErr = aErr;
9690: 0a 0a 20 20 2f 2a 20 49 66 20 53 54 52 45 52 52  ..  /* If STRERR
96a0: 4f 52 5f 52 5f 43 48 41 52 5f 50 20 28 73 65 74  OR_R_CHAR_P (set
96b0: 20 62 79 20 61 75 74 6f 63 6f 6e 66 20 73 63 72   by autoconf scr
96c0: 69 70 74 73 29 20 6f 72 20 5f 5f 55 53 45 5f 47  ipts) or __USE_G
96d0: 4e 55 20 69 73 20 64 65 66 69 6e 65 64 2c 0a 20  NU is defined,. 
96e0: 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74 20   ** assume that 
96f0: 74 68 65 20 73 79 73 74 65 6d 20 70 72 6f 76 69  the system provi
9700: 64 65 73 20 74 68 65 20 47 4e 55 20 76 65 72 73  des the GNU vers
9710: 69 6f 6e 20 6f 66 20 73 74 72 65 72 72 6f 72 5f  ion of strerror_
9720: 72 28 29 20 74 68 61 74 0a 20 20 2a 2a 20 72 65  r() that.  ** re
9730: 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
9740: 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
9750: 61 69 6e 69 6e 67 20 74 68 65 20 65 72 72 6f 72  aining the error
9760: 20 6d 65 73 73 61 67 65 2e 20 54 68 61 74 20 70   message. That p
9770: 6f 69 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 61 79  ointer .  ** may
9780: 20 70 6f 69 6e 74 20 74 6f 20 61 45 72 72 5b 5d   point to aErr[]
9790: 2c 20 6f 72 20 69 74 20 6d 61 79 20 70 6f 69 6e  , or it may poin
97a0: 74 20 74 6f 20 73 6f 6d 65 20 73 74 61 74 69 63  t to some static
97b0: 20 73 74 6f 72 61 67 65 20 73 6f 6d 65 77 68 65   storage somewhe
97c0: 72 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77  re. .  ** Otherw
97d0: 69 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74  ise, assume that
97e0: 20 74 68 65 20 73 79 73 74 65 6d 20 70 72 6f 76   the system prov
97f0: 69 64 65 73 20 74 68 65 20 50 4f 53 49 58 20 76  ides the POSIX v
9800: 65 72 73 69 6f 6e 20 6f 66 20 0a 20 20 2a 2a 20  ersion of .  ** 
9810: 73 74 72 65 72 72 6f 72 5f 72 28 29 2c 20 77 68  strerror_r(), wh
9820: 69 63 68 20 61 6c 77 61 79 73 20 77 72 69 74 65  ich always write
9830: 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  s an error messa
9840: 67 65 20 69 6e 74 6f 20 61 45 72 72 5b 5d 2e 0a  ge into aErr[]..
9850: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
9860: 20 63 6f 64 65 20 69 6e 63 6f 72 72 65 63 74 6c   code incorrectl
9870: 79 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 69  y assumes that i
9880: 74 20 69 73 20 74 68 65 20 50 4f 53 49 58 20 76  t is the POSIX v
9890: 65 72 73 69 6f 6e 20 74 68 61 74 20 69 73 0a 20  ersion that is. 
98a0: 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2c 20 74   ** available, t
98b0: 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
98c0: 20 77 69 6c 6c 20 6f 66 74 65 6e 20 62 65 20 61   will often be a
98d0: 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20  n empty string. 
98e0: 4e 6f 74 20 61 0a 20 20 2a 2a 20 68 75 67 65 20  Not a.  ** huge 
98f0: 70 72 6f 62 6c 65 6d 2e 20 49 6e 63 6f 72 72 65  problem. Incorre
9900: 63 74 6c 79 20 63 6f 6e 63 6c 75 64 69 6e 67 20  ctly concluding 
9910: 74 68 61 74 20 74 68 65 20 47 4e 55 20 76 65 72  that the GNU ver
9920: 73 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c  sion is availabl
9930: 65 20 0a 20 20 2a 2a 20 63 6f 75 6c 64 20 6c 65  e .  ** could le
9940: 61 64 20 74 6f 20 61 20 73 65 67 66 61 75 6c 74  ad to a segfault
9950: 20 74 68 6f 75 67 68 2e 0a 20 20 2a 2f 0a 23 69   though..  */.#i
9960: 66 20 64 65 66 69 6e 65 64 28 53 54 52 45 52 52  f defined(STRERR
9970: 4f 52 5f 52 5f 43 48 41 52 5f 50 29 20 7c 7c 20  OR_R_CHAR_P) || 
9980: 64 65 66 69 6e 65 64 28 5f 5f 55 53 45 5f 47 4e  defined(__USE_GN
9990: 55 29 0a 20 20 7a 45 72 72 20 3d 20 0a 23 20 65  U).  zErr = .# e
99a0: 6e 64 69 66 0a 20 20 73 74 72 65 72 72 6f 72 5f  ndif.  strerror_
99b0: 72 28 69 45 72 72 6e 6f 2c 20 61 45 72 72 2c 20  r(iErrno, aErr, 
99c0: 73 69 7a 65 6f 66 28 61 45 72 72 29 2d 31 29 3b  sizeof(aErr)-1);
99d0: 0a 0a 23 65 6c 69 66 20 53 51 4c 49 54 45 5f 54  ..#elif SQLITE_T
99e0: 48 52 45 41 44 53 41 46 45 0a 20 20 2f 2a 20 54  HREADSAFE.  /* T
99f0: 68 69 73 20 69 73 20 61 20 74 68 72 65 61 64 73  his is a threads
9a00: 61 66 65 20 62 75 69 6c 64 2c 20 62 75 74 20 73  afe build, but s
9a10: 74 72 65 72 72 6f 72 5f 72 28 29 20 69 73 20 6e  trerror_r() is n
9a20: 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 2a 2f  ot available. */
9a30: 0a 20 20 7a 45 72 72 20 3d 20 22 22 3b 0a 23 65  .  zErr = "";.#e
9a40: 6c 73 65 0a 20 20 2f 2a 20 4e 6f 6e 2d 74 68 72  lse.  /* Non-thr
9a50: 65 61 64 73 61 66 65 20 62 75 69 6c 64 2c 20 75  eadsafe build, u
9a60: 73 65 20 73 74 72 65 72 72 6f 72 28 29 2e 20 2a  se strerror(). *
9a70: 2f 0a 20 20 7a 45 72 72 20 3d 20 73 74 72 65 72  /.  zErr = strer
9a80: 72 6f 72 28 69 45 72 72 6e 6f 29 3b 0a 23 65 6e  ror(iErrno);.#en
9a90: 64 69 66 0a 0a 20 20 69 66 28 20 7a 50 61 74 68  dif..  if( zPath
9aa0: 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22 22  ==0 ) zPath = ""
9ab0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  ;.  sqlite3_log(
9ac0: 65 72 72 63 6f 64 65 2c 0a 20 20 20 20 20 20 22  errcode,.      "
9ad0: 6f 73 5f 75 6e 69 78 2e 63 3a 25 64 3a 20 28 25  os_unix.c:%d: (%
9ae0: 64 29 20 25 73 28 25 73 29 20 2d 20 25 73 22 2c  d) %s(%s) - %s",
9af0: 0a 20 20 20 20 20 20 69 4c 69 6e 65 2c 20 69 45  .      iLine, iE
9b00: 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61  rrno, zFunc, zPa
9b10: 74 68 2c 20 7a 45 72 72 0a 20 20 29 3b 0a 0a 20  th, zErr.  );.. 
9b20: 20 72 65 74 75 72 6e 20 65 72 72 63 6f 64 65 3b   return errcode;
9b30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
9b40: 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
9b50: 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75  r..**.** We assu
9b60: 6d 65 20 74 68 61 74 20 63 6c 6f 73 65 28 29 20  me that close() 
9b70: 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 77 6f  almost always wo
9b80: 72 6b 73 2c 20 73 69 6e 63 65 20 69 74 20 69 73  rks, since it is
9b90: 20 6f 6e 6c 79 20 69 6e 20 61 0a 2a 2a 20 76 65   only in a.** ve
9ba0: 72 79 20 73 69 63 6b 20 61 70 70 6c 69 63 61 74  ry sick applicat
9bb0: 69 6f 6e 20 6f 72 20 6f 6e 20 61 20 76 65 72 79  ion or on a very
9bc0: 20 73 69 63 6b 20 70 6c 61 74 66 6f 72 6d 20 74   sick platform t
9bd0: 68 61 74 20 69 74 20 6d 69 67 68 74 20 66 61 69  hat it might fai
9be0: 6c 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f 65 73  l..** If it does
9bf0: 20 66 61 69 6c 2c 20 73 69 6d 70 6c 79 20 6c 65   fail, simply le
9c00: 61 6b 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ak the file desc
9c10: 72 69 70 74 6f 72 2c 20 62 75 74 20 64 6f 20 6c  riptor, but do l
9c20: 6f 67 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72 2e  og the.** error.
9c30: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
9c40: 20 69 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20   it is not safe 
9c50: 74 6f 20 72 65 74 72 79 20 63 6c 6f 73 65 28 29  to retry close()
9c60: 20 61 66 74 65 72 20 45 49 4e 54 52 20 73 69 6e   after EINTR sin
9c70: 63 65 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64  ce the.** file d
9c80: 65 73 63 72 69 70 74 6f 72 20 6d 69 67 68 74 20  escriptor might 
9c90: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
9ca0: 6e 20 72 65 75 73 65 64 20 62 79 20 61 6e 6f 74  n reused by anot
9cb0: 68 65 72 20 74 68 72 65 61 64 2e 0a 2a 2a 20 53  her thread..** S
9cc0: 6f 20 77 65 20 64 6f 6e 27 74 20 65 76 65 6e 20  o we don't even 
9cd0: 74 72 79 20 74 6f 20 72 65 63 6f 76 65 72 20 66  try to recover f
9ce0: 72 6f 6d 20 61 6e 20 45 49 4e 54 52 2e 20 20 4a  rom an EINTR.  J
9cf0: 75 73 74 20 6c 6f 67 20 74 68 65 20 65 72 72 6f  ust log the erro
9d00: 72 0a 2a 2a 20 61 6e 64 20 6d 6f 76 65 20 6f 6e  r.** and move on
9d10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
9d20: 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 75 6e   robust_close(un
9d30: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69  ixFile *pFile, i
9d40: 6e 74 20 68 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f  nt h, int lineno
9d50: 29 7b 0a 20 20 69 66 28 20 6f 73 43 6c 6f 73 65  ){.  if( osClose
9d60: 28 68 29 20 29 7b 0a 20 20 20 20 75 6e 69 78 4c  (h) ){.    unixL
9d70: 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 53 51  ogErrorAtLine(SQ
9d80: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45  LITE_IOERR_CLOSE
9d90: 2c 20 22 63 6c 6f 73 65 22 2c 0a 20 20 20 20 20  , "close",.     
9da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9db0: 20 20 70 46 69 6c 65 20 3f 20 70 46 69 6c 65 2d    pFile ? pFile-
9dc0: 3e 7a 50 61 74 68 20 3a 20 30 2c 20 6c 69 6e 65  >zPath : 0, line
9dd0: 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  no);.  }.}../*.*
9de0: 2a 20 53 65 74 20 74 68 65 20 70 46 69 6c 65 2d  * Set the pFile-
9df0: 3e 6c 61 73 74 45 72 72 6e 6f 2e 20 20 44 6f 20  >lastErrno.  Do 
9e00: 74 68 69 73 20 69 6e 20 61 20 73 75 62 72 6f 75  this in a subrou
9e10: 74 69 6e 65 20 61 73 20 74 68 61 74 20 70 72 6f  tine as that pro
9e20: 76 69 64 65 73 0a 2a 2a 20 61 20 63 6f 6e 76 65  vides.** a conve
9e30: 6e 69 65 6e 74 20 70 6c 61 63 65 20 74 6f 20 73  nient place to s
9e40: 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 2e  et a breakpoint.
9e50: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9e60: 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 75  storeLastErrno(u
9e70: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
9e80: 69 6e 74 20 65 72 72 6f 72 29 7b 0a 20 20 70 46  int error){.  pF
9e90: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
9ea0: 20 65 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   error;.}../*.**
9eb0: 20 43 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 20   Close all file 
9ec0: 64 65 73 63 72 69 70 74 6f 72 73 20 61 63 63 75  descriptors accu
9ed0: 6d 75 61 74 65 64 20 69 6e 20 74 68 65 20 75 6e  muated in the un
9ee0: 69 78 49 6e 6f 64 65 49 6e 66 6f 2d 3e 70 55 6e  ixInodeInfo->pUn
9ef0: 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 20 0a 73  used list..*/ .s
9f00: 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65  tatic void close
9f10: 50 65 6e 64 69 6e 67 46 64 73 28 75 6e 69 78 46  PendingFds(unixF
9f20: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75  ile *pFile){.  u
9f30: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
9f40: 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
9f50: 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73  node;.  UnixUnus
9f60: 65 64 46 64 20 2a 70 3b 0a 20 20 55 6e 69 78 55  edFd *p;.  UnixU
9f70: 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 0a  nusedFd *pNext;.
9f80: 20 20 66 6f 72 28 70 3d 70 49 6e 6f 64 65 2d 3e    for(p=pInode->
9f90: 70 55 6e 75 73 65 64 3b 20 70 3b 20 70 3d 70 4e  pUnused; p; p=pN
9fa0: 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
9fb0: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  = p->pNext;.    
9fc0: 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69  robust_close(pFi
9fd0: 6c 65 2c 20 70 2d 3e 66 64 2c 20 5f 5f 4c 49 4e  le, p->fd, __LIN
9fe0: 45 5f 5f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  E__);.    sqlite
9ff0: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 20  3_free(p);.  }. 
a000: 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64   pInode->pUnused
a010: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   = 0;.}../*.** R
a020: 65 6c 65 61 73 65 20 61 20 75 6e 69 78 49 6e 6f  elease a unixIno
a030: 64 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  deInfo structure
a040: 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f   previously allo
a050: 63 61 74 65 64 20 62 79 20 66 69 6e 64 49 6e 6f  cated by findIno
a060: 64 65 49 6e 66 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20  deInfo()..**.** 
a070: 54 68 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65  The mutex entere
a080: 64 20 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78  d using the unix
a090: 45 6e 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e  EnterMutex() fun
a0a0: 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65  ction must be he
a0b0: 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20  ld.** when this 
a0c0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
a0d0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
a0e0: 69 64 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49  id releaseInodeI
a0f0: 6e 66 6f 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  nfo(unixFile *pF
a100: 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64  ile){.  unixInod
a110: 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20  eInfo *pInode = 
a120: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
a130: 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
a140: 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66  exHeld() );.  if
a150: 28 20 41 4c 57 41 59 53 28 70 49 6e 6f 64 65 29  ( ALWAYS(pInode)
a160: 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e   ){.    pInode->
a170: 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20  nRef--;.    if( 
a180: 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20  pInode->nRef==0 
a190: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
a1a0: 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64   pInode->pShmNod
a1b0: 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6c  e==0 );.      cl
a1c0: 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46  osePendingFds(pF
a1d0: 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ile);.      if( 
a1e0: 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20 29 7b  pInode->pPrev ){
a1f0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
a200: 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e   pInode->pPrev->
a210: 70 4e 65 78 74 3d 3d 70 49 6e 6f 64 65 20 29 3b  pNext==pInode );
a220: 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
a230: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
a240: 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20  pInode->pNext;. 
a250: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a260: 20 20 20 20 61 73 73 65 72 74 28 20 69 6e 6f 64      assert( inod
a270: 65 4c 69 73 74 3d 3d 70 49 6e 6f 64 65 20 29 3b  eList==pInode );
a280: 0a 20 20 20 20 20 20 20 20 69 6e 6f 64 65 4c 69  .        inodeLi
a290: 73 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65  st = pInode->pNe
a2a0: 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
a2b0: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 4e    if( pInode->pN
a2c0: 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ext ){.        a
a2d0: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70  ssert( pInode->p
a2e0: 4e 65 78 74 2d 3e 70 50 72 65 76 3d 3d 70 49 6e  Next->pPrev==pIn
a2f0: 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ode );.        p
a300: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50  Inode->pNext->pP
a310: 72 65 76 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 50  rev = pInode->pP
a320: 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rev;.      }.   
a330: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
a340: 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20  pInode);.    }. 
a350: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65   }.}../*.** Give
a360: 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  n a file descrip
a370: 74 6f 72 2c 20 6c 6f 63 61 74 65 20 74 68 65 20  tor, locate the 
a380: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
a390: 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 64 65 73  ject that.** des
a3a0: 63 72 69 62 65 73 20 74 68 61 74 20 66 69 6c 65  cribes that file
a3b0: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43 72   descriptor.  Cr
a3c0: 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69  eate a new one i
a3d0: 66 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68  f necessary.  Th
a3e0: 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75  e.** return valu
a3f0: 65 20 6d 69 67 68 74 20 62 65 20 75 6e 69 6e 69  e might be unini
a400: 74 69 61 6c 69 7a 65 64 20 69 66 20 61 6e 20 65  tialized if an e
a410: 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  rror occurs..**.
a420: 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 65 6e 74  ** The mutex ent
a430: 65 72 65 64 20 75 73 69 6e 67 20 74 68 65 20 75  ered using the u
a440: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20  nixEnterMutex() 
a450: 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  function must be
a460: 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68   held.** when th
a470: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
a480: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  alled..**.** Ret
a490: 75 72 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61  urn an appropria
a4a0: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
a4b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e  /.static int fin
a4c0: 64 49 6e 6f 64 65 49 6e 66 6f 28 0a 20 20 75 6e  dInodeInfo(.  un
a4d0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  ixFile *pFile,  
a4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a4f0: 55 6e 69 78 20 66 69 6c 65 20 77 69 74 68 20 66  Unix file with f
a500: 69 6c 65 20 64 65 73 63 20 75 73 65 64 20 69 6e  ile desc used in
a510: 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20 75 6e   the key */.  un
a520: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2a 70 70  ixInodeInfo **pp
a530: 49 6e 6f 64 65 20 20 20 20 20 20 20 20 2f 2a 20  Inode        /* 
a540: 52 65 74 75 72 6e 20 74 68 65 20 75 6e 69 78 49  Return the unixI
a550: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20  nodeInfo object 
a560: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
a570: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
a580: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
a590: 79 73 74 65 6d 20 63 61 6c 6c 20 72 65 74 75 72  ystem call retur
a5a0: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
a5b0: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fd;             
a5c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
a5d0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
a5e0: 72 20 66 6f 72 20 70 46 69 6c 65 20 2a 2f 0a 20  r for pFile */. 
a5f0: 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65   struct unixFile
a600: 49 64 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20  Id fileId;      
a610: 2f 2a 20 4c 6f 6f 6b 75 70 20 6b 65 79 20 66 6f  /* Lookup key fo
a620: 72 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  r the unixInodeI
a630: 6e 66 6f 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nfo */.  struct 
a640: 73 74 61 74 20 73 74 61 74 62 75 66 3b 20 20 20  stat statbuf;   
a650: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c          /* Low-l
a660: 65 76 65 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d  evel file inform
a670: 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 6e 69 78 49  ation */.  unixI
a680: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
a690: 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 43 61 6e   = 0;     /* Can
a6a0: 64 69 64 61 74 65 20 75 6e 69 78 49 6e 6f 64 65  didate unixInode
a6b0: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a  Info object */..
a6c0: 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75    assert( unixMu
a6d0: 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 0a 20 20  texHeld() );..  
a6e0: 2f 2a 20 47 65 74 20 6c 6f 77 2d 6c 65 76 65 6c  /* Get low-level
a6f0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
a700: 75 74 20 74 68 65 20 66 69 6c 65 20 74 68 61 74  ut the file that
a710: 20 77 65 20 63 61 6e 20 75 73 65 64 20 74 6f 0a   we can used to.
a720: 20 20 2a 2a 20 63 72 65 61 74 65 20 61 20 75 6e    ** create a un
a730: 69 71 75 65 20 6e 61 6d 65 20 66 6f 72 20 74 68  ique name for th
a740: 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66  e file..  */.  f
a750: 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20  d = pFile->h;.  
a760: 72 63 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c  rc = osFstat(fd,
a770: 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20 69 66   &statbuf);.  if
a780: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 73  ( rc!=0 ){.    s
a790: 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
a7a0: 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 23 69 66  ile, errno);.#if
a7b0: 20 64 65 66 69 6e 65 64 28 45 4f 56 45 52 46 4c   defined(EOVERFL
a7c0: 4f 57 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  OW) && defined(S
a7d0: 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46  QLITE_DISABLE_LF
a7e0: 53 29 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65  S).    if( pFile
a7f0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 4f 56  ->lastErrno==EOV
a800: 45 52 46 4c 4f 57 20 29 20 72 65 74 75 72 6e 20  ERFLOW ) return 
a810: 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65  SQLITE_NOLFS;.#e
a820: 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
a830: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
a840: 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50 50 4c  }..#ifdef __APPL
a850: 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20 58  E__.  /* On OS X
a860: 20 6f 6e 20 61 6e 20 6d 73 64 6f 73 20 66 69 6c   on an msdos fil
a870: 65 73 79 73 74 65 6d 2c 20 74 68 65 20 69 6e 6f  esystem, the ino
a880: 64 65 20 6e 75 6d 62 65 72 20 69 73 20 72 65 70  de number is rep
a890: 6f 72 74 65 64 0a 20 20 2a 2a 20 69 6e 63 6f 72  orted.  ** incor
a8a0: 72 65 63 74 6c 79 20 66 6f 72 20 7a 65 72 6f 2d  rectly for zero-
a8b0: 73 69 7a 65 20 66 69 6c 65 73 2e 20 20 53 65 65  size files.  See
a8c0: 20 74 69 63 6b 65 74 20 23 33 32 36 30 2e 20 20   ticket #3260.  
a8d0: 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20 61 72 6f  To work.  ** aro
a8e0: 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  und this problem
a8f0: 20 28 77 65 20 63 6f 6e 73 69 64 65 72 20 69 74   (we consider it
a900: 20 61 20 62 75 67 20 69 6e 20 4f 53 20 58 2c 20   a bug in OS X, 
a910: 6e 6f 74 20 53 51 4c 69 74 65 29 0a 20 20 2a 2a  not SQLite).  **
a920: 20 77 65 20 61 6c 77 61 79 73 20 69 6e 63 72 65   we always incre
a930: 61 73 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a  ase the file siz
a940: 65 20 74 6f 20 31 20 62 79 20 77 72 69 74 69 6e  e to 1 by writin
a950: 67 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 0a  g a single byte.
a960: 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61 63    ** prior to ac
a970: 63 65 73 73 69 6e 67 20 74 68 65 20 69 6e 6f 64  cessing the inod
a980: 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 20 6f  e number.  The o
a990: 6e 65 20 62 79 74 65 20 77 72 69 74 74 65 6e 20  ne byte written 
a9a0: 69 73 0a 20 20 2a 2a 20 61 6e 20 41 53 43 49 49  is.  ** an ASCII
a9b0: 20 27 53 27 20 63 68 61 72 61 63 74 65 72 20 77   'S' character w
a9c0: 68 69 63 68 20 61 6c 73 6f 20 68 61 70 70 65 6e  hich also happen
a9d0: 73 20 74 6f 20 62 65 20 74 68 65 20 66 69 72 73  s to be the firs
a9e0: 74 20 62 79 74 65 0a 20 20 2a 2a 20 69 6e 20 74  t byte.  ** in t
a9f0: 68 65 20 68 65 61 64 65 72 20 6f 66 20 65 76 65  he header of eve
aa00: 72 79 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ry SQLite databa
aa10: 73 65 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79  se.  In this way
aa20: 2c 20 69 66 20 74 68 65 72 65 0a 20 20 2a 2a 20  , if there.  ** 
aa30: 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74  is a race condit
aa40: 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 6e  ion such that an
aa50: 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73  other thread has
aa60: 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74   already populat
aa70: 65 64 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73  ed.  ** the firs
aa80: 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
aa90: 74 61 62 61 73 65 2c 20 6e 6f 20 64 61 6d 61 67  tabase, no damag
aaa0: 65 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a  e is done..  */.
aab0: 20 20 69 66 28 20 73 74 61 74 62 75 66 2e 73 74    if( statbuf.st
aac0: 5f 73 69 7a 65 3d 3d 30 20 26 26 20 28 70 46 69  _size==0 && (pFi
aad0: 6c 65 2d 3e 66 73 46 6c 61 67 73 20 26 20 53 51  le->fsFlags & SQ
aae0: 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f  LITE_FSFLAGS_IS_
aaf0: 4d 53 44 4f 53 29 21 3d 30 20 29 7b 0a 20 20 20  MSDOS)!=0 ){.   
ab00: 20 64 6f 7b 20 72 63 20 3d 20 6f 73 57 72 69 74   do{ rc = osWrit
ab10: 65 28 66 64 2c 20 22 53 22 2c 20 31 29 3b 20 7d  e(fd, "S", 1); }
ab20: 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
ab30: 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20  rrno==EINTR );. 
ab40: 20 20 20 69 66 28 20 72 63 21 3d 31 20 29 7b 0a     if( rc!=1 ){.
ab50: 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
ab60: 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e  rrno(pFile, errn
ab70: 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  o);.      return
ab80: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
ab90: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6f 73     }.    rc = os
aba0: 46 73 74 61 74 28 66 64 2c 20 26 73 74 61 74 62  Fstat(fd, &statb
abb0: 75 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  uf);.    if( rc!
abc0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72  =0 ){.      stor
abd0: 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
abe0: 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20  , errno);.      
abf0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
ac00: 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ERR;.    }.  }.#
ac10: 65 6e 64 69 66 0a 0a 20 20 6d 65 6d 73 65 74 28  endif..  memset(
ac20: 26 66 69 6c 65 49 64 2c 20 30 2c 20 73 69 7a 65  &fileId, 0, size
ac30: 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20 66  of(fileId));.  f
ac40: 69 6c 65 49 64 2e 64 65 76 20 3d 20 73 74 61 74  ileId.dev = stat
ac50: 62 75 66 2e 73 74 5f 64 65 76 3b 0a 23 69 66 20  buf.st_dev;.#if 
ac60: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 66 69 6c  OS_VXWORKS.  fil
ac70: 65 49 64 2e 70 49 64 20 3d 20 70 46 69 6c 65 2d  eId.pId = pFile-
ac80: 3e 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20 66 69  >pId;.#else.  fi
ac90: 6c 65 49 64 2e 69 6e 6f 20 3d 20 73 74 61 74 62  leId.ino = statb
aca0: 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64 69  uf.st_ino;.#endi
acb0: 66 0a 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f  f.  pInode = ino
acc0: 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28  deList;.  while(
acd0: 20 70 49 6e 6f 64 65 20 26 26 20 6d 65 6d 63 6d   pInode && memcm
ace0: 70 28 26 66 69 6c 65 49 64 2c 20 26 70 49 6e 6f  p(&fileId, &pIno
acf0: 64 65 2d 3e 66 69 6c 65 49 64 2c 20 73 69 7a 65  de->fileId, size
ad00: 6f 66 28 66 69 6c 65 49 64 29 29 20 29 7b 0a 20  of(fileId)) ){. 
ad10: 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f     pInode = pIno
ad20: 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20  de->pNext;.  }. 
ad30: 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29   if( pInode==0 )
ad40: 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 73  {.    pInode = s
ad50: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
ad60: 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29   sizeof(*pInode)
ad70: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f   );.    if( pIno
ad80: 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  de==0 ){.      r
ad90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
ada0: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  EM;.    }.    me
adb0: 6d 73 65 74 28 70 49 6e 6f 64 65 2c 20 30 2c 20  mset(pInode, 0, 
adc0: 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 29  sizeof(*pInode))
add0: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 49  ;.    memcpy(&pI
ade0: 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 26 66  node->fileId, &f
adf0: 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66 69  ileId, sizeof(fi
ae00: 6c 65 49 64 29 29 3b 0a 20 20 20 20 70 49 6e 6f  leId));.    pIno
ae10: 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  de->nRef = 1;.  
ae20: 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20    pInode->pNext 
ae30: 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20  = inodeList;.   
ae40: 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20 3d   pInode->pPrev =
ae50: 20 30 3b 0a 20 20 20 20 69 66 28 20 69 6e 6f 64   0;.    if( inod
ae60: 65 4c 69 73 74 20 29 20 69 6e 6f 64 65 4c 69 73  eList ) inodeLis
ae70: 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f 64  t->pPrev = pInod
ae80: 65 3b 0a 20 20 20 20 69 6e 6f 64 65 4c 69 73 74  e;.    inodeList
ae90: 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 7d 65 6c   = pInode;.  }el
aea0: 73 65 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  se{.    pInode->
aeb0: 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70  nRef++;.  }.  *p
aec0: 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 3b  pInode = pInode;
aed0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
aee0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
aef0: 74 75 72 6e 20 54 52 55 45 20 69 66 20 70 46 69  turn TRUE if pFi
af00: 6c 65 20 68 61 73 20 62 65 65 6e 20 72 65 6e 61  le has been rena
af10: 6d 65 64 20 6f 72 20 75 6e 6c 69 6e 6b 65 64 20  med or unlinked 
af20: 73 69 6e 63 65 20 69 74 20 77 61 73 20 66 69 72  since it was fir
af30: 73 74 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73 74  st opened..*/.st
af40: 61 74 69 63 20 69 6e 74 20 66 69 6c 65 48 61 73  atic int fileHas
af50: 4d 6f 76 65 64 28 75 6e 69 78 46 69 6c 65 20 2a  Moved(unixFile *
af60: 70 46 69 6c 65 29 7b 0a 23 69 66 20 4f 53 5f 56  pFile){.#if OS_V
af70: 58 57 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e 20  XWORKS.  return 
af80: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d 30  pFile->pInode!=0
af90: 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 64 21 3d   && pFile->pId!=
afa0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 66  pFile->pInode->f
afb0: 69 6c 65 49 64 2e 70 49 64 3b 0a 23 65 6c 73 65  ileId.pId;.#else
afc0: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62  .  struct stat b
afd0: 75 66 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 69  uf;.  return pFi
afe0: 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d 30 20 26 26  le->pInode!=0 &&
aff0: 0a 20 20 20 20 20 20 28 6f 73 53 74 61 74 28 70  .      (osStat(p
b000: 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 62 75  File->zPath, &bu
b010: 66 29 21 3d 30 20 7c 7c 20 62 75 66 2e 73 74 5f  f)!=0 || buf.st_
b020: 69 6e 6f 21 3d 70 46 69 6c 65 2d 3e 70 49 6e 6f  ino!=pFile->pIno
b030: 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 29 3b  de->fileId.ino);
b040: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a  .#endif.}.../*.*
b050: 2a 20 43 68 65 63 6b 20 61 20 75 6e 69 78 46 69  * Check a unixFi
b060: 6c 65 20 74 68 61 74 20 69 73 20 61 20 64 61 74  le that is a dat
b070: 61 62 61 73 65 2e 20 20 56 65 72 69 66 79 20 74  abase.  Verify t
b080: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
b090: 0a 2a 2a 20 28 31 29 20 54 68 65 72 65 20 69 73  .** (1) There is
b0a0: 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 68 61 72   exactly one har
b0b0: 64 20 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 66 69  d link on the fi
b0c0: 6c 65 0a 2a 2a 20 28 32 29 20 54 68 65 20 66 69  le.** (2) The fi
b0d0: 6c 65 20 69 73 20 6e 6f 74 20 61 20 73 79 6d 62  le is not a symb
b0e0: 6f 6c 69 63 20 6c 69 6e 6b 0a 2a 2a 20 28 33 29  olic link.** (3)
b0f0: 20 54 68 65 20 66 69 6c 65 20 68 61 73 20 6e 6f   The file has no
b100: 74 20 62 65 65 6e 20 72 65 6e 61 6d 65 64 20 6f  t been renamed o
b110: 72 20 75 6e 6c 69 6e 6b 65 64 0a 2a 2a 0a 2a 2a  r unlinked.**.**
b120: 20 49 73 73 75 65 20 73 71 6c 69 74 65 33 5f 6c   Issue sqlite3_l
b130: 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  og(SQLITE_WARNIN
b140: 47 2c 2e 2e 2e 29 20 6d 65 73 73 61 67 65 73 20  G,...) messages 
b150: 69 66 20 61 6e 79 74 68 69 6e 67 20 69 73 20 6e  if anything is n
b160: 6f 74 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61  ot right..*/.sta
b170: 74 69 63 20 76 6f 69 64 20 76 65 72 69 66 79 44  tic void verifyD
b180: 62 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a  bFile(unixFile *
b190: 70 46 69 6c 65 29 7b 0a 20 20 73 74 72 75 63 74  pFile){.  struct
b1a0: 20 73 74 61 74 20 62 75 66 3b 0a 20 20 69 6e 74   stat buf;.  int
b1b0: 20 72 63 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73   rc;.  rc = osFs
b1c0: 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62  tat(pFile->h, &b
b1d0: 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30  uf);.  if( rc!=0
b1e0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
b1f0: 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49  log(SQLITE_WARNI
b200: 4e 47 2c 20 22 63 61 6e 6e 6f 74 20 66 73 74 61  NG, "cannot fsta
b210: 74 20 64 62 20 66 69 6c 65 20 25 73 22 2c 20 70  t db file %s", p
b220: 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
b230: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
b240: 69 66 28 20 62 75 66 2e 73 74 5f 6e 6c 69 6e 6b  if( buf.st_nlink
b250: 3d 3d 30 20 26 26 20 28 70 46 69 6c 65 2d 3e 63  ==0 && (pFile->c
b260: 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
b270: 49 4c 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29  ILE_DELETE)==0 )
b280: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
b290: 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  g(SQLITE_WARNING
b2a0: 2c 20 22 66 69 6c 65 20 75 6e 6c 69 6e 6b 65 64  , "file unlinked
b2b0: 20 77 68 69 6c 65 20 6f 70 65 6e 3a 20 25 73 22   while open: %s"
b2c0: 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
b2d0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
b2e0: 0a 20 20 69 66 28 20 62 75 66 2e 73 74 5f 6e 6c  .  if( buf.st_nl
b2f0: 69 6e 6b 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c  ink>1 ){.    sql
b300: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
b310: 57 41 52 4e 49 4e 47 2c 20 22 6d 75 6c 74 69 70  WARNING, "multip
b320: 6c 65 20 6c 69 6e 6b 73 20 74 6f 20 66 69 6c 65  le links to file
b330: 3a 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  : %s", pFile->zP
b340: 61 74 68 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ath);.    return
b350: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 69 6c 65  ;.  }.  if( file
b360: 48 61 73 4d 6f 76 65 64 28 70 46 69 6c 65 29 20  HasMoved(pFile) 
b370: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
b380: 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  og(SQLITE_WARNIN
b390: 47 2c 20 22 66 69 6c 65 20 72 65 6e 61 6d 65 64  G, "file renamed
b3a0: 20 77 68 69 6c 65 20 6f 70 65 6e 3a 20 25 73 22   while open: %s"
b3b0: 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
b3c0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
b3d0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
b3e0: 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
b3f0: 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
b400: 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
b410: 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
b420: 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
b430: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
b440: 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
b450: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73   lock is held, s
b460: 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74  et *pResOut.** t
b470: 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
b480: 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52  ue otherwise *pR
b490: 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
b4a0: 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72  zero.  The retur
b4b0: 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  n value.** is se
b4c0: 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75  t to SQLITE_OK u
b4d0: 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72  nless an I/O err
b4e0: 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
b4f0: 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a   lock checking..
b500: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
b510: 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ixCheckReservedL
b520: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
b530: 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f   *id, int *pResO
b540: 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ut){.  int rc = 
b550: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
b560: 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20   reserved = 0;. 
b570: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
b580: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
b590: 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  ;..  SimulateIOE
b5a0: 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
b5b0: 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
b5c0: 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a  ESERVEDLOCK; );.
b5d0: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
b5e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46   );.  assert( pF
b5f0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ile->eFileLock<=
b600: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
b610: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
b620: 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46  ); /* Because pF
b630: 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73  ile->pInode is s
b640: 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
b650: 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68  eads */..  /* Ch
b660: 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20  eck if a thread 
b670: 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
b680: 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63  holds such a loc
b690: 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  k */.  if( pFile
b6a0: 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ->pInode->eFileL
b6b0: 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
b6c0: 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  ){.    reserved 
b6d0: 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  = 1;.  }..  /* O
b6e0: 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20  therwise see if 
b6f0: 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
b700: 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 2a  ss holds it..  *
b710: 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 44 4a 47 50  /.#ifndef __DJGP
b720: 50 5f 5f 0a 20 20 69 66 28 20 21 72 65 73 65 72  P__.  if( !reser
b730: 76 65 64 20 26 26 20 21 70 46 69 6c 65 2d 3e 70  ved && !pFile->p
b740: 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
b750: 6f 63 6b 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ock ){.    struc
b760: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20  t flock lock;.  
b770: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
b780: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
b790: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52  lock.l_start = R
b7a0: 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20  ESERVED_BYTE;.  
b7b0: 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31    lock.l_len = 1
b7c0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  ;.    lock.l_typ
b7d0: 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20  e = F_WRLCK;.   
b7e0: 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 46 69   if( osFcntl(pFi
b7f0: 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20  le->h, F_GETLK, 
b800: 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20  &lock) ){.      
b810: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
b820: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
b830: 4f 43 4b 3b 0a 20 20 20 20 20 20 73 74 6f 72 65  OCK;.      store
b840: 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
b850: 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 20 65   errno);.    } e
b860: 6c 73 65 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74  lse if( lock.l_t
b870: 79 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype!=F_UNLCK ){.
b880: 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d        reserved =
b890: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   1;.    }.  }.#e
b8a0: 6e 64 69 66 0a 20 20 0a 20 20 75 6e 69 78 4c 65  ndif.  .  unixLe
b8b0: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53  aveMutex();.  OS
b8c0: 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d  TRACE(("TEST WR-
b8d0: 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 75  LOCK %d %d %d (u
b8e0: 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  nix)\n", pFile->
b8f0: 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29  h, rc, reserved)
b900: 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d  );..  *pResOut =
b910: 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74   reserved;.  ret
b920: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
b930: 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20   Attempt to set 
b940: 61 20 73 79 73 74 65 6d 2d 6c 6f 63 6b 20 6f 6e  a system-lock on
b950: 20 74 68 65 20 66 69 6c 65 20 70 46 69 6c 65 2e   the file pFile.
b960: 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a    The lock is .*
b970: 2a 20 64 65 73 63 72 69 62 65 64 20 62 79 20 70  * described by p
b980: 4c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Lock..**.** If t
b990: 68 65 20 70 46 69 6c 65 20 77 61 73 20 6f 70 65  he pFile was ope
b9a0: 6e 65 64 20 72 65 61 64 2f 77 72 69 74 65 20 66  ned read/write f
b9b0: 72 6f 6d 20 75 6e 69 78 2d 65 78 63 6c 2c 20 74  rom unix-excl, t
b9c0: 68 65 6e 20 74 68 65 20 6f 6e 6c 79 20 6c 6f 63  hen the only loc
b9d0: 6b 0a 2a 2a 20 65 76 65 72 20 6f 62 74 61 69 6e  k.** ever obtain
b9e0: 65 64 20 69 73 20 61 6e 20 65 78 63 6c 75 73 69  ed is an exclusi
b9f0: 76 65 20 6c 6f 63 6b 2c 20 61 6e 64 20 69 74 20  ve lock, and it 
ba00: 69 73 20 6f 62 74 61 69 6e 65 64 20 65 78 61 63  is obtained exac
ba10: 74 6c 79 20 6f 6e 63 65 0a 2a 2a 20 74 68 65 20  tly once.** the 
ba20: 66 69 72 73 74 20 74 69 6d 65 20 61 6e 79 20 6c  first time any l
ba30: 6f 63 6b 20 69 73 20 61 74 74 65 6d 70 74 65 64  ock is attempted
ba40: 2e 20 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e  .  All subsequen
ba50: 74 20 73 79 73 74 65 6d 20 6c 6f 63 6b 69 6e 67  t system locking
ba60: 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 62  .** operations b
ba70: 65 63 6f 6d 65 20 6e 6f 2d 6f 70 73 2e 20 20 4c  ecome no-ops.  L
ba80: 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ocking operation
ba90: 73 20 73 74 69 6c 6c 20 68 61 70 70 65 6e 20 69  s still happen i
baa0: 6e 74 65 72 6e 61 6c 6c 79 2c 0a 2a 2a 20 69 6e  nternally,.** in
bab0: 20 6f 72 64 65 72 20 74 6f 20 63 6f 6f 72 64 69   order to coordi
bac0: 6e 61 74 65 20 61 63 63 65 73 73 20 62 65 74 77  nate access betw
bad0: 65 65 6e 20 73 65 70 61 72 61 74 65 20 64 61 74  een separate dat
bae0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
baf0: 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73  s.** within this
bb00: 20 70 72 6f 63 65 73 73 2c 20 62 75 74 20 61 6c   process, but al
bb10: 6c 20 6f 66 20 74 68 61 74 20 69 73 20 68 61 6e  l of that is han
bb20: 64 6c 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 61  dled in memory a
bb30: 6e 64 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74  nd the.** operat
bb40: 69 6e 67 20 73 79 73 74 65 6d 20 64 6f 65 73 20  ing system does 
bb50: 6e 6f 74 20 70 61 72 74 69 63 69 70 61 74 65 2e  not participate.
bb60: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
bb70: 74 69 6f 6e 20 69 73 20 61 20 70 61 73 73 2d 74  tion is a pass-t
bb80: 68 72 6f 75 67 68 20 74 6f 20 66 63 6e 74 6c 28  hrough to fcntl(
bb90: 46 5f 53 45 54 4c 4b 29 20 69 66 20 70 46 69 6c  F_SETLK) if pFil
bba0: 65 20 69 73 20 75 73 69 6e 67 0a 2a 2a 20 61 6e  e is using.** an
bbb0: 79 20 56 46 53 20 6f 74 68 65 72 20 74 68 61 6e  y VFS other than
bbc0: 20 22 75 6e 69 78 2d 65 78 63 6c 22 20 6f 72 20   "unix-excl" or 
bbd0: 69 66 20 70 46 69 6c 65 20 69 73 20 6f 70 65 6e  if pFile is open
bbe0: 65 64 20 6f 6e 20 22 75 6e 69 78 2d 65 78 63 6c  ed on "unix-excl
bbf0: 22 0a 2a 2a 20 61 6e 64 20 69 73 20 72 65 61 64  ".** and is read
bc00: 2d 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72  -only..**.** Zer
bc10: 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  o is returned if
bc20: 20 74 68 65 20 63 61 6c 6c 20 63 6f 6d 70 6c 65   the call comple
bc30: 74 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  tes successfully
bc40: 2c 20 6f 72 20 2d 31 20 69 66 20 61 20 63 61 6c  , or -1 if a cal
bc50: 6c 0a 2a 2a 20 74 6f 20 66 63 6e 74 6c 28 29 20  l.** to fcntl() 
bc60: 66 61 69 6c 73 2e 20 49 6e 20 74 68 69 73 20 63  fails. In this c
bc70: 61 73 65 2c 20 65 72 72 6e 6f 20 69 73 20 73 65  ase, errno is se
bc80: 74 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 20  t appropriately 
bc90: 28 62 79 20 66 63 6e 74 6c 28 29 29 2e 0a 2a 2f  (by fcntl())..*/
bca0: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
bcb0: 46 69 6c 65 4c 6f 63 6b 28 75 6e 69 78 46 69 6c  FileLock(unixFil
bcc0: 65 20 2a 70 46 69 6c 65 2c 20 73 74 72 75 63 74  e *pFile, struct
bcd0: 20 66 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 29 7b 0a   flock *pLock){.
bce0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78    int rc;.  unix
bcf0: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
bd00: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
bd10: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69  e;.  assert( uni
bd20: 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  xMutexHeld() );.
bd30: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
bd40: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70 46  !=0 );.  if( (pF
bd50: 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
bd60: 20 28 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 7c   (UNIXFILE_EXCL|
bd70: 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 29  UNIXFILE_RDONLY)
bd80: 29 3d 3d 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c  )==UNIXFILE_EXCL
bd90: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f   ){.    if( pIno
bda0: 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
bdb0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72  ==0 ){.      str
bdc0: 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a  uct flock lock;.
bdd0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
bde0: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29  node->nLock==0 )
bdf0: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  ;.      lock.l_w
be00: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
be10: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  ;.      lock.l_s
be20: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
be30: 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  RST;.      lock.
be40: 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
be50: 49 5a 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  IZE;.      lock.
be60: 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b  l_type = F_WRLCK
be70: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6f 73 46  ;.      rc = osF
be80: 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  cntl(pFile->h, F
be90: 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a  _SETLK, &lock);.
bea0: 20 20 20 20 20 20 69 66 28 20 72 63 3c 30 20 29        if( rc<0 )
beb0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
bec0: 20 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65    pInode->bProce
bed0: 73 73 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20  ssLock = 1;.    
bee0: 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b    pInode->nLock+
bef0: 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  +;.    }else{.  
bf00: 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20      rc = 0;.    
bf10: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
bf20: 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c  c = osFcntl(pFil
bf30: 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 70  e->h, F_SETLK, p
bf40: 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Lock);.  }.  ret
bf50: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
bf60: 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77   Lock the file w
bf70: 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65  ith the lock spe
bf80: 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
bf90: 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20  ter eFileLock - 
bfa0: 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
bfb0: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
bfc0: 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
bfd0: 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
bfe0: 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
bff0: 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
c000: 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
c010: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
c020: 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
c030: 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
c040: 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
c050: 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
c060: 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
c070: 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
c080: 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
c090: 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
c0a0: 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
c0b0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
c0c0: 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
c0d0: 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
c0e0: 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
c0f0: 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
c100: 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
c110: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
c120: 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
c130: 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
c140: 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
c150: 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
c160: 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
c170: 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
c180: 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
c190: 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
c1a0: 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
c1b0: 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
c1c0: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
c1d0: 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
c1e0: 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
c1f0: 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
c200: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
c210: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
c220: 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
c230: 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65  ase a lock.  Use
c240: 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   the sqlite3OsUn
c250: 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  lock().** routin
c260: 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63  e to lower a loc
c270: 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73  king level..*/.s
c280: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f  tatic int unixLo
c290: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
c2a0: 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
c2b0: 63 6b 29 7b 0a 20 20 2f 2a 20 54 68 65 20 66 6f  ck){.  /* The fo
c2c0: 6c 6c 6f 77 69 6e 67 20 64 65 73 63 72 69 62 65  llowing describe
c2d0: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
c2e0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 61 72 69  tion of the vari
c2f0: 6f 75 73 20 6c 6f 63 6b 73 20 61 6e 64 0a 20 20  ous locks and.  
c300: 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e 73 69 74 69  ** lock transiti
c310: 6f 6e 73 20 69 6e 20 74 65 72 6d 73 20 6f 66 20  ons in terms of 
c320: 74 68 65 20 50 4f 53 49 58 20 61 64 76 69 73 6f  the POSIX adviso
c330: 72 79 20 73 68 61 72 65 64 20 61 6e 64 20 65 78  ry shared and ex
c340: 63 6c 75 73 69 76 65 0a 20 20 2a 2a 20 6c 6f 63  clusive.  ** loc
c350: 6b 20 70 72 69 6d 69 74 69 76 65 73 20 28 63 61  k primitives (ca
c360: 6c 6c 65 64 20 72 65 61 64 2d 6c 6f 63 6b 73 20  lled read-locks 
c370: 61 6e 64 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20  and write-locks 
c380: 62 65 6c 6f 77 2c 20 74 6f 20 61 76 6f 69 64 0a  below, to avoid.
c390: 20 20 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 77    ** confusion w
c3a0: 69 74 68 20 53 51 4c 69 74 65 20 6c 6f 63 6b 20  ith SQLite lock 
c3b0: 6e 61 6d 65 73 29 2e 20 54 68 65 20 61 6c 67 6f  names). The algo
c3c0: 72 69 74 68 6d 73 20 61 72 65 20 63 6f 6d 70 6c  rithms are compl
c3d0: 69 63 61 74 65 64 0a 20 20 2a 2a 20 73 6c 69 67  icated.  ** slig
c3e0: 68 74 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f  htly in order to
c3f0: 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77   be compatible w
c400: 69 74 68 20 77 69 6e 64 6f 77 73 20 73 79 73 74  ith windows syst
c410: 65 6d 73 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  ems simultaneous
c420: 6c 79 0a 20 20 2a 2a 20 61 63 63 65 73 73 69 6e  ly.  ** accessin
c430: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
c440: 61 73 65 20 66 69 6c 65 2c 20 69 6e 20 63 61 73  ase file, in cas
c450: 65 20 74 68 61 74 20 69 73 20 65 76 65 72 20 72  e that is ever r
c460: 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20  equired..  **.  
c470: 2a 2a 20 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e  ** Symbols defin
c480: 65 64 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e  ed in os.h inden
c490: 74 69 66 79 20 74 68 65 20 27 70 65 6e 64 69 6e  tify the 'pendin
c4a0: 67 20 62 79 74 65 27 20 61 6e 64 20 74 68 65 20  g byte' and the 
c4b0: 27 72 65 73 65 72 76 65 64 0a 20 20 2a 2a 20 62  'reserved.  ** b
c4c0: 79 74 65 27 2c 20 65 61 63 68 20 73 69 6e 67 6c  yte', each singl
c4d0: 65 20 62 79 74 65 73 20 61 74 20 77 65 6c 6c 20  e bytes at well 
c4e0: 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20 61  known offsets, a
c4f0: 6e 64 20 74 68 65 20 27 73 68 61 72 65 64 20 62  nd the 'shared b
c500: 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c  yte.  ** range',
c510: 20 61 20 72 61 6e 67 65 20 6f 66 20 35 31 30 20   a range of 510 
c520: 62 79 74 65 73 20 61 74 20 61 20 77 65 6c 6c 20  bytes at a well 
c530: 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20  known offset..  
c540: 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69  **.  ** To obtai
c550: 6e 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  n a SHARED lock,
c560: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20   a read-lock is 
c570: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
c580: 27 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79  'pending.  ** by
c590: 74 65 27 2e 20 20 49 66 20 74 68 69 73 20 69 73  te'.  If this is
c5a0: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20 72   successful, a r
c5b0: 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20  andom byte from 
c5c0: 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65  the 'shared byte
c5d0: 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20  .  ** range' is 
c5e0: 72 65 61 64 2d 6c 6f 63 6b 65 64 20 61 6e 64 20  read-locked and 
c5f0: 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
c600: 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 72  'pending byte' r
c610: 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2a 0a 20 20  eleased..  **.  
c620: 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79  ** A process may
c630: 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 52   only obtain a R
c640: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 66 74  ESERVED lock aft
c650: 65 72 20 69 74 20 68 61 73 20 61 20 53 48 41 52  er it has a SHAR
c660: 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20  ED lock..  ** A 
c670: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
c680: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
c690: 67 72 61 62 62 69 6e 67 20 61 20 77 72 69 74 65  grabbing a write
c6a0: 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a  -lock on the.  *
c6b0: 2a 20 27 72 65 73 65 72 76 65 64 20 62 79 74 65  * 'reserved byte
c6c0: 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  '. .  **.  ** A 
c6d0: 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79  process may only
c6e0: 20 6f 62 74 61 69 6e 20 61 20 50 45 4e 44 49 4e   obtain a PENDIN
c6f0: 47 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20  G lock after it 
c700: 68 61 73 20 6f 62 74 61 69 6e 65 64 20 61 0a 20  has obtained a. 
c710: 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e   ** SHARED lock.
c720: 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
c730: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  is implemented b
c740: 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72  y obtaining a wr
c750: 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e  ite-lock.  ** on
c760: 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79   the 'pending by
c770: 74 65 27 2e 20 54 68 69 73 20 65 6e 73 75 72 65  te'. This ensure
c780: 73 20 74 68 61 74 20 6e 6f 20 6e 65 77 20 53 48  s that no new SH
c790: 41 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62  ARED locks can b
c7a0: 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c  e.  ** obtained,
c7b0: 20 62 75 74 20 65 78 69 73 74 69 6e 67 20 53 48   but existing SH
c7c0: 41 52 45 44 20 6c 6f 63 6b 73 20 61 72 65 20 61  ARED locks are a
c7d0: 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72 73 69 73  llowed to persis
c7e0: 74 2e 20 41 20 70 72 6f 63 65 73 73 0a 20 20 2a  t. A process.  *
c7f0: 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  * does not have 
c800: 74 6f 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45  to obtain a RESE
c810: 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
c820: 20 77 61 79 20 74 6f 20 61 20 50 45 4e 44 49 4e   way to a PENDIN
c830: 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69  G lock..  ** Thi
c840: 73 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73  s property is us
c850: 65 64 20 62 79 20 74 68 65 20 61 6c 67 6f 72 69  ed by the algori
c860: 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20  thm for rolling 
c870: 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66  back a journal f
c880: 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72 20 61  ile.  ** after a
c890: 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a   crash..  **.  *
c8a0: 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  * An EXCLUSIVE l
c8b0: 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61 66  ock, obtained af
c8c0: 74 65 72 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  ter a PENDING lo
c8d0: 63 6b 20 69 73 20 68 65 6c 64 2c 20 69 73 0a 20  ck is held, is. 
c8e0: 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   ** implemented 
c8f0: 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77  by obtaining a w
c900: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
c910: 20 65 6e 74 69 72 65 20 27 73 68 61 72 65 64 20   entire 'shared 
c920: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
c930: 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65  . Since all othe
c940: 72 20 6c 6f 63 6b 73 20 72 65 71 75 69 72 65 20  r locks require 
c950: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f  a read-lock on o
c960: 6e 65 20 6f 66 20 74 68 65 20 62 79 74 65 73 0a  ne of the bytes.
c970: 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73    ** within this
c980: 20 72 61 6e 67 65 2c 20 74 68 69 73 20 65 6e 73   range, this ens
c990: 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6f 74 68  ures that no oth
c9a0: 65 72 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c  er locks are hel
c9b0: 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  d on the.  ** da
c9c0: 74 61 62 61 73 65 2e 20 0a 20 20 2a 2a 0a 20 20  tabase. .  **.  
c9d0: 2a 2a 20 54 68 65 20 72 65 61 73 6f 6e 20 61 20  ** The reason a 
c9e0: 73 69 6e 67 6c 65 20 62 79 74 65 20 63 61 6e 6e  single byte cann
c9f0: 6f 74 20 62 65 20 75 73 65 64 20 69 6e 73 74 65  ot be used inste
ca00: 61 64 20 6f 66 20 74 68 65 20 27 73 68 61 72 65  ad of the 'share
ca10: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
ca20: 65 27 20 69 73 20 74 68 61 74 20 73 6f 6d 65 20  e' is that some 
ca30: 76 65 72 73 69 6f 6e 73 20 6f 66 20 77 69 6e 64  versions of wind
ca40: 6f 77 73 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f  ows do not suppo
ca50: 72 74 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 20 42  rt read-locks. B
ca60: 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61  y.  ** locking a
ca70: 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f   random byte fro
ca80: 6d 20 61 20 72 61 6e 67 65 2c 20 63 6f 6e 63 75  m a range, concu
ca90: 72 72 65 6e 74 20 53 48 41 52 45 44 20 6c 6f 63  rrent SHARED loc
caa0: 6b 73 20 6d 61 79 20 65 78 69 73 74 0a 20 20 2a  ks may exist.  *
cab0: 2a 20 65 76 65 6e 20 69 66 20 74 68 65 20 6c 6f  * even if the lo
cac0: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 20  cking primitive 
cad0: 75 73 65 64 20 69 73 20 61 6c 77 61 79 73 20 61  used is always a
cae0: 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a   write-lock..  *
caf0: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
cb00: 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
cb10: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
cb20: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69  xFile*)id;.  uni
cb30: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
cb40: 64 65 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  de;.  struct flo
cb50: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 74  ck lock;.  int t
cb60: 45 72 72 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73  Errno = 0;..  as
cb70: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
cb80: 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
cb90: 20 20 20 25 64 20 25 73 20 77 61 73 20 25 73 28     %d %s was %s(
cba0: 25 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75  %s,%d) pid=%d (u
cbb0: 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  nix)\n", pFile->
cbc0: 68 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c  h,.      azFileL
cbd0: 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  ock(eFileLock), 
cbe0: 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  azFileLock(pFile
cbf0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20  ->eFileLock),.  
cc00: 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70      azFileLock(p
cc10: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46  File->pInode->eF
cc20: 69 6c 65 4c 6f 63 6b 29 2c 20 70 46 69 6c 65 2d  ileLock), pFile-
cc30: 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64  >pInode->nShared
cc40: 2c 0a 20 20 20 20 20 20 6f 73 47 65 74 70 69 64  ,.      osGetpid
cc50: 28 30 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  (0)));..  /* If 
cc60: 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
cc70: 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20   a lock of this 
cc80: 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73  type or more res
cc90: 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a  trictive on the.
cca0: 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64    ** unixFile, d
ccb0: 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74  o nothing. Don't
ccc0: 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63   use the end_loc
ccd0: 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73  k: exit path, as
cce0: 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d  .  ** unixEnterM
ccf0: 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65  utex() hasn't be
cd00: 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20  en called yet.. 
cd10: 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
cd20: 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c  >eFileLock>=eFil
cd30: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54  eLock ){.    OST
cd40: 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
cd50: 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79  d %s ok (already
cd60: 20 68 65 6c 64 29 20 28 75 6e 69 78 29 5c 6e 22   held) (unix)\n"
cd70: 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  , pFile->h,.    
cd80: 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f          azFileLo
cd90: 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b  ck(eFileLock)));
cda0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
cdb0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
cdc0: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c   Make sure the l
cdd0: 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20  ocking sequence 
cde0: 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2a  is correct..  **
cdf0: 20 20 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d    (1) We never m
ce00: 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65  ove from unlocke
ce10: 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69  d to anything hi
ce20: 67 68 65 72 20 74 68 61 6e 20 73 68 61 72 65 64  gher than shared
ce30: 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29   lock..  **  (2)
ce40: 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78   SQLite never ex
ce50: 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73 74  plicitly request
ce60: 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e  s a pendig lock.
ce70: 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61  .  **  (3) A sha
ce80: 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61  red lock is alwa
ce90: 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72  ys held when a r
cea0: 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72  eserve lock is r
ceb0: 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20  equested..  */. 
cec0: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
ced0: 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f  eFileLock!=NO_LO
cee0: 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d  CK || eFileLock=
cef0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
cf00: 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
cf10: 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock!=PENDING_LOC
cf20: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  K );.  assert( e
cf30: 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56  FileLock!=RESERV
cf40: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65  ED_LOCK || pFile
cf50: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ->eFileLock==SHA
cf60: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  RED_LOCK );..  /
cf70: 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69 73 20  * This mutex is 
cf80: 6e 65 65 64 65 64 20 62 65 63 61 75 73 65 20 70  needed because p
cf90: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20  File->pInode is 
cfa0: 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68  shared across th
cfb0: 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69  reads.  */.  uni
cfc0: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
cfd0: 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d   pInode = pFile-
cfe0: 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49  >pInode;..  /* I
cff0: 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73  f some thread us
d000: 69 6e 67 20 74 68 69 73 20 50 49 44 20 68 61 73  ing this PID has
d010: 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69   a lock via a di
d020: 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65  fferent unixFile
d030: 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68  *.  ** handle th
d040: 61 74 20 70 72 65 63 6c 75 64 65 73 20 74 68 65  at precludes the
d050: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c   requested lock,
d060: 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20   return BUSY..  
d070: 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d  */.  if( (pFile-
d080: 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f  >eFileLock!=pIno
d090: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26  de->eFileLock &&
d0a0: 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 49 6e   .          (pIn
d0b0: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ode->eFileLock>=
d0c0: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20  PENDING_LOCK || 
d0d0: 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
d0e0: 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20  _LOCK)).  ){.   
d0f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
d100: 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  Y;.    goto end_
d110: 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  lock;.  }..  /* 
d120: 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  If a SHARED lock
d130: 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 61   is requested, a
d140: 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75  nd some thread u
d150: 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c  sing this PID al
d160: 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61  ready.  ** has a
d170: 20 53 48 41 52 45 44 20 6f 72 20 52 45 53 45 52   SHARED or RESER
d180: 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69  VED lock, then i
d190: 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e  ncrement referen
d1a0: 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20  ce counts and.  
d1b0: 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
d1c0: 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  _OK..  */.  if( 
d1d0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
d1e0: 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20  D_LOCK && .     
d1f0: 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c   (pInode->eFileL
d200: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
d210: 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c   || pInode->eFil
d220: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
d230: 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73  LOCK) ){.    ass
d240: 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ert( eFileLock==
d250: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
d260: 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
d270: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29  ->eFileLock==0 )
d280: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
d290: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20  node->nShared>0 
d2a0: 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  );.    pFile->eF
d2b0: 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44  ileLock = SHARED
d2c0: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64  _LOCK;.    pInod
d2d0: 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20  e->nShared++;.  
d2e0: 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b    pInode->nLock+
d2f0: 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  +;.    goto end_
d300: 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a  lock;.  }...  /*
d310: 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
d320: 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65  is needed before
d330: 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41   acquiring a SHA
d340: 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66  RED lock and bef
d350: 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69  ore.  ** acquiri
d360: 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
d370: 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53  lock.  For the S
d380: 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20  HARED lock, the 
d390: 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a  PENDING will.  *
d3a0: 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20  * be released.. 
d3b0: 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e   */.  lock.l_len
d3c0: 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f   = 1L;.  lock.l_
d3d0: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
d3e0: 54 3b 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  T;.  if( eFileLo
d3f0: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
d400: 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65  .      || (eFile
d410: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
d420: 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65  LOCK && pFile->e
d430: 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47  FileLock<PENDING
d440: 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20  _LOCK).  ){.    
d450: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28 65  lock.l_type = (e
d460: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
d470: 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f  _LOCK?F_RDLCK:F_
d480: 57 52 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b  WRLCK);.    lock
d490: 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49  .l_start = PENDI
d4a0: 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 69 66 28  NG_BYTE;.    if(
d4b0: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
d4c0: 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20  ile, &lock) ){. 
d4d0: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
d4e0: 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
d4f0: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
d500: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
d510: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
d520: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
d530: 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc!=SQLITE_BUSY 
d540: 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65  ){.        store
d550: 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
d560: 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20   tErrno);.      
d570: 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  }.      goto end
d580: 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  _lock;.    }.  }
d590: 0a 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72  ...  /* If contr
d5a0: 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73 20  ol gets to this 
d5b0: 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75  point, then actu
d5c0: 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e  ally go ahead an
d5d0: 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72  d make.  ** oper
d5e0: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c  ating system cal
d5f0: 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  ls for the speci
d600: 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a  fied lock..  */.
d610: 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
d620: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
d630: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
d640: 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29  de->nShared==0 )
d650: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
d660: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
d670: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
d680: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
d690: 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67  );..    /* Now g
d6a0: 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b  et the read-lock
d6b0: 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73   */.    lock.l_s
d6c0: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
d6d0: 52 53 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  RST;.    lock.l_
d6e0: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
d6f0: 45 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46  E;.    if( unixF
d700: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
d710: 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74  lock) ){.      t
d720: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
d730: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d740: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
d750: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
d760: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
d770: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 72      }..    /* Dr
d780: 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  op the temporary
d790: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f   PENDING lock */
d7a0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  .    lock.l_star
d7b0: 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  t = PENDING_BYTE
d7c0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  ;.    lock.l_len
d7d0: 20 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e   = 1L;.    lock.
d7e0: 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
d7f0: 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69  ;.    if( unixFi
d800: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
d810: 6f 63 6b 29 20 26 26 20 72 63 3d 3d 53 51 4c 49  ock) && rc==SQLI
d820: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
d830: 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 68 61 70  * This could hap
d840: 70 65 6e 20 77 69 74 68 20 61 20 6e 65 74 77 6f  pen with a netwo
d850: 72 6b 20 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20 20  rk mount */.    
d860: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
d870: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
d880: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
d890: 3b 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  ; .    }..    if
d8a0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66  ( rc ){.      if
d8b0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc!=SQLITE_BUS
d8c0: 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f  Y ){.        sto
d8d0: 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
d8e0: 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20  e, tErrno);.    
d8f0: 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65    }.      goto e
d900: 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c  nd_lock;.    }el
d910: 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  se{.      pFile-
d920: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
d930: 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  RED_LOCK;.      
d940: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  pInode->nLock++;
d950: 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  .      pInode->n
d960: 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20  Shared = 1;.    
d970: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46  }.  }else if( eF
d980: 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
d990: 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64  VE_LOCK && pInod
d9a0: 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a  e->nShared>1 ){.
d9b0: 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72      /* We are tr
d9c0: 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c  ying for an excl
d9d0: 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61  usive lock but a
d9e0: 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 6e  nother thread in
d9f0: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 73 61 6d   this.    ** sam
da00: 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69  e process is sti
da10: 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61  ll holding a sha
da20: 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20  red lock. */.   
da30: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
da40: 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
da50: 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 77  /* The request w
da60: 61 73 20 66 6f 72 20 61 20 52 45 53 45 52 56 45  as for a RESERVE
da70: 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
da80: 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20  ock.  It is.    
da90: 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  ** assumed that 
daa0: 74 68 65 72 65 20 69 73 20 61 20 53 48 41 52 45  there is a SHARE
dab0: 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  D or greater loc
dac0: 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20  k on the file.  
dad0: 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20    ** already..  
dae0: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
daf0: 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65   0!=pFile->eFile
db00: 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 6c 6f 63 6b  Lock );.    lock
db10: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43  .l_type = F_WRLC
db20: 4b 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  K;..    assert( 
db30: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
db40: 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c  VED_LOCK || eFil
db50: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
db60: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 69 66 28  _LOCK );.    if(
db70: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45   eFileLock==RESE
db80: 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RVED_LOCK ){.   
db90: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
dba0: 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b  = RESERVED_BYTE;
dbb0: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  .      lock.l_le
dbc0: 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 7d 65 6c 73  n = 1L;.    }els
dbd0: 65 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  e{.      lock.l_
dbe0: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
dbf0: 49 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  IRST;.      lock
dc00: 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f  .l_len = SHARED_
dc10: 53 49 5a 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  SIZE;.    }..   
dc20: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
dc30: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20  k(pFile, &lock) 
dc40: 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  ){.      tErrno 
dc50: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
dc60: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
dc70: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
dc80: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
dc90: 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  RR_LOCK);.      
dca0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42  if( rc!=SQLITE_B
dcb0: 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73  USY ){.        s
dcc0: 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
dcd0: 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
dce0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
dcf0: 20 20 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54    ..#ifdef SQLIT
dd00: 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 53 65 74  E_DEBUG.  /* Set
dd10: 20 75 70 20 74 68 65 20 74 72 61 6e 73 61 63 74   up the transact
dd20: 69 6f 6e 2d 63 6f 75 6e 74 65 72 20 63 68 61 6e  ion-counter chan
dd30: 67 65 20 63 68 65 63 6b 69 6e 67 20 66 6c 61 67  ge checking flag
dd40: 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74 72 61 6e  s when.  ** tran
dd50: 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 61  sitioning from a
dd60: 20 53 48 41 52 45 44 20 74 6f 20 61 20 52 45 53   SHARED to a RES
dd70: 45 52 56 45 44 20 6c 6f 63 6b 2e 20 20 54 68 65  ERVED lock.  The
dd80: 20 63 68 61 6e 67 65 0a 20 20 2a 2a 20 66 72 6f   change.  ** fro
dd90: 6d 20 53 48 41 52 45 44 20 74 6f 20 52 45 53 45  m SHARED to RESE
dda0: 52 56 45 44 20 6d 61 72 6b 73 20 74 68 65 20 62  RVED marks the b
ddb0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 6e 6f  eginning of a no
ddc0: 72 6d 61 6c 0a 20 20 2a 2a 20 77 72 69 74 65 20  rmal.  ** write 
ddd0: 6f 70 65 72 61 74 69 6f 6e 20 28 6e 6f 74 20 61  operation (not a
dde0: 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot journal rol
ddf0: 6c 62 61 63 6b 29 2e 0a 20 20 2a 2f 0a 20 20 69  lback)..  */.  i
de00: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
de10: 0a 20 20 20 26 26 20 70 46 69 6c 65 2d 3e 65 46  .   && pFile->eF
de20: 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
de30: 4c 4f 43 4b 0a 20 20 20 26 26 20 65 46 69 6c 65  LOCK.   && eFile
de40: 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
de50: 4f 43 4b 0a 20 20 29 7b 0a 20 20 20 20 70 46 69  OCK.  ){.    pFi
de60: 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e  le->transCntrChn
de70: 67 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65  g = 0;.    pFile
de80: 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a  ->dbUpdate = 0;.
de90: 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72      pFile->inNor
dea0: 6d 61 6c 57 72 69 74 65 20 3d 20 31 3b 0a 20 20  malWrite = 1;.  
deb0: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 69 66 28  }.#endif...  if(
dec0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
ded0: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
dee0: 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
def0: 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ck;.    pInode->
df00: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
df10: 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69  eLock;.  }else i
df20: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  f( eFileLock==EX
df30: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
df40: 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
df50: 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  Lock = PENDING_L
df60: 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  OCK;.    pInode-
df70: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e  >eFileLock = PEN
df80: 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a  DING_LOCK;.  }..
df90: 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78  end_lock:.  unix
dfa0: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
dfb0: 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
dfc0: 20 20 25 64 20 25 73 20 25 73 20 28 75 6e 69 78    %d %s %s (unix
dfd0: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
dfe0: 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
dff0: 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 72 63  Lock), .      rc
e000: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f  ==SQLITE_OK ? "o
e010: 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
e020: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
e030: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 66  ./*.** Add the f
e040: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 75  ile descriptor u
e050: 73 65 64 20 62 79 20 66 69 6c 65 20 68 61 6e 64  sed by file hand
e060: 6c 65 20 70 46 69 6c 65 20 74 6f 20 74 68 65 20  le pFile to the 
e070: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
e080: 20 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a   pUnused list..*
e090: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
e0a0: 74 50 65 6e 64 69 6e 67 46 64 28 75 6e 69 78 46  tPendingFd(unixF
e0b0: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75  ile *pFile){.  u
e0c0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
e0d0: 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
e0e0: 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73  node;.  UnixUnus
e0f0: 65 64 46 64 20 2a 70 20 3d 20 70 46 69 6c 65 2d  edFd *p = pFile-
e100: 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70 2d 3e 70  >pUnused;.  p->p
e110: 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70  Next = pInode->p
e120: 55 6e 75 73 65 64 3b 0a 20 20 70 49 6e 6f 64 65  Unused;.  pInode
e130: 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 3b 0a 20  ->pUnused = p;. 
e140: 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a   pFile->h = -1;.
e150: 20 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64    pFile->pUnused
e160: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c   = 0;.}../*.** L
e170: 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
e180: 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
e190: 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
e1a0: 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
e1b0: 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
e1c0: 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
e1d0: 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
e1e0: 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
e1f0: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
e200: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
e210: 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
e220: 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
e230: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
e240: 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
e250: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
e260: 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 68  -op..** .** If h
e270: 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 69  andleNFSUnlock i
e280: 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 20  s true, then on 
e290: 64 6f 77 6e 67 72 61 64 69 6e 67 20 61 6e 20 45  downgrading an E
e2a0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 74 6f  XCLUSIVE_LOCK to
e2b0: 20 53 48 41 52 45 44 0a 2a 2a 20 74 68 65 20 62   SHARED.** the b
e2c0: 79 74 65 20 72 61 6e 67 65 20 69 73 20 64 69 76  yte range is div
e2d0: 69 64 65 64 20 69 6e 74 6f 20 32 20 70 61 72 74  ided into 2 part
e2e0: 73 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  s and the first 
e2f0: 70 61 72 74 20 69 73 20 75 6e 6c 6f 63 6b 65 64  part is unlocked
e300: 20 74 68 65 6e 0a 2a 2a 20 73 65 74 20 74 6f 20   then.** set to 
e310: 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 74 68 65  a read lock, the
e320: 6e 20 74 68 65 20 6f 74 68 65 72 20 70 61 72 74  n the other part
e330: 20 69 73 20 73 69 6d 70 6c 79 20 75 6e 6c 6f 63   is simply unloc
e340: 6b 65 64 2e 20 20 54 68 69 73 20 77 6f 72 6b 73  ked.  This works
e350: 20 0a 2a 2a 20 61 72 6f 75 6e 64 20 61 20 62 75   .** around a bu
e360: 67 20 69 6e 20 42 53 44 20 4e 46 53 20 6c 6f 63  g in BSD NFS loc
e370: 6b 64 20 28 61 6c 73 6f 20 73 65 65 6e 20 6f 6e  kd (also seen on
e380: 20 4d 61 63 4f 53 58 20 31 30 2e 33 2b 29 20 74   MacOSX 10.3+) t
e390: 68 61 74 20 66 61 69 6c 73 20 74 6f 20 0a 2a 2a  hat fails to .**
e3a0: 20 72 65 6d 6f 76 65 20 74 68 65 20 77 72 69 74   remove the writ
e3b0: 65 20 6c 6f 63 6b 20 6f 6e 20 61 20 72 65 67 69  e lock on a regi
e3c0: 6f 6e 20 77 68 65 6e 20 61 20 72 65 61 64 20 6c  on when a read l
e3d0: 6f 63 6b 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 73  ock is set..*/.s
e3e0: 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78 55  tatic int posixU
e3f0: 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
e400: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
e410: 65 4c 6f 63 6b 2c 20 69 6e 74 20 68 61 6e 64 6c  eLock, int handl
e420: 65 4e 46 53 55 6e 6c 6f 63 6b 29 7b 0a 20 20 75  eNFSUnlock){.  u
e430: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
e440: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
e450: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
e460: 2a 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63  *pInode;.  struc
e470: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20  t flock lock;.  
e480: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
e490: 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
e4a0: 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
e4b0: 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
e4c0: 64 20 77 61 73 20 25 64 28 25 64 2c 25 64 29 20  d was %d(%d,%d) 
e4d0: 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22  pid=%d (unix)\n"
e4e0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c  , pFile->h, eFil
e4f0: 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 70 46 69  eLock,.      pFi
e500: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70  le->eFileLock, p
e510: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46  File->pInode->eF
e520: 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e  ileLock, pFile->
e530: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c  pInode->nShared,
e540: 0a 20 20 20 20 20 20 6f 73 47 65 74 70 69 64 28  .      osGetpid(
e550: 30 29 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  0)));..  assert(
e560: 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52   eFileLock<=SHAR
e570: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28  ED_LOCK );.  if(
e580: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
e590: 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a  k<=eFileLock ){.
e5a0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e5b0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78  E_OK;.  }.  unix
e5c0: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
e5d0: 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
e5e0: 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74  pInode;.  assert
e5f0: 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
e600: 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46  d!=0 );.  if( pF
e610: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53  ile->eFileLock>S
e620: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
e630: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
e640: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69  ->eFileLock==pFi
e650: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b  le->eFileLock );
e660: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
e670: 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65  DEBUG.    /* Whe
e680: 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63  n reducing a loc
e690: 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74 68 65  k such that othe
e6a0: 72 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20  r processes can 
e6b0: 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61  start.    ** rea
e6c0: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
e6d0: 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61  e file again, ma
e6e0: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
e6f0: 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
e700: 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20  ion counter was 
e710: 75 70 64 61 74 65 64 20 69 66 20 61 6e 79 20 70  updated if any p
e720: 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  art of the datab
e730: 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  ase.    ** file 
e740: 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65  changed.  If the
e750: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
e760: 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61  nter is not upda
e770: 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65  ted,.    ** othe
e780: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f  r connections to
e790: 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d   the same file m
e7a0: 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65  ight not realize
e7b0: 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65   that.    ** the
e7c0: 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65   file has change
e7d0: 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68  d and hence migh
e7e0: 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c  t not know to fl
e7f0: 75 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a  ush their.    **
e800: 20 63 61 63 68 65 2e 20 20 54 68 65 20 75 73 65   cache.  The use
e810: 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63 68   of a stale cach
e820: 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61  e can lead to da
e830: 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
e840: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 46  n..    */.    pF
e850: 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
e860: 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  te = 0;.#endif..
e870: 20 20 20 20 2f 2a 20 64 6f 77 6e 67 72 61 64 69      /* downgradi
e880: 6e 67 20 74 6f 20 61 20 73 68 61 72 65 64 20 6c  ng to a shared l
e890: 6f 63 6b 20 6f 6e 20 4e 46 53 20 69 6e 76 6f 6c  ock on NFS invol
e8a0: 76 65 73 20 63 6c 65 61 72 69 6e 67 20 74 68 65  ves clearing the
e8b0: 20 77 72 69 74 65 20 6c 6f 63 6b 0a 20 20 20 20   write lock.    
e8c0: 2a 2a 20 62 65 66 6f 72 65 20 65 73 74 61 62 6c  ** before establ
e8d0: 69 73 68 69 6e 67 20 74 68 65 20 72 65 61 64 6c  ishing the readl
e8e0: 6f 63 6b 20 2d 20 74 6f 20 61 76 6f 69 64 20 61  ock - to avoid a
e8f0: 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   race condition 
e900: 77 65 20 64 6f 77 6e 67 72 61 64 65 0a 20 20 20  we downgrade.   
e910: 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 20 69 6e 20   ** the lock in 
e920: 32 20 62 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 61  2 blocks, so tha
e930: 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 61  t part of the ra
e940: 6e 67 65 20 77 69 6c 6c 20 62 65 20 63 6f 76 65  nge will be cove
e950: 72 65 64 20 62 79 20 61 20 0a 20 20 20 20 2a 2a  red by a .    **
e960: 20 77 72 69 74 65 20 6c 6f 63 6b 20 75 6e 74 69   write lock unti
e970: 6c 20 74 68 65 20 72 65 73 74 20 69 73 20 63 6f  l the rest is co
e980: 76 65 72 65 64 20 62 79 20 61 20 72 65 61 64 20  vered by a read 
e990: 6c 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20 20 31 3a  lock:.    **  1:
e9a0: 20 20 20 5b 57 57 57 57 57 5d 0a 20 20 20 20 2a     [WWWWW].    *
e9b0: 2a 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e 57 5d 0a  *  2:   [....W].
e9c0: 20 20 20 20 2a 2a 20 20 33 3a 20 20 20 5b 52 52      **  3:   [RR
e9d0: 52 52 57 5d 0a 20 20 20 20 2a 2a 20 20 34 3a 20  RRW].    **  4: 
e9e0: 20 20 5b 52 52 52 52 2e 5d 0a 20 20 20 20 2a 2f    [RRRR.].    */
e9f0: 0a 20 20 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  .    if( eFileLo
ea00: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
ea10: 29 7b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ){.#if !defined(
ea20: 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 21 53  __APPLE__) || !S
ea30: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
ea40: 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20  KING_STYLE.     
ea50: 20 28 76 6f 69 64 29 68 61 6e 64 6c 65 4e 46 53   (void)handleNFS
ea60: 55 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73  Unlock;.      as
ea70: 73 65 72 74 28 20 68 61 6e 64 6c 65 4e 46 53 55  sert( handleNFSU
ea80: 6e 6c 6f 63 6b 3d 3d 30 20 29 3b 0a 23 65 6e 64  nlock==0 );.#end
ea90: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  if.#if defined(_
eaa0: 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
eab0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
eac0: 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 69  NG_STYLE.      i
ead0: 66 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  f( handleNFSUnlo
eae0: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ck ){.        in
eaf0: 74 20 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20  t tErrno;       
eb00: 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
eb10: 20 63 6f 64 65 20 66 72 6f 6d 20 73 79 73 74 65   code from syste
eb20: 6d 20 63 61 6c 6c 20 65 72 72 6f 72 73 20 2a 2f  m call errors */
eb30: 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20 64  .        off_t d
eb40: 69 76 53 69 7a 65 20 3d 20 53 48 41 52 45 44 5f  ivSize = SHARED_
eb50: 53 49 5a 45 20 2d 20 31 3b 0a 20 20 20 20 20 20  SIZE - 1;.      
eb60: 20 20 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e    .        lock.
eb70: 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
eb80: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
eb90: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
eba0: 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ET;.        lock
ebb0: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
ebc0: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20  D_FIRST;.       
ebd0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69   lock.l_len = di
ebe0: 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  vSize;.        i
ebf0: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
ec00: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28  pFile, &lock)==(
ec10: 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -1) ){.         
ec20: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
ec30: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
ec40: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
ec50: 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 73  OCK;.          s
ec60: 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
ec70: 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
ec80: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
ec90: 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  _unlock;.       
eca0: 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e   }.        lock.
ecb0: 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
ecc0: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
ecd0: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
ece0: 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ET;.        lock
ecf0: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
ed00: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20  D_FIRST;.       
ed10: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69   lock.l_len = di
ed20: 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  vSize;.        i
ed30: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
ed40: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28  pFile, &lock)==(
ed50: 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -1) ){.         
ed60: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
ed70: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
ed80: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
ed90: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
eda0: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  , SQLITE_IOERR_R
edb0: 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  DLOCK);.        
edc0: 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
edd0: 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
ede0: 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
edf0: 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
ee00: 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rno);.          
ee10: 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  }.          goto
ee20: 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
ee30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c       }.        l
ee40: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
ee50: 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f  NLCK;.        lo
ee60: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
ee70: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20  EK_SET;.        
ee80: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
ee90: 48 41 52 45 44 5f 46 49 52 53 54 2b 64 69 76 53  HARED_FIRST+divS
eea0: 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  ize;.        loc
eeb0: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
eec0: 5f 53 49 5a 45 2d 64 69 76 53 69 7a 65 3b 0a 20  _SIZE-divSize;. 
eed0: 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46         if( unixF
eee0: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
eef0: 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20  lock)==(-1) ){. 
ef00: 20 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20           tErrno 
ef10: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
ef20: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
ef30: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  OERR_UNLOCK;.   
ef40: 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
ef50: 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
ef60: 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rno);.          
ef70: 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b  goto end_unlock;
ef80: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ef90: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a   }else.#endif /*
efa0: 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
efb0: 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
efc0: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
efd0: 4c 45 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20  LE */.      {.  
efe0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
eff0: 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20  e = F_RDLCK;.   
f000: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
f010: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
f020: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74         lock.l_st
f030: 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
f040: 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ST;.        lock
f050: 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f  .l_len = SHARED_
f060: 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 69 66  SIZE;.        if
f070: 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
f080: 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a  File, &lock) ){.
f090: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
f0a0: 74 68 65 6f 72 79 2c 20 74 68 65 20 63 61 6c 6c  theory, the call
f0b0: 20 74 6f 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b   to unixFileLock
f0c0: 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 62  () cannot fail b
f0d0: 65 63 61 75 73 65 20 61 6e 6f 74 68 65 72 0a 20  ecause another. 
f0e0: 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
f0f0: 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 61  ess is holding a
f100: 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6c  n incompatible l
f110: 6f 63 6b 2e 20 49 66 20 69 74 20 64 6f 65 73 2c  ock. If it does,
f120: 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20   this .         
f130: 20 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 74 68   ** indicates th
f140: 61 74 20 74 68 65 20 6f 74 68 65 72 20 70 72 6f  at the other pro
f150: 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c  cess is not foll
f160: 6f 77 69 6e 67 20 74 68 65 20 6c 6f 63 6b 69 6e  owing the lockin
f170: 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  g.          ** p
f180: 72 6f 74 6f 63 6f 6c 2e 20 49 66 20 74 68 69 73  rotocol. If this
f190: 20 68 61 70 70 65 6e 73 2c 20 72 65 74 75 72 6e   happens, return
f1a0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44   SQLITE_IOERR_RD
f1b0: 4c 4f 43 4b 2e 20 52 65 74 75 72 6e 69 6e 67 0a  LOCK. Returning.
f1c0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c            ** SQL
f1d0: 49 54 45 5f 42 55 53 59 20 77 6f 75 6c 64 20 63  ITE_BUSY would c
f1e0: 6f 6e 66 75 73 65 20 74 68 65 20 75 70 70 65 72  onfuse the upper
f1f0: 20 6c 61 79 65 72 20 28 69 6e 20 70 72 61 63 74   layer (in pract
f200: 69 63 65 20 69 74 20 63 61 75 73 65 73 20 0a 20  ice it causes . 
f210: 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 20 61           ** an a
f220: 73 73 65 72 74 20 74 6f 20 66 61 69 6c 29 2e 20  ssert to fail). 
f230: 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20 72 63  */ .          rc
f240: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
f250: 52 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  RDLOCK;.        
f260: 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
f270: 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a  (pFile, errno);.
f280: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
f290: 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20  nd_unlock;.     
f2a0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
f2b0: 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79   }.    lock.l_ty
f2c0: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
f2d0: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
f2e0: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
f2f0: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
f300: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
f310: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c   lock.l_len = 2L
f320: 3b 20 20 61 73 73 65 72 74 28 20 50 45 4e 44 49  ;  assert( PENDI
f330: 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53 45 52  NG_BYTE+1==RESER
f340: 56 45 44 5f 42 59 54 45 20 29 3b 0a 20 20 20 20  VED_BYTE );.    
f350: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
f360: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d  (pFile, &lock)==
f370: 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64  0 ){.      pInod
f380: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
f390: 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
f3a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
f3b0: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
f3c0: 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 73 74 6f  NLOCK;.      sto
f3d0: 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
f3e0: 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20  e, errno);.     
f3f0: 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b   goto end_unlock
f400: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
f410: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f  ( eFileLock==NO_
f420: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 44  LOCK ){.    /* D
f430: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61  ecrement the sha
f440: 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72  red lock counter
f450: 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c  .  Release the l
f460: 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20  ock using an.   
f470: 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79   ** OS call only
f480: 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64   when all thread
f490: 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70  s in this same p
f4a0: 72 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c 65  rocess have rele
f4b0: 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20  ased.    ** the 
f4c0: 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lock..    */.   
f4d0: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
f4e0: 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f  --;.    if( pIno
f4f0: 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29  de->nShared==0 )
f500: 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74  {.      lock.l_t
f510: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
f520: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
f530: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
f540: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
f550: 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d  t = lock.l_len =
f560: 20 30 4c 3b 0a 20 20 20 20 20 20 69 66 28 20 75   0L;.      if( u
f570: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
f580: 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a  e, &lock)==0 ){.
f590: 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
f5a0: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
f5b0: 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  OCK;.      }else
f5c0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
f5d0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
f5e0: 43 4b 3b 0a 20 20 20 20 20 20 20 20 73 74 6f 72  CK;.        stor
f5f0: 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
f600: 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20  , errno);.      
f610: 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
f620: 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
f630: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46         pFile->eF
f640: 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
f650: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
f660: 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
f670: 6e 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20  nt the count of 
f680: 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74 20 74 68  locks against th
f690: 69 73 20 73 61 6d 65 20 66 69 6c 65 2e 20 20 57  is same file.  W
f6a0: 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  hen the.    ** c
f6b0: 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72  ount reaches zer
f6c0: 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74 68  o, close any oth
f6d0: 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  er file descript
f6e0: 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f 73 65 0a  ors whose close.
f6f0: 20 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65 72      ** was defer
f700: 72 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 6f  red because of o
f710: 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
f720: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e  ..    */.    pIn
f730: 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20  ode->nLock--;.  
f740: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
f750: 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20  ->nLock>=0 );.  
f760: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c    if( pInode->nL
f770: 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ock==0 ){.      
f780: 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28  closePendingFds(
f790: 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pFile);.    }.  
f7a0: 7d 0a 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a 20  }..end_unlock:. 
f7b0: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
f7c0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
f7d0: 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e  ITE_OK ) pFile->
f7e0: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
f7f0: 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20  eLock;.  return 
f800: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  rc;.}../*.** Low
f810: 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
f820: 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
f830: 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
f840: 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
f850: 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62  leLock.** must b
f860: 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
f870: 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
f880: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
f890: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
f8a0: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
f8b0: 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
f8c0: 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
f8d0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
f8e0: 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
f8f0: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
f900: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
f910: 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69   unixUnlock(sqli
f920: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
f930: 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 23 69  t eFileLock){.#i
f940: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
f950: 50 5f 53 49 5a 45 3e 30 0a 20 20 61 73 73 65 72  P_SIZE>0.  asser
f960: 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  t( eFileLock==SH
f970: 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 28 28 75  ARED_LOCK || ((u
f980: 6e 69 78 46 69 6c 65 20 2a 29 69 64 29 2d 3e 6e  nixFile *)id)->n
f990: 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 23  FetchOut==0 );.#
f9a0: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70  endif.  return p
f9b0: 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65  osixUnlock(id, e
f9c0: 46 69 6c 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a  FileLock, 0);.}.
f9d0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
f9e0: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 73 74 61 74  MMAP_SIZE>0.stat
f9f0: 69 63 20 69 6e 74 20 75 6e 69 78 4d 61 70 66 69  ic int unixMapfi
fa00: 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  le(unixFile *pFd
fa10: 2c 20 69 36 34 20 6e 42 79 74 65 29 3b 0a 73 74  , i64 nByte);.st
fa20: 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 55 6e  atic void unixUn
fa30: 6d 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65  mapfile(unixFile
fa40: 20 2a 70 46 64 29 3b 0a 23 65 6e 64 69 66 0a 0a   *pFd);.#endif..
fa50: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
fa60: 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 68 65  ion performs the
fa70: 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 22 63   parts of the "c
fa80: 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70 65 72 61  lose file" opera
fa90: 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20  tion .** common 
faa0: 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73  to all locking s
fab0: 63 68 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65  chemes. It close
fac0: 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  s the directory 
fad0: 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64  and file.** hand
fae0: 6c 65 73 2c 20 69 66 20 74 68 65 79 20 61 72 65  les, if they are
faf0: 20 76 61 6c 69 64 2c 20 61 6e 64 20 73 65 74 73   valid, and sets
fb00: 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74   all fields of t
fb10: 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73  he unixFile.** s
fb20: 74 72 75 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a  tructure to 0..*
fb30: 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e 6f 74 2a  *.** It is *not*
fb40: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 68 6f   necessary to ho
fb50: 6c 64 20 74 68 65 20 6d 75 74 65 78 20 77 68 65  ld the mutex whe
fb60: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
fb70: 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65  s called,.** eve
fb80: 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 20 20 41  n on VxWorks.  A
fb90: 20 6d 75 74 65 78 20 77 69 6c 6c 20 62 65 20 61   mutex will be a
fba0: 63 71 75 69 72 65 64 20 6f 6e 20 56 78 57 6f 72  cquired on VxWor
fbb0: 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20 76 78 77  ks by the.** vxw
fbc0: 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49  orksReleaseFileI
fbd0: 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  d() routine..*/.
fbe0: 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65  static int close
fbf0: 55 6e 69 78 46 69 6c 65 28 73 71 6c 69 74 65 33  UnixFile(sqlite3
fc00: 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e  _file *id){.  un
fc10: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
fc20: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 23  (unixFile*)id;.#
fc30: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
fc40: 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78  AP_SIZE>0.  unix
fc50: 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29  Unmapfile(pFile)
fc60: 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  ;.#endif.  if( p
fc70: 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  File->h>=0 ){.  
fc80: 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
fc90: 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  File, pFile->h, 
fca0: 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 70  __LINE__);.    p
fcb0: 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20  File->h = -1;.  
fcc0: 7d 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  }.#if OS_VXWORKS
fcd0: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49  .  if( pFile->pI
fce0: 64 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 69  d ){.    if( pFi
fcf0: 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
fd00: 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 20  UNIXFILE_DELETE 
fd10: 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e  ){.      osUnlin
fd20: 6b 28 70 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43  k(pFile->pId->zC
fd30: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20  anonicalName);. 
fd40: 20 20 20 7d 0a 20 20 20 20 76 78 77 6f 72 6b 73     }.    vxworks
fd50: 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 70 46  ReleaseFileId(pF
fd60: 69 6c 65 2d 3e 70 49 64 29 3b 0a 20 20 20 20 70  ile->pId);.    p
fd70: 46 69 6c 65 2d 3e 70 49 64 20 3d 20 30 3b 0a 20  File->pId = 0;. 
fd80: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66   }.#endif.#ifdef
fd90: 20 53 51 4c 49 54 45 5f 55 4e 4c 49 4e 4b 5f 41   SQLITE_UNLINK_A
fda0: 46 54 45 52 5f 43 4c 4f 53 45 0a 20 20 69 66 28  FTER_CLOSE.  if(
fdb0: 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
fdc0: 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c  s & UNIXFILE_DEL
fdd0: 45 54 45 20 29 7b 0a 20 20 20 20 6f 73 55 6e 6c  ETE ){.    osUnl
fde0: 69 6e 6b 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68  ink(pFile->zPath
fdf0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
fe00: 72 65 65 28 2a 28 63 68 61 72 2a 2a 29 26 70 46  ree(*(char**)&pF
fe10: 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
fe20: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3d 20   pFile->zPath = 
fe30: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
fe40: 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  OSTRACE(("CLOSE 
fe50: 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65    %-3d\n", pFile
fe60: 2d 3e 68 29 29 3b 0a 20 20 4f 70 65 6e 43 6f 75  ->h));.  OpenCou
fe70: 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73 71 6c 69  nter(-1);.  sqli
fe80: 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e  te3_free(pFile->
fe90: 70 55 6e 75 73 65 64 29 3b 0a 20 20 6d 65 6d 73  pUnused);.  mems
fea0: 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a  et(pFile, 0, siz
feb0: 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a  eof(unixFile));.
fec0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fed0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  OK;.}../*.** Clo
fee0: 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  se a file..*/.st
fef0: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 6c 6f  atic int unixClo
ff00: 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
ff10: 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  *id){.  int rc =
ff20: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
ff30: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
ff40: 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a  (unixFile *)id;.
ff50: 20 20 76 65 72 69 66 79 44 62 46 69 6c 65 28 70    verifyDbFile(p
ff60: 46 69 6c 65 29 3b 0a 20 20 75 6e 69 78 55 6e 6c  File);.  unixUnl
ff70: 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
ff80: 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  ;.  unixEnterMut
ff90: 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 75 6e 69 78  ex();..  /* unix
ffa0: 46 69 6c 65 2e 70 49 6e 6f 64 65 20 69 73 20 61  File.pInode is a
ffb0: 6c 77 61 79 73 20 76 61 6c 69 64 20 68 65 72 65  lways valid here
ffc0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 64  . Otherwise, a d
ffd0: 69 66 66 65 72 65 6e 74 20 63 6c 6f 73 65 0a 20  ifferent close. 
ffe0: 20 2a 2a 20 72 6f 75 74 69 6e 65 20 28 65 2e 67   ** routine (e.g
fff0: 2e 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 29 29  . nolockClose())
10000 20 77 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64   would be called
10010 20 69 6e 73 74 65 61 64 2e 0a 20 20 2a 2f 0a 20   instead..  */. 
10020 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
10030 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 30 20  pInode->nLock>0 
10040 7c 7c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  || pFile->pInode
10050 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
10060 30 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59  0 );.  if( ALWAY
10070 53 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 29  S(pFile->pInode)
10080 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64   && pFile->pInod
10090 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  e->nLock ){.    
100a0 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
100b0 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b  outstanding lock
100c0 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c  s, do not actual
100d0 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  ly close the fil
100e0 65 20 6a 75 73 74 0a 20 20 20 20 2a 2a 20 79 65  e just.    ** ye
100f0 74 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77  t because that w
10100 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65  ould clear those
10110 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64   locks.  Instead
10120 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20  , add the file. 
10130 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72     ** descriptor
10140 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75   to pInode->pUnu
10150 73 65 64 20 6c 69 73 74 2e 20 20 49 74 20 77 69  sed list.  It wi
10160 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61  ll be automatica
10170 6c 6c 79 20 63 6c 6f 73 65 64 20 0a 20 20 20 20  lly closed .    
10180 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74  ** when the last
10190 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64   lock is cleared
101a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 65 74  ..    */.    set
101b0 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65 29  PendingFd(pFile)
101c0 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 49  ;.  }.  releaseI
101d0 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b  nodeInfo(pFile);
101e0 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69  .  rc = closeUni
101f0 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 75 6e 69  xFile(id);.  uni
10200 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
10210 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
10220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
10230 6e 64 20 6f 66 20 74 68 65 20 70 6f 73 69 78 20  nd of the posix 
10240 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 20 69 6d  advisory lock im
10250 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
10260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
10270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
102a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
102b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
102c0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
102d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
102e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
102f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
10310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
10330 6f 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  o-op Locking ***
10340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
10360 2a 2a 0a 2a 2a 20 4f 66 20 74 68 65 20 76 61 72  **.** Of the var
10370 69 6f 75 73 20 6c 6f 63 6b 69 6e 67 20 69 6d 70  ious locking imp
10380 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 61 76 61  lementations ava
10390 69 6c 61 62 6c 65 2c 20 74 68 69 73 20 69 73 20  ilable, this is 
103a0 62 79 20 66 61 72 20 74 68 65 0a 2a 2a 20 73 69  by far the.** si
103b0 6d 70 6c 65 73 74 3a 20 20 6c 6f 63 6b 69 6e 67  mplest:  locking
103c0 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 4e 6f   is ignored.  No
103d0 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
103e0 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 64 61 74   to lock the dat
103f0 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 66 6f  abase.** file fo
10400 72 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  r reading or wri
10410 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ting..**.** This
10420 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73   locking mode is
10430 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
10440 20 75 73 65 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c   use on read-onl
10450 79 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 28  y databases.** (
10460 65 78 3a 20 64 61 74 61 62 61 73 65 73 20 74 68  ex: databases th
10470 61 74 20 61 72 65 20 62 75 72 6e 65 64 20 69 6e  at are burned in
10480 74 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f 72 20 65  to CD-ROM, for e
10490 78 61 6d 70 6c 65 2e 29 20 20 49 74 20 63 61 6e  xample.)  It can
104a0 0a 2a 2a 20 61 6c 73 6f 20 62 65 20 75 73 65 64  .** also be used
104b0 20 69 66 20 74 68 65 20 61 70 70 6c 69 63 61 74   if the applicat
104c0 69 6f 6e 20 65 6d 70 6c 6f 79 73 20 73 6f 6d 65  ion employs some
104d0 20 65 78 74 65 72 6e 61 6c 20 6d 65 63 68 61 6e   external mechan
104e0 69 73 6d 20 74 6f 0a 2a 2a 20 70 72 65 76 65 6e  ism to.** preven
104f0 74 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 61  t simultaneous a
10500 63 63 65 73 73 20 6f 66 20 74 68 65 20 73 61 6d  ccess of the sam
10510 65 20 64 61 74 61 62 61 73 65 20 62 79 20 74 77  e database by tw
10520 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 64 61 74  o or more.** dat
10530 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
10540 73 2e 20 20 42 75 74 20 74 68 65 72 65 20 69 73  s.  But there is
10550 20 61 20 73 65 72 69 6f 75 73 20 72 69 73 6b 20   a serious risk 
10560 6f 66 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63  of database.** c
10570 6f 72 72 75 70 74 69 6f 6e 20 69 66 20 74 68 69  orruption if thi
10580 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69  s locking mode i
10590 73 20 75 73 65 64 20 69 6e 20 73 69 74 75 61 74  s used in situat
105a0 69 6f 6e 73 20 77 68 65 72 65 20 6d 75 6c 74 69  ions where multi
105b0 70 6c 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ple.** database 
105c0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20  connections are 
105d0 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61  accessing the sa
105e0 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  me database file
105f0 20 61 74 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20   at the same.** 
10600 74 69 6d 65 20 61 6e 64 20 6f 6e 65 20 6f 72 20  time and one or 
10610 6d 6f 72 65 20 6f 66 20 74 68 6f 73 65 20 63 6f  more of those co
10620 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 77 72  nnections are wr
10630 69 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69  iting..*/..stati
10640 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65 63  c int nolockChec
10650 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
10660 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55  lite3_file *NotU
10670 73 65 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  sed, int *pResOu
10680 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  t){.  UNUSED_PAR
10690 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
106a0 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b  .  *pResOut = 0;
106b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
106c0 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  _OK;.}.static in
106d0 74 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c  t nolockLock(sql
106e0 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73  ite3_file *NotUs
106f0 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32  ed, int NotUsed2
10700 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
10710 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
10720 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74  NotUsed2);.  ret
10730 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
10740 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f  .static int nolo
10750 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  ckUnlock(sqlite3
10760 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20  _file *NotUsed, 
10770 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20  int NotUsed2){. 
10780 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
10790 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
107a0 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed2);.  return 
107b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
107c0 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 66 69  .** Close the fi
107d0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
107e0 74 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73 71  t nolockClose(sq
107f0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
10800 7b 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65  {.  return close
10810 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a  UnixFile(id);.}.
10820 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
10830 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
10840 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c   no-op lock impl
10850 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
10860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10870 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
10880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
108a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
108b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
108c0 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
108d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
108e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
108f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10910 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
10920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
10930 6e 20 64 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b 69  n dot-file Locki
10940 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
10950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10960 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 74 66  *.**.** The dotf
10970 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c  ile locking impl
10980 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20  ementation uses 
10990 74 68 65 20 65 78 69 73 74 65 6e 63 65 20 6f 66  the existence of
109a0 20 73 65 70 61 72 61 74 65 20 6c 6f 63 6b 0a 2a   separate lock.*
109b0 2a 20 66 69 6c 65 73 20 28 72 65 61 6c 6c 79 20  * files (really 
109c0 61 20 64 69 72 65 63 74 6f 72 79 29 20 74 6f 20  a directory) to 
109d0 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73 20 74  control access t
109e0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
109f0 20 54 68 69 73 20 77 6f 72 6b 73 0a 2a 2a 20 6f   This works.** o
10a00 6e 20 6a 75 73 74 20 61 62 6f 75 74 20 65 76 65  n just about eve
10a10 72 79 20 66 69 6c 65 73 79 73 74 65 6d 20 69 6d  ry filesystem im
10a20 61 67 69 6e 61 62 6c 65 2e 20 20 42 75 74 20 74  aginable.  But t
10a30 68 65 72 65 20 61 72 65 20 73 65 72 69 6f 75 73  here are serious
10a40 20 64 6f 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a   downsides:.**.*
10a50 2a 20 20 20 20 28 31 29 20 20 54 68 65 72 65 20  *    (1)  There 
10a60 69 73 20 7a 65 72 6f 20 63 6f 6e 63 75 72 72 65  is zero concurre
10a70 6e 63 79 2e 20 20 41 20 73 69 6e 67 6c 65 20 72  ncy.  A single r
10a80 65 61 64 65 72 20 62 6c 6f 63 6b 73 20 61 6c 6c  eader blocks all
10a90 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20   other.**       
10aa0 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72    connections fr
10ab0 6f 6d 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  om reading or wr
10ac0 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  iting the databa
10ad0 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  se..**.**    (2)
10ae0 20 20 41 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e    An application
10af0 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 20   crash or power 
10b00 6c 6f 73 73 20 63 61 6e 20 6c 65 61 76 65 20 73  loss can leave s
10b10 74 61 6c 65 20 6c 6f 63 6b 20 66 69 6c 65 73 0a  tale lock files.
10b20 2a 2a 20 20 20 20 20 20 20 20 20 73 69 74 74 69  **         sitti
10b30 6e 67 20 61 72 6f 75 6e 64 20 74 68 61 74 20 6e  ng around that n
10b40 65 65 64 20 74 6f 20 62 65 20 63 6c 65 61 72 65  eed to be cleare
10b50 64 20 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a  d manually..**.*
10b60 2a 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20  * Nevertheless, 
10b70 61 20 64 6f 74 6c 6f 63 6b 20 69 73 20 61 6e 20  a dotlock is an 
10b80 61 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b  appropriate lock
10b90 69 6e 67 20 6d 6f 64 65 20 66 6f 72 20 75 73 65  ing mode for use
10ba0 20 69 66 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20   if no.** other 
10bb0 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79  locking strategy
10bc0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a   is available..*
10bd0 2a 0a 2a 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63  *.** Dotfile loc
10be0 6b 69 6e 67 20 77 6f 72 6b 73 20 62 79 20 63 72  king works by cr
10bf0 65 61 74 69 6e 67 20 61 20 73 75 62 64 69 72 65  eating a subdire
10c00 63 74 6f 72 79 20 69 6e 20 74 68 65 20 73 61 6d  ctory in the sam
10c10 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 0a 2a  e directory as.*
10c20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  * the database a
10c30 6e 64 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  nd with the same
10c40 20 6e 61 6d 65 20 62 75 74 20 77 69 74 68 20 61   name but with a
10c50 20 22 2e 6c 6f 63 6b 22 20 65 78 74 65 6e 73 69   ".lock" extensi
10c60 6f 6e 20 61 64 64 65 64 2e 0a 2a 2a 20 54 68 65  on added..** The
10c70 20 65 78 69 73 74 65 6e 63 65 20 6f 66 20 61 20   existence of a 
10c80 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 20 69  lock directory i
10c90 6d 70 6c 69 65 73 20 61 6e 20 45 58 43 4c 55 53  mplies an EXCLUS
10ca0 49 56 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f  IVE lock.  All o
10cb0 74 68 65 72 0a 2a 2a 20 6c 6f 63 6b 20 74 79 70  ther.** lock typ
10cc0 65 73 20 28 53 48 41 52 45 44 2c 20 52 45 53 45  es (SHARED, RESE
10cd0 52 56 45 44 2c 20 50 45 4e 44 49 4e 47 29 20 61  RVED, PENDING) a
10ce0 72 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 45  re mapped into E
10cf0 58 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a  XCLUSIVE..*/../*
10d00 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 73 75 66  .** The file suf
10d10 66 69 78 20 61 64 64 65 64 20 74 6f 20 74 68 65  fix added to the
10d20 20 64 61 74 61 20 62 61 73 65 20 66 69 6c 65 6e   data base filen
10d30 61 6d 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ame in order to 
10d40 63 72 65 61 74 65 20 74 68 65 0a 2a 2a 20 6c 6f  create the.** lo
10d50 63 6b 20 64 69 72 65 63 74 6f 72 79 2e 0a 2a 2f  ck directory..*/
10d60 0a 23 64 65 66 69 6e 65 20 44 4f 54 4c 4f 43 4b  .#define DOTLOCK
10d70 5f 53 55 46 46 49 58 20 22 2e 6c 6f 63 6b 22 0a  _SUFFIX ".lock".
10d80 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
10d90 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
10da0 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
10db0 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
10dc0 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
10dd0 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
10de0 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
10df0 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
10e00 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
10e10 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
10e20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
10e30 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
10e40 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
10e50 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
10e60 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
10e70 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
10e80 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
10e90 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
10ea0 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a  k checking..**.*
10eb0 2a 20 49 6e 20 64 6f 74 66 69 6c 65 20 6c 6f 63  * In dotfile loc
10ec0 6b 69 6e 67 2c 20 65 69 74 68 65 72 20 61 20 6c  king, either a l
10ed0 6f 63 6b 20 65 78 69 73 74 73 20 6f 72 20 69 74  ock exists or it
10ee0 20 64 6f 65 73 20 6e 6f 74 2e 20 20 53 6f 20 69   does not.  So i
10ef0 6e 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 74  n this.** variat
10f00 69 6f 6e 20 6f 66 20 43 68 65 63 6b 52 65 73 65  ion of CheckRese
10f10 72 76 65 64 4c 6f 63 6b 28 29 2c 20 2a 70 52 65  rvedLock(), *pRe
10f20 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 74  sOut is set to t
10f30 72 75 65 20 69 66 20 61 6e 79 20 6c 6f 63 6b 0a  rue if any lock.
10f40 2a 2a 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ** is held on th
10f50 65 20 66 69 6c 65 20 61 6e 64 20 66 61 6c 73 65  e file and false
10f60 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
10f70 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61  unlocked..*/.sta
10f80 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43  tic int dotlockC
10f90 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
10fa0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
10fb0 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
10fc0 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
10fd0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
10fe0 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
10ff0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
11000 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
11010 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
11020 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
11030 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
11040 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20  ERVEDLOCK; );.  
11050 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
11060 20 29 3b 0a 20 20 72 65 73 65 72 76 65 64 20 3d   );.  reserved =
11070 20 6f 73 41 63 63 65 73 73 28 28 63 6f 6e 73 74   osAccess((const
11080 20 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f   char*)pFile->lo
11090 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2c 20 30 29  ckingContext, 0)
110a0 3d 3d 30 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ==0;.  OSTRACE((
110b0 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
110c0 20 25 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b 29   %d %d (dotlock)
110d0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
110e0 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20  c, reserved));. 
110f0 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
11100 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
11110 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
11120 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
11130 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
11140 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
11150 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
11160 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
11170 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
11180 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
11190 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
111a0 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
111b0 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
111c0 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
111d0 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
111e0 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
111f0 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
11200 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
11210 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
11220 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
11230 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
11240 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
11250 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
11260 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
11270 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
11280 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
11290 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
112a0 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
112b0 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
112c0 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
112d0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
112e0 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
112f0 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
11300 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
11310 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
11320 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
11330 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
11340 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
11350 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
11360 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
11370 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
11380 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
11390 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
113a0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
113b0 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
113c0 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54  XCLUSIVE.**.** T
113d0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
113e0 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
113f0 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
11400 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
11410 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
11420 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
11430 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74  level..**.** Wit
11440 68 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  h dotfile lockin
11450 67 2c 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c  g, we really onl
11460 79 20 73 75 70 70 6f 72 74 20 73 74 61 74 65 20  y support state 
11470 28 34 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a  (4): EXCLUSIVE..
11480 2a 2a 20 42 75 74 20 77 65 20 74 72 61 63 6b 20  ** But we track 
11490 74 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e  the other lockin
114a0 67 20 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61  g levels interna
114b0 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lly..*/.static i
114c0 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73  nt dotlockLock(s
114d0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
114e0 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
114f0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
11500 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
11510 29 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f  )id;.  char *zLo
11520 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a  ckFile = (char *
11530 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
11540 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 72 63  ontext;.  int rc
11550 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a   = SQLITE_OK;...
11560 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20    /* If we have 
11570 61 6e 79 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74  any lock, then t
11580 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6c 72  he lock file alr
11590 65 61 64 79 20 65 78 69 73 74 73 2e 20 20 41 6c  eady exists.  Al
115a0 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74  l we have.  ** t
115b0 6f 20 64 6f 20 69 73 20 61 64 6a 75 73 74 20 6f  o do is adjust o
115c0 75 72 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f  ur internal reco
115d0 72 64 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 6c  rd of the lock l
115e0 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  evel..  */.  if(
115f0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
11600 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20  k > NO_LOCK ){. 
11610 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
11620 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
11630 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 75  .    /* Always u
11640 70 64 61 74 65 20 74 68 65 20 74 69 6d 65 73 74  pdate the timest
11650 61 6d 70 20 6f 6e 20 74 68 65 20 6f 6c 64 20 66  amp on the old f
11660 69 6c 65 20 2a 2f 0a 23 69 66 64 65 66 20 48 41  ile */.#ifdef HA
11670 56 45 5f 55 54 49 4d 45 0a 20 20 20 20 75 74 69  VE_UTIME.    uti
11680 6d 65 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55  me(zLockFile, NU
11690 4c 4c 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 75  LL);.#else.    u
116a0 74 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c  times(zLockFile,
116b0 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20   NULL);.#endif. 
116c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
116d0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
116e0 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69   grab an exclusi
116f0 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 72 63 20  ve lock */.  rc 
11700 3d 20 6f 73 4d 6b 64 69 72 28 7a 4c 6f 63 6b 46  = osMkdir(zLockF
11710 69 6c 65 2c 20 30 37 37 37 29 3b 0a 20 20 69 66  ile, 0777);.  if
11720 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 2f 2a  ( rc<0 ){.    /*
11730 20 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f   failed to open/
11740 63 72 65 61 74 65 20 74 68 65 20 6c 6f 63 6b 20  create the lock 
11750 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20 20  directory */.   
11760 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
11770 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 45 58  rno;.    if( EEX
11780 49 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29 7b  IST == tErrno ){
11790 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
117a0 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20 65  TE_BUSY;.    } e
117b0 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  lse {.      rc =
117c0 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
117d0 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
117e0 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
117f0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
11800 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc!=SQLITE_BUSY
11810 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72   ){.        stor
11820 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
11830 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  , tErrno);.     
11840 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74   }.    }.    ret
11850 75 72 6e 20 72 63 3b 0a 20 20 7d 20 0a 20 20 0a  urn rc;.  } .  .
11860 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74    /* got it, set
11870 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65   the type and re
11880 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69  turn ok */.  pFi
11890 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
118a0 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74  eFileLock;.  ret
118b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
118c0 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
118d0 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
118e0 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
118f0 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
11900 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
11910 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
11920 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
11930 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
11940 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
11950 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
11960 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
11970 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
11980 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
11990 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
119a0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
119b0 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  no-op..**.** Whe
119c0 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  n the locking le
119d0 76 65 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c  vel reaches NO_L
119e0 4f 43 4b 2c 20 64 65 6c 65 74 65 20 74 68 65 20  OCK, delete the 
119f0 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  lock file..*/.st
11a00 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b  atic int dotlock
11a10 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
11a20 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
11a30 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
11a40 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
11a50 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63  nixFile*)id;.  c
11a60 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d  har *zLockFile =
11a70 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e   (char *)pFile->
11a80 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
11a90 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
11aa0 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
11ab0 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
11ac0 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70    %d %d was %d p
11ad0 69 64 3d 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c  id=%d (dotlock)\
11ae0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46  n", pFile->h, eF
11af0 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20  ileLock,.       
11b00 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
11b10 4c 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64 28 30  Lock, osGetpid(0
11b20 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  )));.  assert( e
11b30 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  FileLock<=SHARED
11b40 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a  _LOCK );.  .  /*
11b50 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62   no-op if possib
11b60 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  le */.  if( pFil
11b70 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46  e->eFileLock==eF
11b80 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72  ileLock ){.    r
11b90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11ba0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f 20 64 6f  .  }..  /* To do
11bb0 77 6e 67 72 61 64 65 20 74 6f 20 73 68 61 72 65  wngrade to share
11bc0 64 2c 20 73 69 6d 70 6c 79 20 75 70 64 61 74 65  d, simply update
11bd0 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 6e 6f   our internal no
11be0 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a  tion of the.  **
11bf0 20 6c 6f 63 6b 20 73 74 61 74 65 2e 20 20 4e 6f   lock state.  No
11c00 20 6e 65 65 64 20 74 6f 20 6d 65 73 73 20 77 69   need to mess wi
11c10 74 68 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  th the file on d
11c20 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  isk..  */.  if( 
11c30 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
11c40 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46  D_LOCK ){.    pF
11c50 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
11c60 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
11c70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11c80 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
11c90 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f 63 6b 20  To fully unlock 
11ca0 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 64 65  the database, de
11cb0 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66 69  lete the lock fi
11cc0 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  le */.  assert( 
11cd0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  eFileLock==NO_LO
11ce0 43 4b 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73 52  CK );.  rc = osR
11cf0 6d 64 69 72 28 7a 4c 6f 63 6b 46 69 6c 65 29 3b  mdir(zLockFile);
11d00 0a 20 20 69 66 28 20 72 63 3c 30 20 29 7b 0a 20  .  if( rc<0 ){. 
11d10 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
11d20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 74  errno;.    if( t
11d30 45 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 29 7b  Errno==ENOENT ){
11d40 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
11d50 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
11d60 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
11d70 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
11d80 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  ;.      storeLas
11d90 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
11da0 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rrno);.    }.   
11db0 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d   return rc; .  }
11dc0 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  .  pFile->eFileL
11dd0 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
11de0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11df0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  K;.}../*.** Clos
11e00 65 20 61 20 66 69 6c 65 2e 20 20 4d 61 6b 65 20  e a file.  Make 
11e10 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 20 68 61  sure the lock ha
11e20 73 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20  s been released 
11e30 62 65 66 6f 72 65 20 63 6c 6f 73 69 6e 67 2e 0a  before closing..
11e40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f  */.static int do
11e50 74 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74  tlockClose(sqlit
11e60 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20  e3_file *id) {. 
11e70 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
11e80 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
11e90 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ;.  assert( id!=
11ea0 30 20 29 3b 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e  0 );.  dotlockUn
11eb0 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
11ec0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
11ed0 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  e(pFile->locking
11ee0 43 6f 6e 74 65 78 74 29 3b 0a 20 20 72 65 74 75  Context);.  retu
11ef0 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65  rn closeUnixFile
11f00 28 69 64 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  (id);.}./*******
11f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
11f20 6f 66 20 74 68 65 20 64 6f 74 2d 66 69 6c 65 20  of the dot-file 
11f30 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
11f40 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
11f50 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
11f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11fa0 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
11fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11ff0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
12000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12010 2a 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20  *** Begin flock 
12020 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
12030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12040 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55  ********.**.** U
12050 73 65 20 74 68 65 20 66 6c 6f 63 6b 28 29 20 73  se the flock() s
12060 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64 6f  ystem call to do
12070 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a   file locking..*
12080 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63  *.** flock() loc
12090 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74  king is like dot
120a0 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6e  -file locking in
120b0 20 74 68 61 74 20 74 68 65 20 76 61 72 69 6f 75   that the variou
120c0 73 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e 20  s.** fine-grain 
120d0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 73  locking levels s
120e0 75 70 70 6f 72 74 65 64 20 62 79 20 53 51 4c 69  upported by SQLi
120f0 74 65 20 61 72 65 20 63 6f 6c 6c 61 70 73 65 64  te are collapsed
12100 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c   into.** a singl
12110 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
12120 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
12130 73 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52  s, SHARED, RESER
12140 56 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e 44  VED, and.** PEND
12150 49 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20 74 68  ING locks are th
12160 65 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20  e same thing as 
12170 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
12180 6b 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73 74  k.  SQLite.** st
12190 69 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20 79  ill works when y
121a0 6f 75 20 64 6f 20 74 68 69 73 2c 20 62 75 74 20  ou do this, but 
121b0 63 6f 6e 63 75 72 72 65 6e 63 79 20 69 73 20 72  concurrency is r
121c0 65 64 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a 20  educed since.** 
121d0 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72  only a single pr
121e0 6f 63 65 73 73 20 63 61 6e 20 62 65 20 72 65 61  ocess can be rea
121f0 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
12200 65 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a  e at a time..**.
12210 2a 2a 20 4f 6d 69 74 20 74 68 69 73 20 73 65 63  ** Omit this sec
12220 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 45  tion if SQLITE_E
12230 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
12240 59 4c 45 20 69 73 20 74 75 72 6e 65 64 20 6f 66  YLE is turned of
12250 66 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  f.*/.#if SQLITE_
12260 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
12270 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72  TYLE../*.** Retr
12280 79 20 66 6c 6f 63 6b 28 29 20 63 61 6c 6c 73 20  y flock() calls 
12290 74 68 61 74 20 66 61 69 6c 20 77 69 74 68 20 45  that fail with E
122a0 49 4e 54 52 0a 2a 2f 0a 23 69 66 64 65 66 20 45  INTR.*/.#ifdef E
122b0 49 4e 54 52 0a 73 74 61 74 69 63 20 69 6e 74 20  INTR.static int 
122c0 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 69 6e 74  robust_flock(int
122d0 20 66 64 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20   fd, int op){.  
122e0 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63  int rc;.  do{ rc
122f0 20 3d 20 66 6c 6f 63 6b 28 66 64 2c 6f 70 29 3b   = flock(fd,op);
12300 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26   }while( rc<0 &&
12310 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
12320 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12330 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 72  #else.# define r
12340 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 61 2c 62 29  obust_flock(a,b)
12350 20 66 6c 6f 63 6b 28 61 2c 62 29 0a 23 65 6e 64   flock(a,b).#end
12360 69 66 0a 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20  if.     ../*.** 
12370 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
12380 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
12390 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
123a0 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
123b0 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
123c0 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
123d0 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
123e0 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
123f0 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74  ld, set *pResOut
12400 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  .** to a non-zer
12410 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73  o value otherwis
12420 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  e *pResOut is se
12430 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20  t to zero.  The 
12440 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
12450 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
12460 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f  _OK unless an I/
12470 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  O error occurs d
12480 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b  uring lock check
12490 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
124a0 6e 74 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73  nt flockCheckRes
124b0 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
124c0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
124d0 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74  *pResOut){.  int
124e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
124f0 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20  .  int reserved 
12500 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
12510 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
12520 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d  le*)id;.  .  Sim
12530 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
12540 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
12550 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
12560 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73  OCK; );.  .  ass
12570 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
12580 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
12590 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
125a0 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
125b0 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
125c0 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
125d0 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
125e0 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  ){.    reserved 
125f0 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  = 1;.  }.  .  /*
12600 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
12610 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
12620 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a  cess holds it. *
12630 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65  /.  if( !reserve
12640 64 20 29 7b 0a 20 20 20 20 2f 2a 20 61 74 74 65  d ){.    /* atte
12650 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20 6c  mpt to get the l
12660 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c  ock */.    int l
12670 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63  rc = robust_floc
12680 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b  k(pFile->h, LOCK
12690 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a  _EX | LOCK_NB);.
126a0 20 20 20 20 69 66 28 20 21 6c 72 63 20 29 7b 0a      if( !lrc ){.
126b0 20 20 20 20 20 20 2f 2a 20 67 6f 74 20 74 68 65        /* got the
126c0 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74   lock, unlock it
126d0 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20   */.      lrc = 
126e0 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69  robust_flock(pFi
126f0 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b  le->h, LOCK_UN);
12700 0a 20 20 20 20 20 20 69 66 20 28 20 6c 72 63 20  .      if ( lrc 
12710 29 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ) {.        int 
12720 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
12730 20 20 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63          /* unloc
12740 6b 20 66 61 69 6c 65 64 20 77 69 74 68 20 61 6e  k failed with an
12750 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20   error */.      
12760 20 20 6c 72 63 20 3d 20 53 51 4c 49 54 45 5f 49    lrc = SQLITE_I
12770 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20  OERR_UNLOCK; .  
12780 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
12790 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
127a0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  no);.        rc 
127b0 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  = lrc;.      }. 
127c0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
127d0 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
127e0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 73 65  rrno;.      rese
127f0 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  rved = 1;.      
12800 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20  /* someone else 
12810 6d 69 67 68 74 20 68 61 76 65 20 69 74 20 72 65  might have it re
12820 73 65 72 76 65 64 20 2a 2f 0a 20 20 20 20 20 20  served */.      
12830 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f  lrc = sqliteErro
12840 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
12850 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
12860 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20  OERR_LOCK); .   
12870 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
12880 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20  RROR(lrc) ){.   
12890 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
128a0 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
128b0 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  o);.        rc =
128c0 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20   lrc;.      }.  
128d0 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43    }.  }.  OSTRAC
128e0 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
128f0 20 25 64 20 25 64 20 25 64 20 28 66 6c 6f 63 6b   %d %d %d (flock
12900 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
12910 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a  rc, reserved));.
12920 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49  .#ifdef SQLITE_I
12930 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
12940 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72  _ERRORS.  if( (r
12950 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c & SQLITE_IOERR
12960 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  ) == SQLITE_IOER
12970 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  R ){.    rc = SQ
12980 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 65 73  LITE_OK;.    res
12990 65 72 76 65 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e  erved=1;.  }.#en
129a0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47  dif /* SQLITE_IG
129b0 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
129c0 45 52 52 4f 52 53 20 2a 2f 0a 20 20 2a 70 52 65  ERRORS */.  *pRe
129d0 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
129e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
129f0 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
12a00 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
12a10 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
12a20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c  parameter eFileL
12a30 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ock - one.** of 
12a40 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
12a50 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
12a60 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
12a70 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
12a80 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
12a90 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
12aa0 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
12ab0 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
12ac0 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
12ad0 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
12ae0 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
12af0 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
12b00 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
12b10 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
12b20 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
12b30 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
12b40 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
12b50 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
12b60 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
12b70 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
12b80 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
12b90 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
12ba0 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
12bb0 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
12bc0 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
12bd0 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
12be0 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
12bf0 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
12c00 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
12c10 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
12c20 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
12c30 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
12c40 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
12c50 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
12c60 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
12c70 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
12c80 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
12c90 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
12ca0 49 56 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28  IVE.**.** flock(
12cb0 29 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75  ) only really su
12cc0 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20  pport EXCLUSIVE 
12cd0 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b  locks.  We track
12ce0 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a   intermediate.**
12cf0 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20   lock states in 
12d00 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  the sqlite3_file
12d10 20 73 74 72 75 63 74 75 72 65 2c 20 62 75 74 20   structure, but 
12d20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44  all locks SHARED
12d30 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65   or.** above are
12d40 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56   really EXCLUSIV
12d50 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c  E locks and excl
12d60 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72  ude all other pr
12d70 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20  ocesses from.** 
12d80 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e  access the file.
12d90 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
12da0 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
12db0 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
12dc0 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
12dd0 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
12de0 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
12df0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
12e00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f  /.static int flo
12e10 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ckLock(sqlite3_f
12e20 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
12e30 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20  leLock) {.  int 
12e40 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
12e50 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
12e60 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
12e70 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  d;..  assert( pF
12e80 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 69 66 20  ile );..  /* if 
12e90 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  we already have 
12ea0 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78  a lock, it is ex
12eb0 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20  clusive.  .  ** 
12ec0 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65  Just adjust leve
12ed0 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75  l and punt on ou
12ee0 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69  tta here. */.  i
12ef0 66 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f (pFile->eFileL
12f00 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b  ock > NO_LOCK) {
12f10 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
12f20 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
12f30 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  k;.    return SQ
12f40 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
12f50 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63    /* grab an exc
12f60 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20  lusive lock */. 
12f70 20 0a 20 20 69 66 20 28 72 6f 62 75 73 74 5f 66   .  if (robust_f
12f80 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
12f90 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42  OCK_EX | LOCK_NB
12fa0 29 29 20 7b 0a 20 20 20 20 69 6e 74 20 74 45 72  )) {.    int tEr
12fb0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
12fc0 20 2f 2a 20 64 69 64 6e 27 74 20 67 65 74 2c 20   /* didn't get, 
12fd0 6d 75 73 74 20 62 65 20 62 75 73 79 20 2a 2f 0a  must be busy */.
12fe0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
12ff0 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
13000 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
13010 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20  E_IOERR_LOCK);. 
13020 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
13030 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
13040 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
13050 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
13060 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20  .    }.  } else 
13070 7b 0a 20 20 20 20 2f 2a 20 67 6f 74 20 69 74 2c  {.    /* got it,
13080 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e   set the type an
13090 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20  d return ok */. 
130a0 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
130b0 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
130c0 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
130d0 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25  "LOCK    %d %s %
130e0 73 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46  s (flock)\n", pF
130f0 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f  ile->h, azFileLo
13100 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a  ck(eFileLock), .
13110 20 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53             rc==S
13120 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20  QLITE_OK ? "ok" 
13130 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 23 69  : "failed"));.#i
13140 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f  fdef SQLITE_IGNO
13150 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
13160 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20 26  RORS.  if( (rc &
13170 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d   SQLITE_IOERR) =
13180 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  = SQLITE_IOERR )
13190 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
131a0 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 23 65 6e 64  E_BUSY;.  }.#end
131b0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e  if /* SQLITE_IGN
131c0 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
131d0 52 52 4f 52 53 20 2a 2f 0a 20 20 72 65 74 75 72  RRORS */.  retur
131e0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
131f0 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
13200 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
13210 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
13220 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
13230 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
13240 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
13250 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
13260 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
13270 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
13280 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
13290 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
132a0 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
132b0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
132c0 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
132d0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
132e0 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
132f0 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28  int flockUnlock(
13300 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
13310 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
13320 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
13330 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
13340 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73 73 65 72  *)id;.  .  asser
13350 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
13360 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20  TRACE(("UNLOCK  
13370 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64  %d %d was %d pid
13380 3d 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20  =%d (flock)\n", 
13390 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c  pFile->h, eFileL
133a0 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ock,.           
133b0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
133c0 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b  , osGetpid(0)));
133d0 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
133e0 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
133f0 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d  K );.  .  /* no-
13400 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a  op if possible *
13410 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
13420 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c  FileLock==eFileL
13430 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
13440 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
13450 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20  .  .  /* shared 
13460 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20  can just be set 
13470 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79  because we alway
13480 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73  s have an exclus
13490 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69  ive */.  if (eFi
134a0 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
134b0 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
134c0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
134d0 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74  ileLock;.    ret
134e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
134f0 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72   }.  .  /* no, r
13500 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a  eally, unlock. *
13510 2f 0a 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66  /.  if( robust_f
13520 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
13530 4f 43 4b 5f 55 4e 29 20 29 7b 0a 23 69 66 64 65  OCK_UN) ){.#ifde
13540 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  f SQLITE_IGNORE_
13550 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
13560 53 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  S.    return SQL
13570 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 20 2f  ITE_OK;.#endif /
13580 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  * SQLITE_IGNORE_
13590 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
135a0 53 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  S */.    return 
135b0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
135c0 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  OCK;.  }else{.  
135d0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
135e0 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
135f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13600 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
13610 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a   Close a file..*
13620 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f  /.static int flo
13630 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  ckClose(sqlite3_
13640 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 61 73  file *id) {.  as
13650 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
13660 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c   flockUnlock(id,
13670 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 72 65 74   NO_LOCK);.  ret
13680 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  urn closeUnixFil
13690 65 28 69 64 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66  e(id);.}..#endif
136a0 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
136b0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
136c0 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f  && !OS_VXWORK */
136d0 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
136e0 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
136f0 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70  e flock lock imp
13700 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
13710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13720 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
13730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13770 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
13780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
137a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
137b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
137c0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
137d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
137e0 6e 20 4e 61 6d 65 64 20 53 65 6d 61 70 68 6f 72  n Named Semaphor
137f0 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  e Locking ******
13800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13810 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73  **.**.** Named s
13820 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67  emaphore locking
13830 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74   is only support
13840 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  ed on VxWorks..*
13850 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c  *.** Semaphore l
13860 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64  ocking is like d
13870 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f 63  ot-lock and floc
13880 6b 20 69 6e 20 74 68 61 74 20 69 74 20 72 65 61  k in that it rea
13890 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70  lly only.** supp
138a0 6f 72 74 73 20 45 58 43 4c 55 53 49 56 45 20 6c  orts EXCLUSIVE l
138b0 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20 61 20  ocking.  Only a 
138c0 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63  single process c
138d0 61 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  an read or write
138e0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
138f0 20 66 69 6c 65 20 61 74 20 61 20 74 69 6d 65 2e   file at a time.
13900 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20 70    This reduces p
13910 6f 74 65 6e 74 69 61 6c 20 63 6f 6e 63 75 72 72  otential concurr
13920 65 6e 63 79 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b  ency, but.** mak
13930 65 73 20 74 68 65 20 6c 6f 63 6b 20 69 6d 70 6c  es the lock impl
13940 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 75 63 68 20  ementation much 
13950 65 61 73 69 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f  easier..*/.#if O
13960 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a  S_VXWORKS../*.**
13970 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
13980 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
13990 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
139a0 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
139b0 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
139c0 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
139d0 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
139e0 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
139f0 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
13a00 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
13a10 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
13a20 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
13a30 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
13a40 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
13a50 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
13a60 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
13a70 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
13a80 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
13a90 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
13aa0 69 6e 74 20 73 65 6d 58 43 68 65 63 6b 52 65 73  int semXCheckRes
13ab0 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
13ac0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
13ad0 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e  *pResOut) {.  in
13ae0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
13af0 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
13b00 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
13b10 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
13b20 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75  ile*)id;..  Simu
13b30 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
13b40 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
13b50 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
13b60 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65  CK; );.  .  asse
13b70 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20  rt( pFile );..  
13b80 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
13b90 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
13ba0 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
13bb0 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
13bc0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
13bd0 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
13be0 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
13bf0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74  ;.  }.  .  /* Ot
13c00 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
13c10 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
13c20 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20  s holds it. */. 
13c30 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29   if( !reserved )
13c40 7b 0a 20 20 20 20 73 65 6d 5f 74 20 2a 70 53 65  {.    sem_t *pSe
13c50 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  m = pFile->pInod
13c60 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20 20 20 69 66  e->pSem;..    if
13c70 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53  ( sem_trywait(pS
13c80 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20  em)==-1 ){.     
13c90 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
13ca0 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 45  rno;.      if( E
13cb0 41 47 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f 20  AGAIN != tErrno 
13cc0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
13cd0 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
13ce0 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
13cf0 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  , SQLITE_IOERR_C
13d00 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
13d10 29 3b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65  );.        store
13d20 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
13d30 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20   tErrno);.      
13d40 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
13d50 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65   /* someone else
13d60 20 68 61 73 20 74 68 65 20 6c 6f 63 6b 20 77 68   has the lock wh
13d70 65 6e 20 77 65 20 61 72 65 20 69 6e 20 4e 4f 5f  en we are in NO_
13d80 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 20 20 20 20  LOCK */.        
13d90 72 65 73 65 72 76 65 64 20 3d 20 28 70 46 69 6c  reserved = (pFil
13da0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 53  e->eFileLock < S
13db0 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
13dc0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
13dd0 20 20 20 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c        /* we coul
13de0 64 20 68 61 76 65 20 69 74 20 69 66 20 77 65 20  d have it if we 
13df0 77 61 6e 74 20 69 74 20 2a 2f 0a 20 20 20 20 20  want it */.     
13e00 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3b   sem_post(pSem);
13e10 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54  .    }.  }.  OST
13e20 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c  RACE(("TEST WR-L
13e30 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 73 65  OCK %d %d %d (se
13e40 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  m)\n", pFile->h,
13e50 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b   rc, reserved));
13e60 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72  ..  *pResOut = r
13e70 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72  eserved;.  retur
13e80 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
13e90 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
13ea0 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
13eb0 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
13ec0 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e  r eFileLock - on
13ed0 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
13ee0 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
13ef0 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
13f00 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
13f10 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
13f20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
13f30 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
13f40 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
13f50 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
13f60 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
13f70 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
13f80 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
13f90 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
13fa0 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
13fb0 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
13fc0 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
13fd0 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
13fe0 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
13ff0 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
14000 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
14010 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
14020 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
14030 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
14040 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
14050 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
14060 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
14070 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
14080 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
14090 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
140a0 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
140b0 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
140c0 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
140d0 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
140e0 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
140f0 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
14100 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
14110 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
14120 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
14130 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
14140 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  * Semaphore lock
14150 73 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75  s only really su
14160 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20  pport EXCLUSIVE 
14170 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b  locks.  We track
14180 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a   intermediate.**
14190 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20   lock states in 
141a0 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  the sqlite3_file
141b0 20 73 74 72 75 63 74 75 72 65 2c 20 62 75 74 20   structure, but 
141c0 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44  all locks SHARED
141d0 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65   or.** above are
141e0 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56   really EXCLUSIV
141f0 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c  E locks and excl
14200 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72  ude all other pr
14210 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20  ocesses from.** 
14220 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e  access the file.
14230 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
14240 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
14250 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
14260 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
14270 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
14280 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
14290 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
142a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d  /.static int sem
142b0 58 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  XLock(sqlite3_fi
142c0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
142d0 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
142e0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
142f0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65  ixFile*)id;.  se
14300 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c  m_t *pSem = pFil
14310 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b  e->pInode->pSem;
14320 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
14330 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20  TE_OK;..  /* if 
14340 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  we already have 
14350 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78  a lock, it is ex
14360 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20  clusive.  .  ** 
14370 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65  Just adjust leve
14380 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75  l and punt on ou
14390 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69  tta here. */.  i
143a0 66 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f (pFile->eFileL
143b0 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b  ock > NO_LOCK) {
143c0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
143d0 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
143e0 6b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  k;.    rc = SQLI
143f0 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20  TE_OK;.    goto 
14400 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  sem_end_lock;.  
14410 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20 73  }.  .  /* lock s
14420 65 6d 61 70 68 6f 72 65 20 6e 6f 77 20 62 75 74  emaphore now but
14430 20 62 61 69 6c 20 6f 75 74 20 77 68 65 6e 20 61   bail out when a
14440 6c 72 65 61 64 79 20 6c 6f 63 6b 65 64 2e 20 2a  lready locked. *
14450 2f 0a 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77  /.  if( sem_tryw
14460 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b  ait(pSem)==-1 ){
14470 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
14480 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20  _BUSY;.    goto 
14490 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  sem_end_lock;.  
144a0 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20  }..  /* got it, 
144b0 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64  set the type and
144c0 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20   return ok */.  
144d0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
144e0 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 0a 20   = eFileLock;.. 
144f0 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20  sem_end_lock:.  
14500 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
14510 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
14520 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
14530 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
14540 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
14550 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a  k.  eFileLock.**
14560 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
14570 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
14580 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
14590 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
145a0 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
145b0 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
145c0 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
145d0 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
145e0 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
145f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
14600 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
14610 74 69 63 20 69 6e 74 20 73 65 6d 58 55 6e 6c 6f  tic int semXUnlo
14620 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
14630 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
14640 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ck) {.  unixFile
14650 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
14660 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74  ile*)id;.  sem_t
14670 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e   *pSem = pFile->
14680 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20  pInode->pSem;.. 
14690 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
146a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6d  ;.  assert( pSem
146b0 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
146c0 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
146d0 73 20 25 64 20 70 69 64 3d 25 64 20 28 73 65 6d  s %d pid=%d (sem
146e0 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
146f0 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20  eFileLock,.     
14700 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
14710 6c 65 4c 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64  leLock, osGetpid
14720 28 30 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28  (0)));.  assert(
14730 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52   eFileLock<=SHAR
14740 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20  ED_LOCK );.  .  
14750 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73  /* no-op if poss
14760 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46  ible */.  if( pF
14770 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
14780 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
14790 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
147a0 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73  K;.  }.  .  /* s
147b0 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62  hared can just b
147c0 65 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65  e set because we
147d0 20 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20   always have an 
147e0 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69  exclusive */.  i
147f0 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f (eFileLock==SH
14800 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  ARED_LOCK) {.   
14810 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
14820 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
14830 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14840 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
14850 20 6e 6f 2c 20 72 65 61 6c 6c 79 20 75 6e 6c 6f   no, really unlo
14860 63 6b 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73 65  ck. */.  if ( se
14870 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3d 3d 2d 31  m_post(pSem)==-1
14880 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 2c   ) {.    int rc,
14890 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
148a0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
148b0 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
148c0 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
148d0 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
148e0 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  ;.    if( IS_LOC
148f0 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
14900 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
14910 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
14920 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  o);.    }.    re
14930 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20  turn rc; .  }.  
14940 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
14950 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65   = NO_LOCK;.  re
14960 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14970 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20  }../*. ** Close 
14980 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74  a file.. */.stat
14990 69 63 20 69 6e 74 20 73 65 6d 58 43 6c 6f 73 65  ic int semXClose
149a0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
149b0 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b  d) {.  if( id ){
149c0 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  .    unixFile *p
149d0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
149e0 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d 58 55 6e  *)id;.    semXUn
149f0 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
14a00 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
14a10 46 69 6c 65 20 29 3b 0a 20 20 20 20 75 6e 69 78  File );.    unix
14a20 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
14a30 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e    releaseInodeIn
14a40 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 75  fo(pFile);.    u
14a50 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
14a60 0a 20 20 20 20 63 6c 6f 73 65 55 6e 69 78 46 69  .    closeUnixFi
14a70 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65  le(id);.  }.  re
14a80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14a90 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f  }..#endif /* OS_
14aa0 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a  VXWORKS */./*.**
14ab0 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   Named semaphore
14ac0 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79   locking is only
14ad0 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 56 78   available on Vx
14ae0 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  Works..**.******
14af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
14b00 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d 61 70   the named semap
14b10 68 6f 72 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  hore lock implem
14b20 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
14b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
14b40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14b80 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a  ********/.../***
14b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
14be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14bf0 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 41 46  ******* Begin AF
14c00 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  P Locking ******
14c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
14c30 2a 20 41 46 50 20 69 73 20 74 68 65 20 41 70 70  * AFP is the App
14c40 6c 65 20 46 69 6c 69 6e 67 20 50 72 6f 74 6f 63  le Filing Protoc
14c50 6f 6c 2e 20 20 41 46 50 20 69 73 20 61 20 6e 65  ol.  AFP is a ne
14c60 74 77 6f 72 6b 20 66 69 6c 65 73 79 73 74 65 6d  twork filesystem
14c70 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70   found.** on App
14c80 6c 65 20 4d 61 63 69 6e 74 6f 73 68 20 63 6f 6d  le Macintosh com
14c90 70 75 74 65 72 73 20 2d 20 62 6f 74 68 20 4f 53  puters - both OS
14ca0 39 20 61 6e 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a  9 and OSX..**.**
14cb0 20 54 68 69 72 64 2d 70 61 72 74 79 20 69 6d 70   Third-party imp
14cc0 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20  lementations of 
14cd0 41 46 50 20 61 72 65 20 61 76 61 69 6c 61 62 6c  AFP are availabl
14ce0 65 2e 20 20 42 75 74 20 74 68 69 73 20 63 6f 64  e.  But this cod
14cf0 65 20 68 65 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77  e here.** only w
14d00 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a  orks on OSX..*/.
14d10 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
14d20 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
14d30 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
14d40 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _STYLE./*.** The
14d50 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
14d60 78 74 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  xt structure con
14d70 74 61 69 6e 73 20 61 6c 6c 20 61 66 70 20 6c 6f  tains all afp lo
14d80 63 6b 20 73 70 65 63 69 66 69 63 20 73 74 61 74  ck specific stat
14d90 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  e.*/.typedef str
14da0 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  uct afpLockingCo
14db0 6e 74 65 78 74 20 61 66 70 4c 6f 63 6b 69 6e 67  ntext afpLocking
14dc0 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20  Context;.struct 
14dd0 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
14de0 74 20 7b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  t {.  int reserv
14df0 65 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ed;.  const char
14e00 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20 20   *dbPath;       
14e10 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
14e20 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a   the open file *
14e30 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 42 79 74  /.};..struct Byt
14e40 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a  eRangeLockPB2.{.
14e50 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
14e60 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 20 20 20 20  long offset;    
14e70 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 74 6f      /* offset to
14e80 20 66 69 72 73 74 20 62 79 74 65 20 74 6f 20 6c   first byte to l
14e90 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ock */.  unsigne
14ea0 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67  d long long leng
14eb0 74 68 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 62  th;        /* nb
14ec0 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f  r of bytes to lo
14ed0 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ck */.  unsigned
14ee0 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65 74 52 61   long long retRa
14ef0 6e 67 65 53 74 61 72 74 3b 20 2f 2a 20 6e 62 72  ngeStart; /* nbr
14f00 20 6f 66 20 31 73 74 20 62 79 74 65 20 6c 6f 63   of 1st byte loc
14f10 6b 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75  ked if successfu
14f20 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
14f30 63 68 61 72 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b  char unLockFlag;
14f40 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 3d 20           /* 1 = 
14f50 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b  unlock, 0 = lock
14f60 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
14f70 68 61 72 20 73 74 61 72 74 45 6e 64 46 6c 61 67  har startEndFlag
14f80 3b 20 20 20 20 20 20 20 2f 2a 20 31 3d 72 65 6c  ;       /* 1=rel
14f90 20 74 6f 20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c   to end of fork,
14fa0 20 30 3d 72 65 6c 20 74 6f 20 73 74 61 72 74 20   0=rel to start 
14fb0 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20  */.  int fd;    
14fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14fd0 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 20 64         /* file d
14fe0 65 73 63 20 74 6f 20 61 73 73 6f 63 20 74 68 69  esc to assoc thi
14ff0 73 20 6c 6f 63 6b 20 77 69 74 68 20 2a 2f 0a 7d  s lock with */.}
15000 3b 0a 0a 23 64 65 66 69 6e 65 20 61 66 70 66 73  ;..#define afpfs
15010 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53  ByteRangeLock2FS
15020 43 54 4c 20 20 20 20 20 20 20 20 5f 49 4f 57 52  CTL        _IOWR
15030 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74  ('z', 23, struct
15040 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
15050 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  2)../*.** This i
15060 73 20 61 20 75 74 69 6c 69 74 79 20 66 6f 72 20  s a utility for 
15070 73 65 74 74 69 6e 67 20 6f 72 20 63 6c 65 61 72  setting or clear
15080 69 6e 67 20 61 20 62 69 74 2d 72 61 6e 67 65 20  ing a bit-range 
15090 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46  lock on an.** AF
150a0 50 20 66 69 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a  P filesystem..**
150b0 20 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49   .** Return SQLI
150c0 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
150d0 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 6e  , SQLITE_BUSY on
150e0 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61   failure..*/.sta
150f0 74 69 63 20 69 6e 74 20 61 66 70 53 65 74 4c 6f  tic int afpSetLo
15100 63 6b 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ck(.  const char
15110 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20 20 20   *path,         
15120 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
15130 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 6c  the file to be l
15140 6f 63 6b 65 64 20 6f 72 20 75 6e 6c 6f 63 6b 65  ocked or unlocke
15150 64 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20  d */.  unixFile 
15160 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  *pFile,         
15170 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69        /* Open fi
15180 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  le descriptor on
15190 20 70 61 74 68 20 2a 2f 0a 20 20 75 6e 73 69 67   path */.  unsig
151a0 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66  ned long long of
151b0 66 73 65 74 2c 20 20 20 20 20 2f 2a 20 46 69 72  fset,     /* Fir
151c0 73 74 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f  st byte to be lo
151d0 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  cked */.  unsign
151e0 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e  ed long long len
151f0 67 74 68 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62  gth,     /* Numb
15200 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c  er of bytes to l
15210 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 73 65 74  ock */.  int set
15220 4c 6f 63 6b 46 6c 61 67 20 20 20 20 20 20 20 20  LockFlag        
15230 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
15240 74 6f 20 73 65 74 20 6c 6f 63 6b 2e 20 20 46 61  to set lock.  Fa
15250 6c 73 65 20 74 6f 20 63 6c 65 61 72 20 6c 6f 63  lse to clear loc
15260 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  k */.){.  struct
15270 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
15280 32 20 70 62 3b 0a 20 20 69 6e 74 20 65 72 72 3b  2 pb;.  int err;
15290 0a 20 20 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b 46  .  .  pb.unLockF
152a0 6c 61 67 20 3d 20 73 65 74 4c 6f 63 6b 46 6c 61  lag = setLockFla
152b0 67 20 3f 20 30 20 3a 20 31 3b 0a 20 20 70 62 2e  g ? 0 : 1;.  pb.
152c0 73 74 61 72 74 45 6e 64 46 6c 61 67 20 3d 20 30  startEndFlag = 0
152d0 3b 0a 20 20 70 62 2e 6f 66 66 73 65 74 20 3d 20  ;.  pb.offset = 
152e0 6f 66 66 73 65 74 3b 0a 20 20 70 62 2e 6c 65 6e  offset;.  pb.len
152f0 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b 20 0a 20  gth = length; . 
15300 20 70 62 2e 66 64 20 3d 20 70 46 69 6c 65 2d 3e   pb.fd = pFile->
15310 68 3b 0a 20 20 0a 20 20 4f 53 54 52 41 43 45 28  h;.  .  OSTRACE(
15320 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 5b 25 73  ("AFPSETLOCK [%s
15330 5d 20 66 6f 72 20 25 64 25 73 20 69 6e 20 72 61  ] for %d%s in ra
15340 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22  nge %llx:%llx\n"
15350 2c 20 0a 20 20 20 20 28 73 65 74 4c 6f 63 6b 46  , .    (setLockF
15360 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46 46 22 29 2c  lag?"ON":"OFF"),
15370 20 70 46 69 6c 65 2d 3e 68 2c 20 28 70 62 2e 66   pFile->h, (pb.f
15380 64 3d 3d 2d 31 3f 22 5b 74 65 73 74 76 61 6c 2d  d==-1?"[testval-
15390 31 5d 22 3a 22 22 29 2c 0a 20 20 20 20 6f 66 66  1]":""),.    off
153a0 73 65 74 2c 20 6c 65 6e 67 74 68 29 29 3b 0a 20  set, length));. 
153b0 20 65 72 72 20 3d 20 66 73 63 74 6c 28 70 61 74   err = fsctl(pat
153c0 68 2c 20 61 66 70 66 73 42 79 74 65 52 61 6e 67  h, afpfsByteRang
153d0 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20 26 70 62  eLock2FSCTL, &pb
153e0 2c 20 30 29 3b 0a 20 20 69 66 20 28 20 65 72 72  , 0);.  if ( err
153f0 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e 74  ==-1 ) {.    int
15400 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 74 45 72   rc;.    int tEr
15410 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
15420 20 4f 53 54 52 41 43 45 28 28 22 41 46 50 53 45   OSTRACE(("AFPSE
15430 54 4c 4f 43 4b 20 66 61 69 6c 65 64 20 74 6f 20  TLOCK failed to 
15440 66 73 63 74 6c 28 29 20 27 25 73 27 20 25 64 20  fsctl() '%s' %d 
15450 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
15460 20 20 20 20 70 61 74 68 2c 20 74 45 72 72 6e 6f      path, tErrno
15470 2c 20 73 74 72 65 72 72 6f 72 28 74 45 72 72 6e  , strerror(tErrn
15480 6f 29 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  o)));.#ifdef SQL
15490 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c  ITE_IGNORE_AFP_L
154a0 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 72  OCK_ERRORS.    r
154b0 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
154c0 0a 23 65 6c 73 65 0a 20 20 20 20 72 63 20 3d 20  .#else.    rc = 
154d0 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
154e0 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
154f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15500 20 20 20 20 20 20 73 65 74 4c 6f 63 6b 46 6c 61        setLockFla
15510 67 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  g ? SQLITE_IOERR
15520 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49 54 45 5f 49  _LOCK : SQLITE_I
15530 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65  OERR_UNLOCK);.#e
15540 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49  ndif /* SQLITE_I
15550 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45  GNORE_AFP_LOCK_E
15560 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 69 66 28  RRORS */.    if(
15570 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
15580 63 29 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72  c) ){.      stor
15590 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
155a0 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d  , tErrno);.    }
155b0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
155c0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72    } else {.    r
155d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
155e0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
155f0 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
15600 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
15610 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
15620 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
15630 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
15640 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
15650 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
15660 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
15670 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
15680 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
15690 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
156a0 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
156b0 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
156c0 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
156d0 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
156e0 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
156f0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
15700 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
15710 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
15720 20 61 66 70 43 68 65 63 6b 52 65 73 65 72 76 65   afpCheckReserve
15730 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
15740 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
15750 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  sOut){.  int rc 
15760 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
15770 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b  nt reserved = 0;
15780 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
15790 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
157a0 69 64 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67  id;.  afpLocking
157b0 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  Context *context
157c0 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49  ;.  .  SimulateI
157d0 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
157e0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
157f0 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
15800 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
15810 46 69 6c 65 20 29 3b 0a 20 20 63 6f 6e 74 65 78  File );.  contex
15820 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43  t = (afpLockingC
15830 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d  ontext *) pFile-
15840 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
15850 0a 20 20 69 66 28 20 63 6f 6e 74 65 78 74 2d 3e  .  if( context->
15860 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20  reserved ){.    
15870 2a 70 52 65 73 4f 75 74 20 3d 20 31 3b 0a 20 20  *pResOut = 1;.  
15880 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15890 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e  OK;.  }.  unixEn
158a0 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42  terMutex(); /* B
158b0 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49  ecause pFile->pI
158c0 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61  node is shared a
158d0 63 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f  cross threads */
158e0 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  .  .  /* Check i
158f0 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68  f a thread in th
15900 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  is process holds
15910 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a   such a lock */.
15920 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e    if( pFile->pIn
15930 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53  ode->eFileLock>S
15940 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
15950 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
15960 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65    }.  .  /* Othe
15970 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d  rwise see if som
15980 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
15990 68 6f 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a  holds it..   */.
159a0 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20    if( !reserved 
159b0 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b 20 74  ){.    /* lock t
159c0 68 65 20 52 45 53 45 52 56 45 44 20 62 79 74 65  he RESERVED byte
159d0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20   */.    int lrc 
159e0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
159f0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
15a00 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59  ile, RESERVED_BY
15a10 54 45 2c 20 31 2c 31 29 3b 20 20 0a 20 20 20 20  TE, 1,1);  .    
15a20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c  if( SQLITE_OK==l
15a30 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69  rc ){.      /* i
15a40 66 20 77 65 20 73 75 63 63 65 65 64 65 64 20 69  f we succeeded i
15a50 6e 20 74 61 6b 69 6e 67 20 74 68 65 20 72 65 73  n taking the res
15a60 65 72 76 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f  erved lock, unlo
15a70 63 6b 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65  ck it to restore
15a80 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72  .      ** the or
15a90 69 67 69 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a  iginal state */.
15aa0 20 20 20 20 20 20 6c 72 63 20 3d 20 61 66 70 53        lrc = afpS
15ab0 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
15ac0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52  dbPath, pFile, R
15ad0 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c  ESERVED_BYTE, 1,
15ae0 20 30 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20   0);.    } else 
15af0 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65  {.      /* if we
15b00 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 74   failed to get t
15b10 68 65 20 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d  he lock then som
15b20 65 6f 6e 65 20 65 6c 73 65 20 6d 75 73 74 20 68  eone else must h
15b30 61 76 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20  ave it */.      
15b40 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
15b50 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c    }.    if( IS_L
15b60 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29  OCK_ERROR(lrc) )
15b70 7b 0a 20 20 20 20 20 20 72 63 3d 6c 72 63 3b 0a  {.      rc=lrc;.
15b80 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75      }.  }.  .  u
15b90 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
15ba0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53  .  OSTRACE(("TES
15bb0 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20  T WR-LOCK %d %d 
15bc0 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69  %d (afp)\n", pFi
15bd0 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
15be0 76 65 64 29 29 3b 0a 20 20 0a 20 20 2a 70 52 65  ved));.  .  *pRe
15bf0 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
15c00 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15c10 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
15c20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
15c30 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
15c40 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c  parameter eFileL
15c50 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ock - one.** of 
15c60 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
15c70 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
15c80 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
15c90 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
15ca0 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
15cb0 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
15cc0 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
15cd0 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
15ce0 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
15cf0 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
15d00 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
15d10 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
15d20 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
15d30 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
15d40 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
15d50 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
15d60 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
15d70 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
15d80 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
15d90 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
15da0 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
15db0 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
15dc0 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
15dd0 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
15de0 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
15df0 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
15e00 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
15e10 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
15e20 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
15e30 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
15e40 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
15e50 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
15e60 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
15e70 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
15e80 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
15e90 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
15ea0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
15eb0 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
15ec0 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  IVE.**.** This r
15ed0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
15ee0 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
15ef0 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
15f00 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
15f10 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
15f20 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
15f30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15f40 61 66 70 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  afpLock(sqlite3_
15f50 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
15f60 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20  ileLock){.  int 
15f70 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
15f80 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
15f90 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
15fa0 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  d;.  unixInodeIn
15fb0 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
15fc0 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 66  le->pInode;.  af
15fd0 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
15fe0 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c  *context = (afpL
15ff0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
16000 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
16010 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 61 73 73  ontext;.  .  ass
16020 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
16030 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
16040 20 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25    %d %s was %s(%
16050 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61 66  s,%d) pid=%d (af
16060 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  p)\n", pFile->h,
16070 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69  .           azFi
16080 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
16090 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46  ), azFileLock(pF
160a0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c  ile->eFileLock),
160b0 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69  .           azFi
160c0 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65  leLock(pInode->e
160d0 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64  FileLock), pInod
160e0 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20 6f 73 47  e->nShared , osG
160f0 65 74 70 69 64 28 30 29 29 29 3b 0a 0a 20 20 2f  etpid(0)));..  /
16100 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  * If there is al
16110 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20  ready a lock of 
16120 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72  this type or mor
16130 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e  e restrictive on
16140 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69   the.  ** unixFi
16150 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20  le, do nothing. 
16160 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 61 66  Don't use the af
16170 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74  p_end_lock: exit
16180 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75   path, as.  ** u
16190 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20  nixEnterMutex() 
161a0 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c  hasn't been call
161b0 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ed yet..  */.  i
161c0 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
161d0 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock>=eFileLock )
161e0 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
161f0 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b  LOCK    %d %s ok
16200 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29 20   (already held) 
16210 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
16220 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61  >h,.           a
16230 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
16240 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72 65 74 75  ock)));.    retu
16250 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
16260 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
16270 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65  e the locking se
16280 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63  quence is correc
16290 74 0a 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e  t.  **  (1) We n
162a0 65 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75  ever move from u
162b0 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68  nlocked to anyth
162c0 69 6e 67 20 68 69 67 68 65 72 20 74 68 61 6e 20  ing higher than 
162d0 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a  shared lock..  *
162e0 2a 20 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65  *  (2) SQLite ne
162f0 76 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72  ver explicitly r
16300 65 71 75 65 73 74 73 20 61 20 70 65 6e 64 69 67  equests a pendig
16310 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29   lock..  **  (3)
16320 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69   A shared lock i
16330 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68  s always held wh
16340 65 6e 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63  en a reserve loc
16350 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a  k is requested..
16360 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
16370 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21  File->eFileLock!
16380 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c  =NO_LOCK || eFil
16390 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
163a0 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
163b0 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49  eFileLock!=PENDI
163c0 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  NG_LOCK );.  ass
163d0 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d  ert( eFileLock!=
163e0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c  RESERVED_LOCK ||
163f0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
16400 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
16410 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d  ;.  .  /* This m
16420 75 74 65 78 20 69 73 20 6e 65 65 64 65 64 20 62  utex is needed b
16430 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49  ecause pFile->pI
16440 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61  node is shared a
16450 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20  cross threads.  
16460 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  */.  unixEnterMu
16470 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20  tex();.  pInode 
16480 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
16490 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74  ..  /* If some t
164a0 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73  hread using this
164b0 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20   PID has a lock 
164c0 76 69 61 20 61 20 64 69 66 66 65 72 65 6e 74 20  via a different 
164d0 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68  unixFile*.  ** h
164e0 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c  andle that precl
164f0 75 64 65 73 20 74 68 65 20 72 65 71 75 65 73 74  udes the request
16500 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20  ed lock, return 
16510 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  BUSY..  */.  if(
16520 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f   (pFile->eFileLo
16530 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  ck!=pInode->eFil
16540 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20 20 20 20  eLock && .      
16550 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c   (pInode->eFileL
16560 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock>=PENDING_LOC
16570 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53  K || eFileLock>S
16580 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 20  HARED_LOCK)).   
16590 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51    ){.    rc = SQ
165a0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67  LITE_BUSY;.    g
165b0 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  oto afp_end_lock
165c0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66  ;.  }.  .  /* If
165d0 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   a SHARED lock i
165e0 73 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64  s requested, and
165f0 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
16600 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c 72 65  ng this PID alre
16610 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53  ady.  ** has a S
16620 48 41 52 45 44 20 6f 72 20 52 45 53 45 52 56 45  HARED or RESERVE
16630 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63  D lock, then inc
16640 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65  rement reference
16650 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a   counts and.  **
16660 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16670 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  K..  */.  if( eF
16680 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
16690 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 28 70  LOCK && .     (p
166a0 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
166b0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
166c0 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
166d0 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
166e0 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  K) ){.    assert
166f0 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
16700 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
16710 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65  assert( pFile->e
16720 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  FileLock==0 );. 
16730 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
16740 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a  e->nShared>0 );.
16750 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
16760 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
16770 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  CK;.    pInode->
16780 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70  nShared++;.    p
16790 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  Inode->nLock++;.
167a0 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
167b0 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 20 20 0a  _lock;.  }.    .
167c0 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c    /* A PENDING l
167d0 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65  ock is needed be
167e0 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 61  fore acquiring a
167f0 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64   SHARED lock and
16800 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71   before.  ** acq
16810 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  uiring an EXCLUS
16820 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74  IVE lock.  For t
16830 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20  he SHARED lock, 
16840 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c  the PENDING will
16850 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65  .  ** be release
16860 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  d..  */.  if( eF
16870 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
16880 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28  LOCK .      || (
16890 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
168a0 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69  SIVE_LOCK && pFi
168b0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45  le->eFileLock<PE
168c0 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b  NDING_LOCK).  ){
168d0 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 3b  .    int failed;
168e0 0a 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66  .    failed = af
168f0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
16900 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
16910 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31   PENDING_BYTE, 1
16920 2c 20 31 29 3b 0a 20 20 20 20 69 66 20 28 66 61  , 1);.    if (fa
16930 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 72 63  iled) {.      rc
16940 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20   = failed;.     
16950 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
16960 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ck;.    }.  }.  
16970 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c  .  /* If control
16980 20 67 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f   gets to this po
16990 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c  int, then actual
169a0 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  ly go ahead and 
169b0 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74  make.  ** operat
169c0 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ing system calls
169d0 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69   for the specifi
169e0 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  ed lock..  */.  
169f0 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
16a00 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
16a10 20 20 69 6e 74 20 6c 72 63 31 2c 20 6c 72 63 32    int lrc1, lrc2
16a20 2c 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20 30 3b  , lrc1Errno = 0;
16a30 0a 20 20 20 20 6c 6f 6e 67 20 6c 6b 2c 20 6d 61  .    long lk, ma
16a40 73 6b 3b 0a 20 20 20 20 0a 20 20 20 20 61 73 73  sk;.    .    ass
16a50 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ert( pInode->nSh
16a60 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61  ared==0 );.    a
16a70 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65  ssert( pInode->e
16a80 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  FileLock==0 );. 
16a90 20 20 20 20 20 20 20 0a 20 20 20 20 6d 61 73 6b         .    mask
16aa0 20 3d 20 28 73 69 7a 65 6f 66 28 6c 6f 6e 67 29   = (sizeof(long)
16ab0 3d 3d 38 29 20 3f 20 4c 41 52 47 45 53 54 5f 49  ==8) ? LARGEST_I
16ac0 4e 54 36 34 20 3a 20 30 78 37 66 66 66 66 66 66  NT64 : 0x7ffffff
16ad0 66 3b 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65  f;.    /* Now ge
16ae0 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20  t the read-lock 
16af0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20  SHARED_LOCK */. 
16b00 20 20 20 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20     /* note that 
16b10 74 68 65 20 71 75 61 6c 69 74 79 20 6f 66 20 74  the quality of t
16b20 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f  he randomness do
16b30 65 73 6e 27 74 20 6d 61 74 74 65 72 20 74 68 61  esn't matter tha
16b40 74 20 6d 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b  t much */.    lk
16b50 20 3d 20 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20   = random(); .  
16b60 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64    pInode->shared
16b70 42 79 74 65 20 3d 20 28 6c 6b 20 26 20 6d 61 73  Byte = (lk & mas
16b80 6b 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45 20  k)%(SHARED_SIZE 
16b90 2d 20 31 29 3b 0a 20 20 20 20 6c 72 63 31 20 3d  - 1);.    lrc1 =
16ba0 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
16bb0 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
16bc0 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53  le, .          S
16bd0 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f  HARED_FIRST+pIno
16be0 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20  de->sharedByte, 
16bf0 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 49  1, 1);.    if( I
16c00 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
16c10 31 29 20 29 7b 0a 20 20 20 20 20 20 6c 72 63 31  1) ){.      lrc1
16c20 45 72 72 6e 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c  Errno = pFile->l
16c30 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a  astErrno;.    }.
16c40 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20      /* Drop the 
16c50 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e  temporary PENDIN
16c60 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 72  G lock */.    lr
16c70 63 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  c2 = afpSetLock(
16c80 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
16c90 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f   pFile, PENDING_
16ca0 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20  BYTE, 1, 0);.   
16cb0 20 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43   .    if( IS_LOC
16cc0 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29 20  K_ERROR(lrc1) ) 
16cd0 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  {.      storeLas
16ce0 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 6c 72  tErrno(pFile, lr
16cf0 63 31 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20  c1Errno);.      
16d00 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 20  rc = lrc1;.     
16d10 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
16d20 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  ck;.    } else i
16d30 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
16d40 28 6c 72 63 32 29 20 29 7b 0a 20 20 20 20 20 20  (lrc2) ){.      
16d50 72 63 20 3d 20 6c 72 63 32 3b 0a 20 20 20 20 20  rc = lrc2;.     
16d60 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
16d70 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  ck;.    } else i
16d80 66 28 20 6c 72 63 31 20 21 3d 20 53 51 4c 49 54  f( lrc1 != SQLIT
16d90 45 5f 4f 4b 20 29 20 7b 0a 20 20 20 20 20 20 72  E_OK ) {.      r
16da0 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 7d 20  c = lrc1;.    } 
16db0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 70 46 69  else {.      pFi
16dc0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
16dd0 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
16de0 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
16df0 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  ++;.      pInode
16e00 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a 20  ->nShared = 1;. 
16e10 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
16e20 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c   eFileLock==EXCL
16e30 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49  USIVE_LOCK && pI
16e40 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20  node->nShared>1 
16e50 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65  ){.    /* We are
16e60 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65   trying for an e
16e70 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75  xclusive lock bu
16e80 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  t another thread
16e90 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20 2a 2a   in this.     **
16ea0 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73   same process is
16eb0 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
16ec0 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f   shared lock. */
16ed0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
16ee0 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BUSY;.  }else{.
16ef0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
16f00 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53  st was for a RES
16f10 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
16f20 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a  VE lock.  It is.
16f30 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74      ** assumed t
16f40 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53  hat there is a S
16f50 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72  HARED or greater
16f60 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
16f70 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79  e.    ** already
16f80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
16f90 20 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20   failed = 0;.   
16fa0 20 61 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c   assert( 0!=pFil
16fb0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a  e->eFileLock );.
16fc0 20 20 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63      if (eFileLoc
16fd0 6b 20 3e 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f  k >= RESERVED_LO
16fe0 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69  CK && pFile->eFi
16ff0 6c 65 4c 6f 63 6b 20 3c 20 52 45 53 45 52 56 45  leLock < RESERVE
17000 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20  D_LOCK) {.      
17010 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52    /* Acquire a R
17020 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a  ESERVED lock */.
17030 20 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d          failed =
17040 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
17050 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
17060 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  le, RESERVED_BYT
17070 45 2c 20 31 2c 31 29 3b 0a 20 20 20 20 20 20 69  E, 1,1);.      i
17080 66 28 20 21 66 61 69 6c 65 64 20 29 7b 0a 20 20  f( !failed ){.  
17090 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72        context->r
170a0 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20  eserved = 1;.   
170b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
170c0 66 20 28 21 66 61 69 6c 65 64 20 26 26 20 65 46  f (!failed && eF
170d0 69 6c 65 4c 6f 63 6b 20 3d 3d 20 45 58 43 4c 55  ileLock == EXCLU
170e0 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  SIVE_LOCK) {.   
170f0 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e     /* Acquire an
17100 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
17110 2a 2f 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  */.        .    
17120 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
17130 73 68 61 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f  shared lock befo
17140 72 65 20 74 72 79 69 6e 67 20 74 68 65 20 72 61  re trying the ra
17150 6e 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64  nge.  we'll need
17160 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 72 65   to .      ** re
17170 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68  establish the sh
17180 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 77 65 20  ared lock if we 
17190 63 61 6e 27 74 20 67 65 74 20 74 68 65 20 20 61  can't get the  a
171a0 66 70 55 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 2a  fpUnlock.      *
171b0 2f 0a 20 20 20 20 20 20 69 66 28 20 21 28 66 61  /.      if( !(fa
171c0 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63  iled = afpSetLoc
171d0 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
171e0 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44  h, pFile, SHARED
171f0 5f 46 49 52 53 54 20 2b 0a 20 20 20 20 20 20 20  _FIRST +.       
17200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17210 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64    pInode->shared
17220 42 79 74 65 2c 20 31 2c 20 30 29 29 20 29 7b 0a  Byte, 1, 0)) ){.
17230 20 20 20 20 20 20 20 20 69 6e 74 20 66 61 69 6c          int fail
17240 65 64 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  ed2 = SQLITE_OK;
17250 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20  .        /* now 
17260 61 74 74 65 6d 6d 70 74 20 74 6f 20 67 65 74 20  attemmpt to get 
17270 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  the exclusive lo
17280 63 6b 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20  ck range */.    
17290 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70      failed = afp
172a0 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
172b0 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
172c0 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 0a 20  SHARED_FIRST, . 
172d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48                SH
172f0 41 52 45 44 5f 53 49 5a 45 2c 20 31 29 3b 0a 20  ARED_SIZE, 1);. 
17300 20 20 20 20 20 20 20 69 66 28 20 66 61 69 6c 65         if( faile
17310 64 20 26 26 20 28 66 61 69 6c 65 64 32 20 3d 20  d && (failed2 = 
17320 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
17330 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
17340 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
17350 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45             SHARE
17360 44 5f 46 49 52 53 54 20 2b 20 70 49 6e 6f 64 65  D_FIRST + pInode
17370 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c  ->sharedByte, 1,
17380 20 31 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20   1)) ){.        
17390 20 20 2f 2a 20 43 61 6e 27 74 20 72 65 65 73 74    /* Can't reest
173a0 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65  ablish the share
173b0 64 20 6c 6f 63 6b 2e 20 20 53 71 6c 69 74 65 20  d lock.  Sqlite 
173c0 63 61 6e 27 74 20 64 65 61 6c 2c 20 74 68 69 73  can't deal, this
173d0 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   is.          **
173e0 20 61 20 63 72 69 74 69 63 61 6c 20 49 2f 4f 20   a critical I/O 
173f0 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20  error.          
17400 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  */.          rc 
17410 3d 20 28 28 66 61 69 6c 65 64 20 26 20 53 51 4c  = ((failed & SQL
17420 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51  ITE_IOERR) == SQ
17430 4c 49 54 45 5f 49 4f 45 52 52 29 20 3f 20 66 61  LITE_IOERR) ? fa
17440 69 6c 65 64 32 20 3a 20 0a 20 20 20 20 20 20 20  iled2 : .       
17450 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
17460 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  OERR_LOCK;.     
17470 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
17480 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  d_lock;.        
17490 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  } .      }else{.
174a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 61 69          rc = fai
174b0 6c 65 64 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  led; .      }.  
174c0 20 20 7d 0a 20 20 20 20 69 66 28 20 66 61 69 6c    }.    if( fail
174d0 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ed ){.      rc =
174e0 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20   failed;.    }. 
174f0 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d   }.  .  if( rc==
17500 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17510 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
17520 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
17530 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
17540 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
17550 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46  ;.  }else if( eF
17560 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
17570 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  VE_LOCK ){.    p
17580 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
17590 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a  = PENDING_LOCK;.
175a0 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
175b0 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f  eLock = PENDING_
175c0 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70  LOCK;.  }.  .afp
175d0 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69  _end_lock:.  uni
175e0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
175f0 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
17600 20 20 20 25 64 20 25 73 20 25 73 20 28 61 66 70     %d %s %s (afp
17610 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
17620 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
17630 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20  Lock), .        
17640 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
17650 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
17660 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
17670 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
17680 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
17690 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
176a0 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
176b0 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
176c0 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
176d0 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
176e0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
176f0 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
17700 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
17710 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
17720 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
17730 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
17740 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
17750 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
17760 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
17770 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
17780 70 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  pUnlock(sqlite3_
17790 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
177a0 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74  ileLock) {.  int
177b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
177c0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
177d0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
177e0 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  id;.  unixInodeI
177f0 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 61  nfo *pInode;.  a
17800 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
17810 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70   *context = (afp
17820 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
17830 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  ) pFile->locking
17840 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 73  Context;.  int s
17850 6b 69 70 53 68 61 72 65 64 20 3d 20 30 3b 0a 23  kipShared = 0;.#
17860 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
17870 54 0a 20 20 69 6e 74 20 68 20 3d 20 70 46 69 6c  T.  int h = pFil
17880 65 2d 3e 68 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  e->h;.#endif..  
17890 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
178a0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
178b0 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
178c0 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20  d(%d,%d) pid=%d 
178d0 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
178e0 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
178f0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
17900 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c  >eFileLock, pFil
17910 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  e->pInode->eFile
17920 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e  Lock, pFile->pIn
17930 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20  ode->nShared,.  
17940 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 70 69           osGetpi
17950 64 28 30 29 29 29 3b 0a 0a 20 20 61 73 73 65 72  d(0)));..  asser
17960 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48  t( eFileLock<=SH
17970 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  ARED_LOCK );.  i
17980 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
17990 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock<=eFileLock )
179a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
179b0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e  ITE_OK;.  }.  un
179c0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
179d0 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65    pInode = pFile
179e0 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65  ->pInode;.  asse
179f0 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  rt( pInode->nSha
17a00 72 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  red!=0 );.  if( 
17a10 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
17a20 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
17a30 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
17a40 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70  de->eFileLock==p
17a50 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
17a60 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
17a70 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
17a80 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
17a90 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20  rror( h=(-1) ). 
17aa0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
17ab0 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
17ac0 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f   .#ifdef SQLITE_
17ad0 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65  DEBUG.    /* Whe
17ae0 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63  n reducing a loc
17af0 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74 68 65  k such that othe
17b00 72 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20  r processes can 
17b10 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61  start.    ** rea
17b20 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
17b30 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61  e file again, ma
17b40 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
17b50 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
17b60 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20  ion counter was 
17b70 75 70 64 61 74 65 64 20 69 66 20 61 6e 79 20 70  updated if any p
17b80 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  art of the datab
17b90 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  ase.    ** file 
17ba0 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65  changed.  If the
17bb0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
17bc0 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61  nter is not upda
17bd0 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65  ted,.    ** othe
17be0 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f  r connections to
17bf0 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d   the same file m
17c00 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65  ight not realize
17c10 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65   that.    ** the
17c20 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65   file has change
17c30 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68  d and hence migh
17c40 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c  t not know to fl
17c50 75 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a  ush their.    **
17c60 20 63 61 63 68 65 2e 20 20 54 68 65 20 75 73 65   cache.  The use
17c70 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63 68   of a stale cach
17c80 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61  e can lead to da
17c90 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
17ca0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  n..    */.    as
17cb0 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 69 6e 4e  sert( pFile->inN
17cc0 6f 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a 20 20  ormalWrite==0.  
17cd0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c           || pFil
17ce0 65 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30 0a 20  e->dbUpdate==0. 
17cf0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69            || pFi
17d00 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e  le->transCntrChn
17d10 67 3d 3d 31 20 29 3b 0a 20 20 20 20 70 46 69 6c  g==1 );.    pFil
17d20 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
17d30 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20   = 0;.#endif.   
17d40 20 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d   .    if( pFile-
17d50 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c  >eFileLock==EXCL
17d60 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  USIVE_LOCK ){.  
17d70 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c      rc = afpSetL
17d80 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
17d90 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52  ath, pFile, SHAR
17da0 45 44 5f 46 49 52 53 54 2c 20 53 48 41 52 45 44  ED_FIRST, SHARED
17db0 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 20  _SIZE, 0);.     
17dc0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17dd0 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b  OK && (eFileLock
17de0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
17df0 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
17e00 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  >1) ){.        /
17e10 2a 20 6f 6e 6c 79 20 72 65 2d 65 73 74 61 62 6c  * only re-establ
17e20 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c  ish the shared l
17e30 6f 63 6b 20 69 66 20 6e 65 63 65 73 73 61 72 79  ock if necessary
17e40 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
17e50 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d  sharedLockByte =
17e60 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49   SHARED_FIRST+pI
17e70 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65  node->sharedByte
17e80 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  ;.        rc = a
17e90 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
17ea0 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
17eb0 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  , sharedLockByte
17ec0 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  , 1, 1);.      }
17ed0 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
17ee0 73 6b 69 70 53 68 61 72 65 64 20 3d 20 31 3b 0a  skipShared = 1;.
17ef0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
17f00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17f10 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46  _OK && pFile->eF
17f20 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47  ileLock>=PENDING
17f30 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72  _LOCK ){.      r
17f40 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
17f50 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
17f60 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42  pFile, PENDING_B
17f70 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  YTE, 1, 0);.    
17f80 7d 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  } .    if( rc==S
17f90 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c  QLITE_OK && pFil
17fa0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 52 45  e->eFileLock>=RE
17fb0 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 63  SERVED_LOCK && c
17fc0 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64  ontext->reserved
17fd0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
17fe0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
17ff0 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
18000 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
18010 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   1, 0);.      if
18020 28 20 21 72 63 20 29 7b 20 0a 20 20 20 20 20 20  ( !rc ){ .      
18030 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72    context->reser
18040 76 65 64 20 3d 20 30 3b 20 0a 20 20 20 20 20 20  ved = 0; .      
18050 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
18060 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
18070 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41   (eFileLock==SHA
18080 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f  RED_LOCK || pIno
18090 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29 29 7b  de->nShared>1)){
180a0 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65  .      pInode->e
180b0 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
180c0 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20  D_LOCK;.    }.  
180d0 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
180e0 54 45 5f 4f 4b 20 26 26 20 65 46 69 6c 65 4c 6f  TE_OK && eFileLo
180f0 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a  ck==NO_LOCK ){..
18100 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74      /* Decrement
18110 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
18120 20 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65 61   counter.  Relea
18130 73 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e  se the lock usin
18140 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63  g an.    ** OS c
18150 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c  all only when al
18160 6c 20 74 68 72 65 61 64 73 20 69 6e 20 74 68 69  l threads in thi
18170 73 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68  s same process h
18180 61 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20  ave released.   
18190 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20   ** the lock..  
181a0 20 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65    */.    unsigne
181b0 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72  d long long shar
181c0 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41  edLockByte = SHA
181d0 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65  RED_FIRST+pInode
181e0 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20  ->sharedByte;.  
181f0 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65    pInode->nShare
18200 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  d--;.    if( pIn
18210 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20  ode->nShared==0 
18220 29 7b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  ){.      Simulat
18230 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
18240 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  );.      Simulat
18250 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29  eIOError( h=(-1)
18260 20 29 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74   ).      Simulat
18270 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
18280 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73 6b  );.      if( !sk
18290 69 70 53 68 61 72 65 64 20 29 7b 0a 20 20 20 20  ipShared ){.    
182a0 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c      rc = afpSetL
182b0 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
182c0 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68 61 72  ath, pFile, shar
182d0 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30  edLockByte, 1, 0
182e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
182f0 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20   if( !rc ){.    
18300 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
18310 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
18320 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
18330 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
18340 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  OCK;.      }.   
18350 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
18360 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18370 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d    pInode->nLock-
18380 2d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  -;.      assert(
18390 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d   pInode->nLock>=
183a0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
183b0 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20  Inode->nLock==0 
183c0 29 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65  ){.        close
183d0 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65  PendingFds(pFile
183e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
183f0 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65  .  }.  .  unixLe
18400 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66  aveMutex();.  if
18410 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18420 29 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ) pFile->eFileLo
18430 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
18440 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18450 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
18460 6c 65 20 26 20 63 6c 65 61 6e 75 70 20 41 46 50  le & cleanup AFP
18470 20 73 70 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e   specific lockin
18480 67 20 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73 74  g context .*/.st
18490 61 74 69 63 20 69 6e 74 20 61 66 70 43 6c 6f 73  atic int afpClos
184a0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
184b0 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d  id) {.  int rc =
184c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
184d0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
184e0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
184f0 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29   assert( id!=0 )
18500 3b 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 28 69 64  ;.  afpUnlock(id
18510 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 75 6e  , NO_LOCK);.  un
18520 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
18530 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e    if( pFile->pIn
18540 6f 64 65 20 26 26 20 70 46 69 6c 65 2d 3e 70 49  ode && pFile->pI
18550 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20  node->nLock ){. 
18560 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
18570 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  re outstanding l
18580 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74  ocks, do not act
18590 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20  ually close the 
185a0 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 2a 2a  file just.    **
185b0 20 79 65 74 20 62 65 63 61 75 73 65 20 74 68 61   yet because tha
185c0 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68  t would clear th
185d0 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74  ose locks.  Inst
185e0 65 61 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c  ead, add the fil
185f0 65 0a 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70  e.    ** descrip
18600 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 61  tor to pInode->a
18610 50 65 6e 64 69 6e 67 2e 20 20 49 74 20 77 69 6c  Pending.  It wil
18620 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  l be automatical
18630 6c 79 20 63 6c 6f 73 65 64 20 77 68 65 6e 0a 20  ly closed when. 
18640 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 6c     ** the last l
18650 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a  ock is cleared..
18660 20 20 20 20 2a 2f 0a 20 20 20 20 73 65 74 50 65      */.    setPe
18670 6e 64 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a  ndingFd(pFile);.
18680 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 49 6e 6f    }.  releaseIno
18690 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20  deInfo(pFile);. 
186a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46   sqlite3_free(pF
186b0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
186c0 65 78 74 29 3b 0a 20 20 72 63 20 3d 20 63 6c 6f  ext);.  rc = clo
186d0 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a  seUnixFile(id);.
186e0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
186f0 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ();.  return rc;
18700 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  .}..#endif /* de
18710 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
18720 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
18730 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
18740 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  */./*.** The cod
18750 65 20 61 62 6f 76 65 20 69 73 20 74 68 65 20 41  e above is the A
18760 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  FP lock implemen
18770 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64  tation.  The cod
18780 65 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a  e is specific.**
18790 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64   to MacOSX and d
187a0 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  oes not work on 
187b0 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66  other unix platf
187c0 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e  orms.  No altern
187d0 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69  ative.** is avai
187e0 6c 61 62 6c 65 2e 20 20 49 66 20 79 6f 75 20 64  lable.  If you d
187f0 6f 6e 27 74 20 63 6f 6d 70 69 6c 65 20 66 6f 72  on't compile for
18800 20 61 20 6d 61 63 2c 20 74 68 65 6e 20 74 68 65   a mac, then the
18810 20 22 75 6e 69 78 2d 61 66 70 22 0a 2a 2a 20 56   "unix-afp".** V
18820 46 53 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61  FS is not availa
18830 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ble..**.********
18840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
18850 64 20 6f 66 20 74 68 65 20 41 46 50 20 6c 6f 63  d of the AFP loc
18860 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
18870 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
18880 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
18890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
188a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
188b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
188c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
188d0 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
188e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
188f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18920 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
18930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18940 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 46 53 20 4c  **** Begin NFS L
18950 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
18960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18970 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 20 64 65  *******/..#if de
18980 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
18990 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
189a0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
189b0 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72 20 74 68 65  /*. ** Lower the
189c0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
189d0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
189e0 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
189f0 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
18a00 0a 20 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  . ** must be eit
18a10 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
18a20 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a  HARED_LOCK.. **.
18a30 20 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69   ** If the locki
18a40 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
18a50 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
18a60 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
18a70 20 62 65 6c 6f 77 0a 20 2a 2a 20 74 68 65 20 72   below. ** the r
18a80 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
18a90 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
18aa0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
18ab0 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
18ac0 6e 66 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  nfsUnlock(sqlite
18ad0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
18ae0 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 72 65  eFileLock){.  re
18af0 74 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b  turn posixUnlock
18b00 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20  (id, eFileLock, 
18b10 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  1);.}..#endif /*
18b20 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
18b30 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
18b40 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
18b50 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20  LE */./*.** The 
18b60 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74 68  code above is th
18b70 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65  e NFS lock imple
18b80 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20  mentation.  The 
18b90 63 6f 64 65 20 69 73 20 73 70 65 63 69 66 69 63  code is specific
18ba0 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e  .** to MacOSX an
18bb0 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  d does not work 
18bc0 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c  on other unix pl
18bd0 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74  atforms.  No alt
18be0 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61  ernative.** is a
18bf0 76 61 69 6c 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a  vailable.  .**.*
18c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18c10 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
18c20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  NFS lock impleme
18c30 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
18c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
18c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
18ca0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
18cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
18cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18d00 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c   Non-locking sql
18d10 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64  ite3_file method
18d20 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
18d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
18d40 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 64  **.** The next d
18d50 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ivision contains
18d60 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
18d70 20 66 6f 72 20 61 6c 6c 20 6d 65 74 68 6f 64 73   for all methods
18d80 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69   of the .** sqli
18d90 74 65 33 5f 66 69 6c 65 20 6f 62 6a 65 63 74 20  te3_file object 
18da0 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6c  other than the l
18db0 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 2e 20  ocking methods. 
18dc0 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20   The locking.** 
18dd0 6d 65 74 68 6f 64 73 20 77 65 72 65 20 64 65 66  methods were def
18de0 69 6e 65 64 20 69 6e 20 64 69 76 69 73 69 6f 6e  ined in division
18df0 73 20 61 62 6f 76 65 20 28 6f 6e 65 20 6c 6f 63  s above (one loc
18e00 6b 69 6e 67 20 6d 65 74 68 6f 64 20 70 65 72 0a  king method per.
18e10 2a 2a 20 64 69 76 69 73 69 6f 6e 29 2e 20 20 54  ** division).  T
18e20 68 6f 73 65 20 6d 65 74 68 6f 64 73 20 74 68 61  hose methods tha
18e30 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20  t are common to 
18e40 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  all locking mode
18e50 73 0a 2a 2a 20 61 72 65 20 67 61 74 68 65 72 20  s.** are gather 
18e60 74 6f 67 65 74 68 65 72 20 69 6e 74 6f 20 74 68  together into th
18e70 69 73 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a  is division..*/.
18e80 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74  ./*.** Seek to t
18e90 68 65 20 6f 66 66 73 65 74 20 70 61 73 73 65 64  he offset passed
18ea0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
18eb0 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e 20 72 65  rgument, then re
18ec0 61 64 20 63 6e 74 20 0a 2a 2a 20 62 79 74 65 73  ad cnt .** bytes
18ed0 20 69 6e 74 6f 20 70 42 75 66 2e 20 52 65 74 75   into pBuf. Retu
18ee0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
18ef0 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
18f00 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20  read..**.** NB: 
18f10 20 49 66 20 79 6f 75 20 64 65 66 69 6e 65 20 55   If you define U
18f20 53 45 5f 50 52 45 41 44 20 6f 72 20 55 53 45 5f  SE_PREAD or USE_
18f30 50 52 45 41 44 36 34 2c 20 74 68 65 6e 20 69 74  PREAD64, then it
18f40 20 6d 69 67 68 74 20 61 6c 73 6f 0a 2a 2a 20 62   might also.** b
18f50 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64  e necessary to d
18f60 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55  efine _XOPEN_SOU
18f70 52 43 45 20 74 6f 20 62 65 20 35 30 30 2e 20 20  RCE to be 500.  
18f80 54 68 69 73 20 76 61 72 69 65 73 20 66 72 6f 6d  This varies from
18f90 0a 2a 2a 20 6f 6e 65 20 73 79 73 74 65 6d 20 74  .** one system t
18fa0 6f 20 61 6e 6f 74 68 65 72 2e 20 20 53 69 6e 63  o another.  Sinc
18fb0 65 20 53 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f  e SQLite does no
18fc0 74 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45  t define USE_PRE
18fd0 41 44 0a 2a 2a 20 69 6e 20 61 6e 79 20 66 6f 72  AD.** in any for
18fe0 6d 20 62 79 20 64 65 66 61 75 6c 74 2c 20 77 65  m by default, we
18ff0 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70   will not attemp
19000 74 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50  t to define _XOP
19010 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a 2a 20 53 65  EN_SOURCE..** Se
19020 65 20 74 69 63 6b 65 74 73 20 23 32 37 34 31 20  e tickets #2741 
19030 61 6e 64 20 23 32 36 38 31 2e 0a 2a 2a 0a 2a 2a  and #2681..**.**
19040 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70 69   To avoid stompi
19050 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61 6c  ng the errno val
19060 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20 72  ue on a failed r
19070 65 61 64 20 74 68 65 20 6c 61 73 74 45 72 72 6e  ead the lastErrn
19080 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  o value.** is se
19090 74 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  t before returni
190a0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
190b0 74 20 73 65 65 6b 41 6e 64 52 65 61 64 28 75 6e  t seekAndRead(un
190c0 69 78 46 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69  ixFile *id, sqli
190d0 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74  te3_int64 offset
190e0 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e  , void *pBuf, in
190f0 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f  t cnt){.  int go
19100 74 3b 0a 20 20 69 6e 74 20 70 72 69 6f 72 20 3d  t;.  int prior =
19110 20 30 3b 0a 23 69 66 20 28 21 64 65 66 69 6e 65   0;.#if (!define
19120 64 28 55 53 45 5f 50 52 45 41 44 29 20 26 26 20  d(USE_PREAD) && 
19130 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45  !defined(USE_PRE
19140 41 44 36 34 29 29 0a 20 20 69 36 34 20 6e 65 77  AD64)).  i64 new
19150 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69 66 0a 20  Offset;.#endif. 
19160 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 20 20   TIMER_START;.  
19170 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 28 63 6e  assert( cnt==(cn
19180 74 26 30 78 31 66 66 66 66 29 20 29 3b 0a 20 20  t&0x1ffff) );.  
19190 61 73 73 65 72 74 28 20 69 64 2d 3e 68 3e 32 20  assert( id->h>2 
191a0 29 3b 0a 20 20 64 6f 7b 0a 23 69 66 20 64 65 66  );.  do{.#if def
191b0 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a  ined(USE_PREAD).
191c0 20 20 20 20 67 6f 74 20 3d 20 6f 73 50 72 65 61      got = osPrea
191d0 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  d(id->h, pBuf, c
191e0 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  nt, offset);.   
191f0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
19200 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65  ( got = -1 );.#e
19210 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  lif defined(USE_
19220 50 52 45 41 44 36 34 29 0a 20 20 20 20 67 6f 74  PREAD64).    got
19230 20 3d 20 6f 73 50 72 65 61 64 36 34 28 69 64 2d   = osPread64(id-
19240 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f  >h, pBuf, cnt, o
19250 66 66 73 65 74 29 3b 0a 20 20 20 20 53 69 6d 75  ffset);.    Simu
19260 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74  lateIOError( got
19270 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 73 65 0a 20   = -1 );.#else. 
19280 20 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c     newOffset = l
19290 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73  seek(id->h, offs
192a0 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20  et, SEEK_SET);. 
192b0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
192c0 6f 72 28 20 6e 65 77 4f 66 66 73 65 74 20 3d 20  or( newOffset = 
192d0 2d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65  -1 );.    if( ne
192e0 77 4f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20  wOffset<0 ){.   
192f0 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
19300 6f 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c  o((unixFile*)id,
19310 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72   errno);.      r
19320 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
19330 20 20 20 20 67 6f 74 20 3d 20 6f 73 52 65 61 64      got = osRead
19340 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
19350 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  t);.#endif.    i
19360 66 28 20 67 6f 74 3d 3d 63 6e 74 20 29 20 62 72  f( got==cnt ) br
19370 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 67 6f 74  eak;.    if( got
19380 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  <0 ){.      if( 
19390 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 7b 20  errno==EINTR ){ 
193a0 67 6f 74 20 3d 20 31 3b 20 63 6f 6e 74 69 6e 75  got = 1; continu
193b0 65 3b 20 7d 0a 20 20 20 20 20 20 70 72 69 6f 72  e; }.      prior
193c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 6f 72   = 0;.      stor
193d0 65 4c 61 73 74 45 72 72 6e 6f 28 28 75 6e 69 78  eLastErrno((unix
193e0 46 69 6c 65 2a 29 69 64 2c 20 20 65 72 72 6e 6f  File*)id,  errno
193f0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
19400 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f      }else if( go
19410 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 63 6e 74  t>0 ){.      cnt
19420 20 2d 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 6f   -= got;.      o
19430 66 66 73 65 74 20 2b 3d 20 67 6f 74 3b 0a 20 20  ffset += got;.  
19440 20 20 20 20 70 72 69 6f 72 20 2b 3d 20 67 6f 74      prior += got
19450 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 28  ;.      pBuf = (
19460 76 6f 69 64 2a 29 28 67 6f 74 20 2b 20 28 63 68  void*)(got + (ch
19470 61 72 2a 29 70 42 75 66 29 3b 0a 20 20 20 20 7d  ar*)pBuf);.    }
19480 0a 20 20 7d 77 68 69 6c 65 28 20 67 6f 74 3e 30  .  }while( got>0
19490 20 29 3b 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b   );.  TIMER_END;
194a0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41  .  OSTRACE(("REA
194b0 44 20 20 20 20 25 2d 33 64 20 25 35 64 20 25 37  D    %-3d %5d %7
194c0 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 0a 20 20 20  lld %llu\n",.   
194d0 20 20 20 20 20 20 20 20 20 69 64 2d 3e 68 2c 20           id->h, 
194e0 67 6f 74 2b 70 72 69 6f 72 2c 20 6f 66 66 73 65  got+prior, offse
194f0 74 2d 70 72 69 6f 72 2c 20 54 49 4d 45 52 5f 45  t-prior, TIMER_E
19500 4c 41 50 53 45 44 29 29 3b 0a 20 20 72 65 74 75  LAPSED));.  retu
19510 72 6e 20 67 6f 74 2b 70 72 69 6f 72 3b 0a 7d 0a  rn got+prior;.}.
19520 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61  ./*.** Read data
19530 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74   from a file int
19540 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52 65 74  o a buffer.  Ret
19550 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
19560 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65   all.** bytes we
19570 72 65 20 72 65 61 64 20 73 75 63 63 65 73 73 66  re read successf
19580 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f  ully and SQLITE_
19590 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e  IOERR if anythin
195a0 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
195b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
195c0 6e 69 78 52 65 61 64 28 0a 20 20 73 71 6c 69 74  nixRead(.  sqlit
195d0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20  e3_file *id, .  
195e0 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69  void *pBuf, .  i
195f0 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65  nt amt,.  sqlite
19600 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 0a 29  3_int64 offset.)
19610 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
19620 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  ile = (unixFile 
19630 2a 29 69 64 3b 0a 20 20 69 6e 74 20 67 6f 74 3b  *)id;.  int got;
19640 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b  .  assert( id );
19650 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
19660 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t>=0 );.  assert
19670 28 20 61 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a  ( amt>0 );..  /*
19680 20 49 66 20 74 68 69 73 20 69 73 20 61 20 64 61   If this is a da
19690 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74  tabase file (not
196a0 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74   a journal, mast
196b0 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65  er-journal or te
196c0 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74  mp.  ** file), t
196d0 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  he bytes in the 
196e0 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 73 68  locking range sh
196f0 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20 72 65  ould never be re
19700 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a  ad or written. *
19710 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74  /.#if 0.  assert
19720 28 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64  ( pFile->pUnused
19730 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66  ==0.       || of
19740 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59  fset>=PENDING_BY
19750 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20 7c 7c  TE+512.       ||
19760 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e   offset+amt<=PEN
19770 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a  DING_BYTE .  );.
19780 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
19790 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
197a0 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74  >0.  /* Deal wit
197b0 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69  h as much of thi
197c0 73 20 72 65 61 64 20 72 65 71 75 65 73 74 20 61  s read request a
197d0 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72  s possible by tr
197e0 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64  ansfering.  ** d
197f0 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d  ata from the mem
19800 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e  ory mapping usin
19810 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a  g memcpy().  */.
19820 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69    if( offset<pFi
19830 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  le->mmapSize ){.
19840 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61      if( offset+a
19850 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  mt <= pFile->mma
19860 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d  pSize ){.      m
19870 65 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28 75  emcpy(pBuf, &((u
19880 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70  8 *)(pFile->pMap
19890 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d  Region))[offset]
198a0 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 72 65  , amt);.      re
198b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
198c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
198d0 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70 46 69   int nCopy = pFi
198e0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f  le->mmapSize - o
198f0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 6d 65 6d  ffset;.      mem
19900 63 70 79 28 70 42 75 66 2c 20 26 28 28 75 38 20  cpy(pBuf, &((u8 
19910 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65  *)(pFile->pMapRe
19920 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20  gion))[offset], 
19930 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42  nCopy);.      pB
19940 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75  uf = &((u8 *)pBu
19950 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20  f)[nCopy];.     
19960 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20   amt -= nCopy;. 
19970 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e       offset += n
19980 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Copy;.    }.  }.
19990 23 65 6e 64 69 66 0a 0a 20 20 67 6f 74 20 3d 20  #endif..  got = 
199a0 73 65 65 6b 41 6e 64 52 65 61 64 28 70 46 69 6c  seekAndRead(pFil
199b0 65 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c  e, offset, pBuf,
199c0 20 61 6d 74 29 3b 0a 20 20 69 66 28 20 67 6f 74   amt);.  if( got
199d0 3d 3d 61 6d 74 20 29 7b 0a 20 20 20 20 72 65 74  ==amt ){.    ret
199e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
199f0 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3c 30   }else if( got<0
19a00 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 61 73 74 45   ){.    /* lastE
19a10 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b  rrno set by seek
19a20 41 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20 20 72  AndRead */.    r
19a30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
19a40 52 52 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65  RR_READ;.  }else
19a50 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45  {.    storeLastE
19a60 72 72 6e 6f 28 70 46 69 6c 65 2c 20 30 29 3b 20  rrno(pFile, 0); 
19a70 20 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74 65    /* not a syste
19a80 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 2f  m error */.    /
19a90 2a 20 55 6e 72 65 61 64 20 70 61 72 74 73 20 6f  * Unread parts o
19aa0 66 20 74 68 65 20 62 75 66 66 65 72 20 6d 75 73  f the buffer mus
19ab0 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64  t be zero-filled
19ac0 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
19ad0 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 67 6f  ((char*)pBuf)[go
19ae0 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29 3b  t], 0, amt-got);
19af0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
19b00 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
19b10 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  EAD;.  }.}../*.*
19b20 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 65  * Attempt to see
19b30 6b 20 74 68 65 20 66 69 6c 65 2d 64 65 73 63 72  k the file-descr
19b40 69 70 74 6f 72 20 70 61 73 73 65 64 20 61 73 20  iptor passed as 
19b50 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
19b60 6e 74 20 74 6f 0a 2a 2a 20 61 62 73 6f 6c 75 74  nt to.** absolut
19b70 65 20 6f 66 66 73 65 74 20 69 4f 66 66 2c 20 74  e offset iOff, t
19b80 68 65 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 77  hen attempt to w
19b90 72 69 74 65 20 6e 42 75 66 20 62 79 74 65 73 20  rite nBuf bytes 
19ba0 6f 66 20 64 61 74 61 20 66 72 6f 6d 0a 2a 2a 20  of data from.** 
19bb0 70 42 75 66 20 74 6f 20 69 74 2e 20 49 66 20 61  pBuf to it. If a
19bc0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
19bd0 72 65 74 75 72 6e 20 2d 31 20 61 6e 64 20 73 65  return -1 and se
19be0 74 20 2a 70 69 45 72 72 6e 6f 2e 20 4f 74 68 65  t *piErrno. Othe
19bf0 72 77 69 73 65 2c 20 0a 2a 2a 20 72 65 74 75 72  rwise, .** retur
19c00 6e 20 74 68 65 20 61 63 74 75 61 6c 20 6e 75 6d  n the actual num
19c10 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69  ber of bytes wri
19c20 74 74 65 6e 20 28 77 68 69 63 68 20 6d 61 79 20  tten (which may 
19c30 62 65 20 6c 65 73 73 20 74 68 61 6e 0a 2a 2a 20  be less than.** 
19c40 6e 42 75 66 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  nBuf)..*/.static
19c50 20 69 6e 74 20 73 65 65 6b 41 6e 64 57 72 69 74   int seekAndWrit
19c60 65 46 64 28 0a 20 20 69 6e 74 20 66 64 2c 20 20  eFd(.  int fd,  
19c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c80 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
19c90 65 73 63 72 69 70 74 6f 72 20 74 6f 20 77 72 69  escriptor to wri
19ca0 74 65 20 74 6f 20 2a 2f 0a 20 20 69 36 34 20 69  te to */.  i64 i
19cb0 4f 66 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Off,            
19cc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
19cd0 6c 65 20 6f 66 66 73 65 74 20 74 6f 20 62 65 67  le offset to beg
19ce0 69 6e 20 77 72 69 74 69 6e 67 20 61 74 20 2a 2f  in writing at */
19cf0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
19d00 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
19d10 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20     /* Copy data 
19d20 66 72 6f 6d 20 74 68 69 73 20 62 75 66 66 65 72  from this buffer
19d30 20 74 6f 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a   to the file */.
19d40 20 20 69 6e 74 20 6e 42 75 66 2c 20 20 20 20 20    int nBuf,     
19d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d60 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66    /* Size of buf
19d70 66 65 72 20 70 42 75 66 20 69 6e 20 62 79 74 65  fer pBuf in byte
19d80 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 45 72  s */.  int *piEr
19d90 72 6e 6f 20 20 20 20 20 20 20 20 20 20 20 20 20  rno             
19da0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45         /* OUT: E
19db0 72 72 6f 72 20 6e 75 6d 62 65 72 20 69 66 20 65  rror number if e
19dc0 72 72 6f 72 20 6f 63 63 75 72 73 20 2a 2f 0a 29  rror occurs */.)
19dd0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20  {.  int rc = 0; 
19de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19df0 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74      /* Value ret
19e00 75 72 6e 65 64 20 62 79 20 73 79 73 74 65 6d 20  urned by system 
19e10 63 61 6c 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72  call */..  asser
19e20 74 28 20 6e 42 75 66 3d 3d 28 6e 42 75 66 26 30  t( nBuf==(nBuf&0
19e30 78 31 66 66 66 66 29 20 29 3b 0a 20 20 61 73 73  x1ffff) );.  ass
19e40 65 72 74 28 20 66 64 3e 32 20 29 3b 0a 20 20 61  ert( fd>2 );.  a
19e50 73 73 65 72 74 28 20 70 69 45 72 72 6e 6f 21 3d  ssert( piErrno!=
19e60 30 20 29 3b 0a 20 20 6e 42 75 66 20 26 3d 20 30  0 );.  nBuf &= 0
19e70 78 31 66 66 66 66 3b 0a 20 20 54 49 4d 45 52 5f  x1ffff;.  TIMER_
19e80 53 54 41 52 54 3b 0a 0a 23 69 66 20 64 65 66 69  START;..#if defi
19e90 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20  ned(USE_PREAD). 
19ea0 20 64 6f 7b 20 72 63 20 3d 20 28 69 6e 74 29 6f   do{ rc = (int)o
19eb0 73 50 77 72 69 74 65 28 66 64 2c 20 70 42 75 66  sPwrite(fd, pBuf
19ec0 2c 20 6e 42 75 66 2c 20 69 4f 66 66 29 3b 20 7d  , nBuf, iOff); }
19ed0 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
19ee0 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23  rrno==EINTR );.#
19ef0 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  elif defined(USE
19f00 5f 50 52 45 41 44 36 34 29 0a 20 20 64 6f 7b 20  _PREAD64).  do{ 
19f10 72 63 20 3d 20 28 69 6e 74 29 6f 73 50 77 72 69  rc = (int)osPwri
19f20 74 65 36 34 28 66 64 2c 20 70 42 75 66 2c 20 6e  te64(fd, pBuf, n
19f30 42 75 66 2c 20 69 4f 66 66 29 3b 7d 77 68 69 6c  Buf, iOff);}whil
19f40 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f  e( rc<0 && errno
19f50 3d 3d 45 49 4e 54 52 29 3b 0a 23 65 6c 73 65 0a  ==EINTR);.#else.
19f60 20 20 64 6f 7b 0a 20 20 20 20 69 36 34 20 69 53    do{.    i64 iS
19f70 65 65 6b 20 3d 20 6c 73 65 65 6b 28 66 64 2c 20  eek = lseek(fd, 
19f80 69 4f 66 66 2c 20 53 45 45 4b 5f 53 45 54 29 3b  iOff, SEEK_SET);
19f90 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
19fa0 72 72 6f 72 28 20 69 53 65 65 6b 20 3d 20 2d 31  rror( iSeek = -1
19fb0 20 29 3b 0a 20 20 20 20 69 66 28 20 69 53 65 65   );.    if( iSee
19fc0 6b 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  k<0 ){.      rc 
19fd0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 62 72 65 61  = -1;.      brea
19fe0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  k;.    }.    rc 
19ff0 3d 20 6f 73 57 72 69 74 65 28 66 64 2c 20 70 42  = osWrite(fd, pB
1a000 75 66 2c 20 6e 42 75 66 29 3b 0a 20 20 7d 77 68  uf, nBuf);.  }wh
1a010 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72  ile( rc<0 && err
1a020 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6e  no==EINTR );.#en
1a030 64 69 66 0a 0a 20 20 54 49 4d 45 52 5f 45 4e 44  dif..  TIMER_END
1a040 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57 52  ;.  OSTRACE(("WR
1a050 49 54 45 20 20 20 25 2d 33 64 20 25 35 64 20 25  ITE   %-3d %5d %
1a060 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 66 64  7lld %llu\n", fd
1a070 2c 20 72 63 2c 20 69 4f 66 66 2c 20 54 49 4d 45  , rc, iOff, TIME
1a080 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 0a 20 20  R_ELAPSED));..  
1a090 69 66 28 20 72 63 3c 30 20 29 20 2a 70 69 45 72  if( rc<0 ) *piEr
1a0a0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 72  rno = errno;.  r
1a0b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
1a0c0 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20  .** Seek to the 
1a0d0 6f 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66  offset in id->of
1a0e0 66 73 65 74 20 74 68 65 6e 20 72 65 61 64 20 63  fset then read c
1a0f0 6e 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42  nt bytes into pB
1a100 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  uf..** Return th
1a110 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1a120 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e  s actually read.
1a130 20 20 55 70 64 61 74 65 20 74 68 65 20 6f 66 66    Update the off
1a140 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76  set..**.** To av
1a150 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65  oid stomping the
1a160 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20   errno value on 
1a170 61 20 66 61 69 6c 65 64 20 77 72 69 74 65 20 74  a failed write t
1a180 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c  he lastErrno val
1a190 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66  ue.** is set bef
1a1a0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
1a1b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
1a1c0 6b 41 6e 64 57 72 69 74 65 28 75 6e 69 78 46 69  kAndWrite(unixFi
1a1d0 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73  le *id, i64 offs
1a1e0 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  et, const void *
1a1f0 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a  pBuf, int cnt){.
1a200 20 20 72 65 74 75 72 6e 20 73 65 65 6b 41 6e 64    return seekAnd
1a210 57 72 69 74 65 46 64 28 69 64 2d 3e 68 2c 20 6f  WriteFd(id->h, o
1a220 66 66 73 65 74 2c 20 70 42 75 66 2c 20 63 6e 74  ffset, pBuf, cnt
1a230 2c 20 26 69 64 2d 3e 6c 61 73 74 45 72 72 6e 6f  , &id->lastErrno
1a240 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  );.}.../*.** Wri
1a250 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62  te data from a b
1a260 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c  uffer into a fil
1a270 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
1a280 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a  E_OK on success.
1a290 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  ** or some other
1a2a0 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66   error code on f
1a2b0 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ailure..*/.stati
1a2c0 63 20 69 6e 74 20 75 6e 69 78 57 72 69 74 65 28  c int unixWrite(
1a2d0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
1a2e0 2a 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f  *id, .  const vo
1a2f0 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74  id *pBuf, .  int
1a300 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f   amt,.  sqlite3_
1a310 69 6e 74 36 34 20 6f 66 66 73 65 74 20 0a 29 7b  int64 offset .){
1a320 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
1a330 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
1a340 69 64 3b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20  id;.  int wrote 
1a350 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69  = 0;.  assert( i
1a360 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  d );.  assert( a
1a370 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  mt>0 );..  /* If
1a380 20 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62   this is a datab
1a390 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20  ase file (not a 
1a3a0 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d  journal, master-
1a3b0 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a  journal or temp.
1a3c0 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20    ** file), the 
1a3d0 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63  bytes in the loc
1a3e0 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c  king range shoul
1a3f0 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20  d never be read 
1a400 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23  or written. */.#
1a410 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70  if 0.  assert( p
1a420 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30  File->pUnused==0
1a430 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65  .       || offse
1a440 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b  t>=PENDING_BYTE+
1a450 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66  512.       || of
1a460 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e  fset+amt<=PENDIN
1a470 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e  G_BYTE .  );.#en
1a480 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
1a490 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 49 66  TE_DEBUG.  /* If
1a4a0 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20   we are doing a 
1a4b0 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20  normal write to 
1a4c0 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
1a4d0 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20  (as opposed to. 
1a4e0 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d   ** doing a hot-
1a4f0 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
1a500 20 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20 73   or a write to s
1a510 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74  ome file other t
1a520 68 61 6e 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61  han a.  ** norma
1a530 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29  l database file)
1a540 20 74 68 65 6e 20 72 65 63 6f 72 64 20 74 68 65   then record the
1a550 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20 64   fact that the d
1a560 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 68 61 73  atabase.  ** has
1a570 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68   changed.  If th
1a580 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
1a590 75 6e 74 65 72 20 69 73 20 6d 6f 64 69 66 69 65  unter is modifie
1a5a0 64 2c 20 72 65 63 6f 72 64 20 74 68 61 74 0a 20  d, record that. 
1a5b0 20 2a 2a 20 66 61 63 74 20 74 6f 6f 2e 0a 20 20   ** fact too..  
1a5c0 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
1a5d0 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 29 7b  inNormalWrite ){
1a5e0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70  .    pFile->dbUp
1a5f0 64 61 74 65 20 3d 20 31 3b 20 20 2f 2a 20 54 68  date = 1;  /* Th
1a600 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62  e database has b
1a610 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a  een modified */.
1a620 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3c 3d      if( offset<=
1a630 32 34 20 26 26 20 6f 66 66 73 65 74 2b 61 6d 74  24 && offset+amt
1a640 3e 3d 32 37 20 29 7b 0a 20 20 20 20 20 20 69 6e  >=27 ){.      in
1a650 74 20 72 63 3b 0a 20 20 20 20 20 20 63 68 61 72  t rc;.      char
1a660 20 6f 6c 64 43 6e 74 72 5b 34 5d 3b 0a 20 20 20   oldCntr[4];.   
1a670 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
1a680 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
1a690 20 20 20 72 63 20 3d 20 73 65 65 6b 41 6e 64 52     rc = seekAndR
1a6a0 65 61 64 28 70 46 69 6c 65 2c 20 32 34 2c 20 6f  ead(pFile, 24, o
1a6b0 6c 64 43 6e 74 72 2c 20 34 29 3b 0a 20 20 20 20  ldCntr, 4);.    
1a6c0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1a6d0 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
1a6e0 20 20 69 66 28 20 72 63 21 3d 34 20 7c 7c 20 6d    if( rc!=4 || m
1a6f0 65 6d 63 6d 70 28 6f 6c 64 43 6e 74 72 2c 20 26  emcmp(oldCntr, &
1a700 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 32 34  ((char*)pBuf)[24
1a710 2d 6f 66 66 73 65 74 5d 2c 20 34 29 21 3d 30 20  -offset], 4)!=0 
1a720 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
1a730 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20  ->transCntrChng 
1a740 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 74 72 61  = 1;  /* The tra
1a750 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
1a760 20 68 61 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a   has changed */.
1a770 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1a780 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65  }.#endif..#if de
1a790 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4d 4d 41  fined(SQLITE_MMA
1a7a0 50 5f 52 45 41 44 57 52 49 54 45 29 20 26 26 20  P_READWRITE) && 
1a7b0 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
1a7c0 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c  SIZE>0.  /* Deal
1a7d0 20 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f 66   with as much of
1a7e0 20 74 68 69 73 20 77 72 69 74 65 20 72 65 71 75   this write requ
1a7f0 65 73 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20  est as possible 
1a800 62 79 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20  by transfering. 
1a810 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68   ** data from th
1a820 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67  e memory mapping
1a830 20 75 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e   using memcpy().
1a840 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65    */.  if( offse
1a850 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  t<pFile->mmapSiz
1a860 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66  e ){.    if( off
1a870 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65  set+amt <= pFile
1a880 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
1a890 20 20 20 20 6d 65 6d 63 70 79 28 26 28 28 75 38      memcpy(&((u8
1a8a0 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52   *)(pFile->pMapR
1a8b0 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c  egion))[offset],
1a8c0 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 20   pBuf, amt);.   
1a8d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1a8e0 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
1a8f0 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20        int nCopy 
1a900 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  = pFile->mmapSiz
1a910 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  e - offset;.    
1a920 20 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a    memcpy(&((u8 *
1a930 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  )(pFile->pMapReg
1a940 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70  ion))[offset], p
1a950 42 75 66 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20  Buf, nCopy);.   
1a960 20 20 20 70 42 75 66 20 3d 20 26 28 28 75 38 20     pBuf = &((u8 
1a970 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a  *)pBuf)[nCopy];.
1a980 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f        amt -= nCo
1a990 70 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74  py;.      offset
1a9a0 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d   += nCopy;.    }
1a9b0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 0a 20 20  .  }.#endif. .  
1a9c0 77 68 69 6c 65 28 20 28 77 72 6f 74 65 20 3d 20  while( (wrote = 
1a9d0 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69  seekAndWrite(pFi
1a9e0 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66  le, offset, pBuf
1a9f0 2c 20 61 6d 74 29 29 3c 61 6d 74 20 26 26 20 77  , amt))<amt && w
1aa00 72 6f 74 65 3e 30 20 29 7b 0a 20 20 20 20 61 6d  rote>0 ){.    am
1aa10 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20  t -= wrote;.    
1aa20 6f 66 66 73 65 74 20 2b 3d 20 77 72 6f 74 65 3b  offset += wrote;
1aa30 0a 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 63  .    pBuf = &((c
1aa40 68 61 72 2a 29 70 42 75 66 29 5b 77 72 6f 74 65  har*)pBuf)[wrote
1aa50 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74  ];.  }.  Simulat
1aa60 65 49 4f 45 72 72 6f 72 28 28 20 77 72 6f 74 65  eIOError(( wrote
1aa70 3d 28 2d 31 29 2c 20 61 6d 74 3d 31 20 29 29 3b  =(-1), amt=1 ));
1aa80 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66  .  SimulateDiskf
1aa90 75 6c 6c 45 72 72 6f 72 28 28 20 77 72 6f 74 65  ullError(( wrote
1aaa0 3d 30 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 0a 20  =0, amt=1 ));.. 
1aab0 20 69 66 28 20 61 6d 74 3e 77 72 6f 74 65 20 29   if( amt>wrote )
1aac0 7b 0a 20 20 20 20 69 66 28 20 77 72 6f 74 65 3c  {.    if( wrote<
1aad0 30 20 26 26 20 70 46 69 6c 65 2d 3e 6c 61 73 74  0 && pFile->last
1aae0 45 72 72 6e 6f 21 3d 45 4e 4f 53 50 43 20 29 7b  Errno!=ENOSPC ){
1aaf0 0a 20 20 20 20 20 20 2f 2a 20 6c 61 73 74 45 72  .      /* lastEr
1ab00 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41  rno set by seekA
1ab10 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20  ndWrite */.     
1ab20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1ab30 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20  OERR_WRITE;.    
1ab40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 6f  }else{.      sto
1ab50 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
1ab60 65 2c 20 30 29 3b 20 2f 2a 20 6e 6f 74 20 61 20  e, 0); /* not a 
1ab70 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a  system error */.
1ab80 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1ab90 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a  ITE_FULL;.    }.
1aba0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
1abb0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64  LITE_OK;.}..#ifd
1abc0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
1abd0 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e  *.** Count the n
1abe0 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e  umber of fullsyn
1abf0 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79  cs and normal sy
1ac00 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  ncs.  This is us
1ac10 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68  ed to test.** th
1ac20 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c  at syncs and ful
1ac30 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72  lsyncs are occur
1ac40 72 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68  ring at the righ
1ac50 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20  t times..*/.int 
1ac60 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75  sqlite3_sync_cou
1ac70 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69  nt = 0;.int sqli
1ac80 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  te3_fullsync_cou
1ac90 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
1aca0 2f 2a 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20  /*.** We do not 
1acb0 74 72 75 73 74 20 73 79 73 74 65 6d 73 20 74 6f  trust systems to
1acc0 20 70 72 6f 76 69 64 65 20 61 20 77 6f 72 6b 69   provide a worki
1acd0 6e 67 20 66 64 61 74 61 73 79 6e 63 28 29 2e 20  ng fdatasync(). 
1ace0 20 53 6f 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68   Some do..** Oth
1acf0 65 72 73 20 64 6f 20 6e 6f 2e 20 20 54 6f 20 62  ers do no.  To b
1ad00 65 20 73 61 66 65 2c 20 77 65 20 77 69 6c 6c 20  e safe, we will 
1ad10 73 74 69 63 6b 20 77 69 74 68 20 74 68 65 20 28  stick with the (
1ad20 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 29  slightly slower)
1ad30 0a 2a 2a 20 66 73 79 6e 63 28 29 2e 20 49 66 20  .** fsync(). If 
1ad40 79 6f 75 20 6b 6e 6f 77 20 74 68 61 74 20 79 6f  you know that yo
1ad50 75 72 20 73 79 73 74 65 6d 20 64 6f 65 73 20 73  ur system does s
1ad60 75 70 70 6f 72 74 20 66 64 61 74 61 73 79 6e 63  upport fdatasync
1ad70 28 29 20 63 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a  () correctly,.**
1ad80 20 74 68 65 6e 20 73 69 6d 70 6c 79 20 63 6f 6d   then simply com
1ad90 70 69 6c 65 20 77 69 74 68 20 2d 44 66 64 61 74  pile with -Dfdat
1ada0 61 73 79 6e 63 3d 66 64 61 74 61 73 79 6e 63 20  async=fdatasync 
1adb0 6f 72 20 2d 44 48 41 56 45 5f 46 44 41 54 41 53  or -DHAVE_FDATAS
1adc0 59 4e 43 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  YNC.*/.#if !defi
1add0 6e 65 64 28 66 64 61 74 61 73 79 6e 63 29 20 26  ned(fdatasync) &
1ade0 26 20 21 48 41 56 45 5f 46 44 41 54 41 53 59 4e  & !HAVE_FDATASYN
1adf0 43 0a 23 20 64 65 66 69 6e 65 20 66 64 61 74 61  C.# define fdata
1ae00 73 79 6e 63 20 66 73 79 6e 63 0a 23 65 6e 64 69  sync fsync.#endi
1ae10 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  f../*.** Define 
1ae20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 74  HAVE_FULLFSYNC t
1ae30 6f 20 30 20 6f 72 20 31 20 64 65 70 65 6e 64 69  o 0 or 1 dependi
1ae40 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ng on whether or
1ae50 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 46 5f 46 55   not.** the F_FU
1ae60 4c 4c 46 53 59 4e 43 20 6d 61 63 72 6f 20 69 73  LLFSYNC macro is
1ae70 20 64 65 66 69 6e 65 64 2e 20 20 46 5f 46 55 4c   defined.  F_FUL
1ae80 4c 46 53 59 4e 43 20 69 73 20 63 75 72 72 65 6e  LFSYNC is curren
1ae90 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61 69  tly.** only avai
1aea0 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 20 4f 53 20  lable on Mac OS 
1aeb0 58 2e 20 20 42 75 74 20 74 68 61 74 20 63 6f 75  X.  But that cou
1aec0 6c 64 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69  ld change..*/.#i
1aed0 66 64 65 66 20 46 5f 46 55 4c 4c 46 53 59 4e 43  fdef F_FULLFSYNC
1aee0 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46  .# define HAVE_F
1aef0 55 4c 4c 46 53 59 4e 43 20 31 0a 23 65 6c 73 65  ULLFSYNC 1.#else
1af00 0a 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46  .# define HAVE_F
1af10 55 4c 4c 46 53 59 4e 43 20 30 0a 23 65 6e 64 69  ULLFSYNC 0.#endi
1af20 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73  f.../*.** The fs
1af30 79 6e 63 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ync() system cal
1af40 6c 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  l does not work 
1af50 61 73 20 61 64 76 65 72 74 69 73 65 64 20 6f 6e  as advertised on
1af60 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79   many.** unix sy
1af70 73 74 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c  stems.  The foll
1af80 6f 77 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20  owing procedure 
1af90 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f  is an attempt to
1afa0 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b   make.** it work
1afb0 20 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   better..**.** T
1afc0 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  he SQLITE_NO_SYN
1afd0 43 20 6d 61 63 72 6f 20 64 69 73 61 62 6c 65 73  C macro disables
1afe0 20 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20 20   all fsync()s.  
1aff0 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 0a 2a  This is useful.*
1b000 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20 77 68  * for testing wh
1b010 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 72 75  en we want to ru
1b020 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 74 65  n through the te
1b030 73 74 20 73 75 69 74 65 20 71 75 69 63 6b 6c 79  st suite quickly
1b040 2e 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73 74 72  ..** You are str
1b050 6f 6e 67 6c 79 20 61 64 76 69 73 65 64 20 2a 6e  ongly advised *n
1b060 6f 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77 69  ot* to deploy wi
1b070 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  th SQLITE_NO_SYN
1b080 43 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f  C.** enabled, ho
1b090 77 65 76 65 72 2c 20 73 69 6e 63 65 20 77 69 74  wever, since wit
1b0a0 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  h SQLITE_NO_SYNC
1b0b0 20 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20   enabled, an OS 
1b0c0 63 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65  crash.** or powe
1b0d0 72 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c  r failure will l
1b0e0 69 6b 65 6c 79 20 63 6f 72 72 75 70 74 20 74 68  ikely corrupt th
1b0f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1b100 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65  .**.** SQLite se
1b110 74 73 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20  ts the dataOnly 
1b120 66 6c 61 67 20 69 66 20 74 68 65 20 73 69 7a 65  flag if the size
1b130 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   of the file is 
1b140 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 54 68  unchanged..** Th
1b150 65 20 69 64 65 61 20 62 65 68 69 6e 64 20 64 61  e idea behind da
1b160 74 61 4f 6e 6c 79 20 69 73 20 74 68 61 74 20 69  taOnly is that i
1b170 74 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 77 72  t should only wr
1b180 69 74 65 20 74 68 65 20 66 69 6c 65 20 63 6f 6e  ite the file con
1b190 74 65 6e 74 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c  tent.** to disk,
1b1a0 20 6e 6f 74 20 74 68 65 20 69 6e 6f 64 65 2e 20   not the inode. 
1b1b0 20 57 65 20 6f 6e 6c 79 20 73 65 74 20 64 61 74   We only set dat
1b1c0 61 4f 6e 6c 79 20 69 66 20 74 68 65 20 66 69 6c  aOnly if the fil
1b1d0 65 20 73 69 7a 65 20 69 73 20 0a 2a 2a 20 75 6e  e size is .** un
1b1e0 63 68 61 6e 67 65 64 20 73 69 6e 63 65 20 74 68  changed since th
1b1f0 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 70  e file size is p
1b200 61 72 74 20 6f 66 20 74 68 65 20 69 6e 6f 64 65  art of the inode
1b210 2e 20 20 48 6f 77 65 76 65 72 2c 20 0a 2a 2a 20  .  However, .** 
1b220 54 65 64 20 54 73 27 6f 20 74 65 6c 6c 73 20 75  Ted Ts'o tells u
1b230 73 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63  s that fdatasync
1b240 28 29 20 77 69 6c 6c 20 61 6c 73 6f 20 77 72 69  () will also wri
1b250 74 65 20 74 68 65 20 69 6e 6f 64 65 20 69 66 20  te the inode if 
1b260 74 68 65 0a 2a 2a 20 66 69 6c 65 20 73 69 7a 65  the.** file size
1b270 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20 54   has changed.  T
1b280 68 65 20 6f 6e 6c 79 20 72 65 61 6c 20 64 69 66  he only real dif
1b290 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
1b2a0 66 64 61 74 61 73 79 6e 63 28 29 0a 2a 2a 20 61  fdatasync().** a
1b2b0 6e 64 20 66 73 79 6e 63 28 29 2c 20 54 65 64 20  nd fsync(), Ted 
1b2c0 74 65 6c 6c 73 20 75 73 2c 20 69 73 20 74 68 61  tells us, is tha
1b2d0 74 20 66 64 61 74 61 73 79 6e 63 28 29 20 77 69  t fdatasync() wi
1b2e0 6c 6c 20 6e 6f 74 20 66 6c 75 73 68 20 74 68 65  ll not flush the
1b2f0 0a 2a 2a 20 69 6e 6f 64 65 20 69 66 20 74 68 65  .** inode if the
1b300 20 6d 74 69 6d 65 20 6f 72 20 6f 77 6e 65 72 20   mtime or owner 
1b310 6f 72 20 6f 74 68 65 72 20 69 6e 6f 64 65 20 61  or other inode a
1b320 74 74 72 69 62 75 74 65 73 20 68 61 76 65 20 63  ttributes have c
1b330 68 61 6e 67 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e  hanged..** We on
1b340 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 74 68  ly care about th
1b350 65 20 66 69 6c 65 20 73 69 7a 65 2c 20 6e 6f 74  e file size, not
1b360 20 74 68 65 20 6f 74 68 65 72 20 66 69 6c 65 20   the other file 
1b370 61 74 74 72 69 62 75 74 65 73 2c 20 73 6f 0a 2a  attributes, so.*
1b380 2a 20 61 73 20 66 61 72 20 61 73 20 53 51 4c 69  * as far as SQLi
1b390 74 65 20 69 73 20 63 6f 6e 63 65 72 6e 65 64 2c  te is concerned,
1b3a0 20 61 6e 20 66 64 61 74 61 73 79 6e 63 28 29 20   an fdatasync() 
1b3b0 69 73 20 61 6c 77 61 79 73 20 61 64 65 71 75 61  is always adequa
1b3c0 74 65 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20 61 6c  te..** So, we al
1b3d0 77 61 79 73 20 75 73 65 20 66 64 61 74 61 73 79  ways use fdatasy
1b3e0 6e 63 28 29 20 69 66 20 69 74 20 69 73 20 61 76  nc() if it is av
1b3f0 61 69 6c 61 62 6c 65 2c 20 72 65 67 61 72 64 6c  ailable, regardl
1b400 65 73 73 20 6f 66 0a 2a 2a 20 74 68 65 20 76 61  ess of.** the va
1b410 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 4f  lue of the dataO
1b420 6e 6c 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61  nly flag..*/.sta
1b430 74 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79  tic int full_fsy
1b440 6e 63 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 66  nc(int fd, int f
1b450 75 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61 74  ullSync, int dat
1b460 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63  aOnly){.  int rc
1b470 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;..  /* The foll
1b480 6f 77 69 6e 67 20 22 69 66 64 65 66 2f 65 6c 69  owing "ifdef/eli
1b490 66 2f 65 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68  f/else/" block h
1b4a0 61 73 20 74 68 65 20 73 61 6d 65 20 73 74 72 75  as the same stru
1b4b0 63 74 75 72 65 20 61 73 0a 20 20 2a 2a 20 74 68  cture as.  ** th
1b4c0 65 20 6f 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20  e one below. It 
1b4d0 69 73 20 72 65 70 6c 69 63 61 74 65 64 20 68 65  is replicated he
1b4e0 72 65 20 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f  re solely to avo
1b4f0 69 64 20 63 6c 75 74 74 65 72 69 6e 67 20 0a 20  id cluttering . 
1b500 20 2a 2a 20 75 70 20 74 68 65 20 72 65 61 6c 20   ** up the real 
1b510 63 6f 64 65 20 77 69 74 68 20 74 68 65 20 55 4e  code with the UN
1b520 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 29  USED_PARAMETER()
1b530 20 6d 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69   macros..  */.#i
1b540 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  fdef SQLITE_NO_S
1b550 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  YNC.  UNUSED_PAR
1b560 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e  AMETER(fd);.  UN
1b570 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
1b580 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53  ullSync);.  UNUS
1b590 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74  ED_PARAMETER(dat
1b5a0 61 4f 6e 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41  aOnly);.#elif HA
1b5b0 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55  VE_FULLFSYNC.  U
1b5c0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1b5d0 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65  dataOnly);.#else
1b5e0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1b5f0 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20  TER(fullSync);. 
1b600 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1b610 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e  R(dataOnly);.#en
1b620 64 69 66 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64  dif..  /* Record
1b630 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
1b640 69 6d 65 73 20 74 68 61 74 20 77 65 20 64 6f 20  imes that we do 
1b650 61 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29  a normal fsync()
1b660 20 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53   and .  ** FULLS
1b670 59 4e 43 2e 20 20 54 68 69 73 20 69 73 20 75 73  YNC.  This is us
1b680 65 64 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  ed during testin
1b690 67 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  g to verify that
1b6a0 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a   this procedure.
1b6b0 20 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 64    ** gets called
1b6c0 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63   with the correc
1b6d0 74 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a  t arguments..  *
1b6e0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1b6f0 54 45 53 54 0a 20 20 69 66 28 20 66 75 6c 6c 53  TEST.  if( fullS
1b700 79 6e 63 20 29 20 73 71 6c 69 74 65 33 5f 66 75  ync ) sqlite3_fu
1b710 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a  llsync_count++;.
1b720 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63    sqlite3_sync_c
1b730 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a  ount++;.#endif..
1b740 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69    /* If we compi
1b750 6c 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c  led with the SQL
1b760 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67  ITE_NO_SYNC flag
1b770 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69  , then syncing i
1b780 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 2e 20  s a.  ** no-op. 
1b790 20 42 75 74 20 67 6f 20 61 68 65 61 64 20 61 6e   But go ahead an
1b7a0 64 20 63 61 6c 6c 20 66 73 74 61 74 28 29 20 74  d call fstat() t
1b7b0 6f 20 76 61 6c 69 64 61 74 65 20 74 68 65 20 66  o validate the f
1b7c0 69 6c 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70  ile.  ** descrip
1b7d0 74 6f 72 20 61 73 20 77 65 20 6e 65 65 64 20 61  tor as we need a
1b7e0 20 6d 65 74 68 6f 64 20 74 6f 20 70 72 6f 76 6f   method to provo
1b7f0 6b 65 20 61 20 66 61 69 6c 75 72 65 20 64 75 72  ke a failure dur
1b800 69 6e 67 0a 20 20 2a 2a 20 63 6f 76 65 72 61 74  ing.  ** coverat
1b810 65 20 74 65 73 74 69 6e 67 2e 0a 20 20 2a 2f 0a  e testing..  */.
1b820 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  #ifdef SQLITE_NO
1b830 5f 53 59 4e 43 0a 20 20 7b 0a 20 20 20 20 73 74  _SYNC.  {.    st
1b840 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
1b850 20 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28     rc = osFstat(
1b860 66 64 2c 20 26 62 75 66 29 3b 0a 20 20 7d 0a 23  fd, &buf);.  }.#
1b870 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53  elif HAVE_FULLFS
1b880 59 4e 43 0a 20 20 69 66 28 20 66 75 6c 6c 53 79  YNC.  if( fullSy
1b890 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f  nc ){.    rc = o
1b8a0 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c  sFcntl(fd, F_FUL
1b8b0 4c 46 53 59 4e 43 2c 20 30 29 3b 0a 20 20 7d 65  LFSYNC, 0);.  }e
1b8c0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b  lse{.    rc = 1;
1b8d0 0a 20 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65  .  }.  /* If the
1b8e0 20 46 55 4c 4c 46 53 59 4e 43 20 66 61 69 6c 65   FULLFSYNC faile
1b8f0 64 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  d, fall back to 
1b900 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 20 66 73  attempting an fs
1b910 79 6e 63 28 29 2e 0a 20 20 2a 2a 20 49 74 20 73  ync()..  ** It s
1b920 68 6f 75 6c 64 6e 27 74 20 62 65 20 70 6f 73 73  houldn't be poss
1b930 69 62 6c 65 20 66 6f 72 20 66 75 6c 6c 66 73 79  ible for fullfsy
1b940 6e 63 20 74 6f 20 66 61 69 6c 20 6f 6e 20 74 68  nc to fail on th
1b950 65 20 6c 6f 63 61 6c 20 0a 20 20 2a 2a 20 66 69  e local .  ** fi
1b960 6c 65 20 73 79 73 74 65 6d 20 28 6f 6e 20 4f 53  le system (on OS
1b970 58 29 2c 20 73 6f 20 66 61 69 6c 75 72 65 20 69  X), so failure i
1b980 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 46 55  ndicates that FU
1b990 4c 4c 46 53 59 4e 43 0a 20 20 2a 2a 20 69 73 6e  LLFSYNC.  ** isn
1b9a0 27 74 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72  't supported for
1b9b0 20 74 68 69 73 20 66 69 6c 65 20 73 79 73 74 65   this file syste
1b9c0 6d 2e 20 53 6f 2c 20 61 74 74 65 6d 70 74 20 61  m. So, attempt a
1b9d0 6e 20 66 73 79 6e 63 20 0a 20 20 2a 2a 20 61 6e  n fsync .  ** an
1b9e0 64 20 28 66 6f 72 20 6e 6f 77 29 20 69 67 6e 6f  d (for now) igno
1b9f0 72 65 20 74 68 65 20 6f 76 65 72 68 65 61 64 20  re the overhead 
1ba00 6f 66 20 61 20 73 75 70 65 72 66 6c 75 6f 75 73  of a superfluous
1ba10 20 66 63 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a 20   fcntl call.  . 
1ba20 20 2a 2a 20 49 74 27 64 20 62 65 20 62 65 74 74   ** It'd be bett
1ba30 65 72 20 74 6f 20 64 65 74 65 63 74 20 66 75 6c  er to detect ful
1ba40 6c 66 73 79 6e 63 20 73 75 70 70 6f 72 74 20 6f  lfsync support o
1ba50 6e 63 65 20 61 6e 64 20 61 76 6f 69 64 20 0a 20  nce and avoid . 
1ba60 20 2a 2a 20 74 68 65 20 66 63 6e 74 6c 20 63 61   ** the fcntl ca
1ba70 6c 6c 20 65 76 65 72 79 20 74 69 6d 65 20 73 79  ll every time sy
1ba80 6e 63 20 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20  nc is called..  
1ba90 2a 2f 0a 20 20 69 66 28 20 72 63 20 29 20 72 63  */.  if( rc ) rc
1baa0 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23   = fsync(fd);..#
1bab0 65 6c 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  elif defined(__A
1bac0 50 50 4c 45 5f 5f 29 0a 20 20 2f 2a 20 66 64 61  PPLE__).  /* fda
1bad0 74 61 73 79 6e 63 28 29 20 6f 6e 20 48 46 53 2b  tasync() on HFS+
1bae0 20 64 6f 65 73 6e 27 74 20 79 65 74 20 66 6c 75   doesn't yet flu
1baf0 73 68 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  sh the file size
1bb00 20 69 66 20 69 74 20 63 68 61 6e 67 65 64 20 63   if it changed c
1bb10 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 73 6f  orrectly.  ** so
1bb20 20 63 75 72 72 65 6e 74 6c 79 20 77 65 20 64 65   currently we de
1bb30 66 61 75 6c 74 20 74 6f 20 74 68 65 20 6d 61 63  fault to the mac
1bb40 72 6f 20 74 68 61 74 20 72 65 64 65 66 69 6e 65  ro that redefine
1bb50 73 20 66 64 61 74 61 73 79 6e 63 20 74 6f 20 66  s fdatasync to f
1bb60 73 79 6e 63 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  sync.  */.  rc =
1bb70 20 66 73 79 6e 63 28 66 64 29 3b 0a 23 65 6c 73   fsync(fd);.#els
1bb80 65 20 0a 20 20 72 63 20 3d 20 66 64 61 74 61 73  e .  rc = fdatas
1bb90 79 6e 63 28 66 64 29 3b 0a 23 69 66 20 4f 53 5f  ync(fd);.#if OS_
1bba0 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63  VXWORKS.  if( rc
1bbb0 3d 3d 2d 31 20 26 26 20 65 72 72 6e 6f 3d 3d 45  ==-1 && errno==E
1bbc0 4e 4f 54 53 55 50 20 29 7b 0a 20 20 20 20 72 63  NOTSUP ){.    rc
1bbd0 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 20 20   = fsync(fd);.  
1bbe0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56  }.#endif /* OS_V
1bbf0 58 57 4f 52 4b 53 20 2a 2f 0a 23 65 6e 64 69 66  XWORKS */.#endif
1bc00 20 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45   /* ifdef SQLITE
1bc10 5f 4e 4f 5f 53 59 4e 43 20 65 6c 69 66 20 48 41  _NO_SYNC elif HA
1bc20 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a  VE_FULLFSYNC */.
1bc30 0a 20 20 69 66 28 20 4f 53 5f 56 58 57 4f 52 4b  .  if( OS_VXWORK
1bc40 53 20 26 26 20 72 63 21 3d 20 2d 31 20 29 7b 0a  S && rc!= -1 ){.
1bc50 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 7d 0a      rc = 0;.  }.
1bc60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1bc70 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c  /*.** Open a fil
1bc80 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
1bc90 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f  the directory co
1bca0 6e 74 61 69 6e 69 6e 67 20 66 69 6c 65 20 7a 46  ntaining file zF
1bcb0 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20 73  ilename..** If s
1bcc0 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 46 64 20  uccessful, *pFd 
1bcd0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 70  is set to the op
1bce0 65 6e 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  ened file descri
1bcf0 70 74 6f 72 20 61 6e 64 0a 2a 2a 20 53 51 4c 49  ptor and.** SQLI
1bd00 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1bd10 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  d. If an error o
1bd20 63 63 75 72 73 2c 20 65 69 74 68 65 72 20 53 51  ccurs, either SQ
1bd30 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72  LITE_NOMEM.** or
1bd40 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
1bd50 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
1bd60 20 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f 20   *pFd is set to 
1bd70 61 6e 20 75 6e 64 65 66 69 6e 65 64 0a 2a 2a 20  an undefined.** 
1bd80 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  value..**.** The
1bd90 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20   directory file 
1bda0 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 75 73  descriptor is us
1bdb0 65 64 20 66 6f 72 20 6f 6e 6c 79 20 6f 6e 65 20  ed for only one 
1bdc0 74 68 69 6e 67 20 2d 20 74 6f 0a 2a 2a 20 66 73  thing - to.** fs
1bdd0 79 6e 63 28 29 20 61 20 64 69 72 65 63 74 6f 72  ync() a director
1bde0 79 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 66  y to make sure f
1bdf0 69 6c 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64  ile creation and
1be00 20 64 65 6c 65 74 69 6f 6e 20 65 76 65 6e 74 73   deletion events
1be10 0a 2a 2a 20 61 72 65 20 66 6c 75 73 68 65 64 20  .** are flushed 
1be20 74 6f 20 64 69 73 6b 2e 20 20 53 75 63 68 20 66  to disk.  Such f
1be30 73 79 6e 63 73 20 61 72 65 20 6e 6f 74 20 6e 65  syncs are not ne
1be40 65 64 65 64 20 6f 6e 20 6e 65 77 65 72 0a 2a 2a  eded on newer.**
1be50 20 6a 6f 75 72 6e 61 6c 69 6e 67 20 66 69 6c 65   journaling file
1be60 73 79 73 74 65 6d 73 2c 20 62 75 74 20 61 72 65  systems, but are
1be70 20 72 65 71 75 69 72 65 64 20 6f 6e 20 6f 6c 64   required on old
1be80 65 72 20 66 69 6c 65 73 79 73 74 65 6d 73 2e 0a  er filesystems..
1be90 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1bea0 6e 65 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69  ne can be overri
1beb0 64 64 65 6e 20 75 73 69 6e 67 20 74 68 65 20 78  dden using the x
1bec0 53 65 74 53 79 73 43 61 6c 6c 20 69 6e 74 65 72  SetSysCall inter
1bed0 66 61 63 65 2e 0a 2a 2a 20 54 68 65 20 61 62 69  face..** The abi
1bee0 6c 69 74 79 20 74 6f 20 6f 76 65 72 72 69 64 65  lity to override
1bef0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
1bf00 73 20 61 64 64 65 64 20 69 6e 20 73 75 70 70 6f  s added in suppo
1bf10 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 72  rt of the.** chr
1bf20 6f 6d 69 75 6d 20 73 61 6e 64 62 6f 78 2e 20 20  omium sandbox.  
1bf30 4f 70 65 6e 69 6e 67 20 61 20 64 69 72 65 63 74  Opening a direct
1bf40 6f 72 79 20 69 73 20 61 20 73 65 63 75 72 69 74  ory is a securit
1bf50 79 20 72 69 73 6b 20 28 77 65 20 61 72 65 0a 2a  y risk (we are.*
1bf60 2a 20 74 6f 6c 64 29 20 73 6f 20 6d 61 6b 69 6e  * told) so makin
1bf70 67 20 69 74 20 6f 76 65 72 72 69 64 65 61 62 6c  g it overrideabl
1bf80 65 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 68 72  e allows the chr
1bf90 6f 6d 69 75 6d 20 73 61 6e 64 62 6f 78 20 74 6f  omium sandbox to
1bfa0 0a 2a 2a 20 72 65 70 6c 61 63 65 20 74 68 69 73  .** replace this
1bfb0 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20   routine with a 
1bfc0 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20  harmless no-op. 
1bfd0 20 54 6f 20 6d 61 6b 65 20 74 68 69 73 20 72 6f   To make this ro
1bfe0 75 74 69 6e 65 0a 2a 2a 20 61 20 6e 6f 2d 6f 70  utine.** a no-op
1bff0 2c 20 72 65 70 6c 61 63 65 20 69 74 20 77 69 74  , replace it wit
1c000 68 20 61 20 73 74 75 62 20 74 68 61 74 20 72 65  h a stub that re
1c010 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20  turns SQLITE_OK 
1c020 62 75 74 20 6c 65 61 76 65 73 0a 2a 2a 20 2a 70  but leaves.** *p
1c030 46 64 20 73 65 74 20 74 6f 20 61 20 6e 65 67 61  Fd set to a nega
1c040 74 69 76 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a  tive number..**.
1c050 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20  ** If SQLITE_OK 
1c060 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
1c070 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f   caller is respo
1c080 6e 73 69 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69  nsible for closi
1c090 6e 67 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64  ng.** the file d
1c0a0 65 73 63 72 69 70 74 6f 72 20 2a 70 46 64 20 75  escriptor *pFd u
1c0b0 73 69 6e 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f  sing close()..*/
1c0c0 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e  .static int open
1c0d0 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20  Directory(const 
1c0e0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
1c0f0 20 69 6e 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e   int *pFd){.  in
1c100 74 20 69 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d  t ii;.  int fd =
1c110 20 2d 31 3b 0a 20 20 63 68 61 72 20 7a 44 69 72   -1;.  char zDir
1c120 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d  name[MAX_PATHNAM
1c130 45 2b 31 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33  E+1];..  sqlite3
1c140 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41  _snprintf(MAX_PA
1c150 54 48 4e 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65  THNAME, zDirname
1c160 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d  , "%s", zFilenam
1c170 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 28 69 6e  e);.  for(ii=(in
1c180 74 29 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d  t)strlen(zDirnam
1c190 65 29 3b 20 69 69 3e 31 20 26 26 20 7a 44 69 72  e); ii>1 && zDir
1c1a0 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69  name[ii]!='/'; i
1c1b0 69 2d 2d 29 3b 0a 20 20 69 66 28 20 69 69 3e 31  i--);.  if( ii>1
1c1c0 20 29 7b 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65   ){.    zDirname
1c1d0 5b 69 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  [ii] = '\0';.   
1c1e0 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
1c1f0 6e 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44  n(zDirname, O_RD
1c200 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30  ONLY|O_BINARY, 0
1c210 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3e 3d 30  );.    if( fd>=0
1c220 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   ){.      OSTRAC
1c230 45 28 28 22 4f 50 45 4e 44 49 52 20 25 2d 33 64  E(("OPENDIR %-3d
1c240 20 25 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72   %s\n", fd, zDir
1c250 6e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20  name));.    }.  
1c260 7d 0a 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20  }.  *pFd = fd;. 
1c270 20 69 66 28 20 66 64 3e 3d 30 20 29 20 72 65 74   if( fd>=0 ) ret
1c280 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1c290 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45   return unixLogE
1c2a0 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
1c2b0 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e  OPEN_BKPT, "open
1c2c0 44 69 72 65 63 74 6f 72 79 22 2c 20 7a 44 69 72  Directory", zDir
1c2d0 6e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  name);.}../*.** 
1c2e0 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72  Make sure all wr
1c2f0 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63  ites to a partic
1c300 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f  ular file are co
1c310 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e  mmitted to disk.
1c320 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e  .**.** If dataOn
1c330 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68 20  ly==0 then both 
1c340 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20  the file itself 
1c350 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74 61  and its metadata
1c360 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20   (file.** size, 
1c370 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74 63  access time, etc
1c380 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20 49  ) are synced.  I
1c390 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68  f dataOnly!=0 th
1c3a0 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66  en only the.** f
1c3b0 69 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e 63  ile data is sync
1c3c0 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20  ed..**.** Under 
1c3d0 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20  Unix, also make 
1c3e0 73 75 72 65 20 74 68 61 74 20 74 68 65 20 64 69  sure that the di
1c3f0 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f  rectory entry fo
1c400 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61  r the file.** ha
1c410 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 62  s been created b
1c420 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65 20  y fsync-ing the 
1c430 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63  directory that c
1c440 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c 65  ontains the file
1c450 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f  ..** If we do no
1c460 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77 65  t do this and we
1c470 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f 77   encounter a pow
1c480 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  er failure, the 
1c490 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74  directory.** ent
1c4a0 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  ry for the journ
1c4b0 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69  al might not exi
1c4c0 73 74 20 61 66 74 65 72 20 77 65 20 72 65 62 6f  st after we rebo
1c4d0 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a  ot.  The next.**
1c4e0 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65 73   SQLite to acces
1c4f0 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20  s the file will 
1c500 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74 68  not know that th
1c510 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  e journal exists
1c520 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65   (because.** the
1c530 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79   directory entry
1c540 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
1c550 20 77 61 73 20 6e 65 76 65 72 20 63 72 65 61 74   was never creat
1c560 65 64 29 20 61 6e 64 20 74 68 65 20 74 72 61 6e  ed) and the tran
1c570 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20  saction.** will 
1c580 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20  not roll back - 
1c590 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e 67  possibly leading
1c5a0 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   to database cor
1c5b0 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
1c5c0 69 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63 28  ic int unixSync(
1c5d0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1c5e0 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
1c5f0 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46 69  int rc;.  unixFi
1c600 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
1c610 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69 6e  xFile*)id;..  in
1c620 74 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20 28  t isDataOnly = (
1c630 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 53 59 4e  flags&SQLITE_SYN
1c640 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20 69  C_DATAONLY);.  i
1c650 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d 20  nt isFullsync = 
1c660 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
1c670 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a  LITE_SYNC_FULL;.
1c680 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
1c690 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53   one of SQLITE_S
1c6a0 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55  YNC_NORMAL or FU
1c6b0 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f  LL was passed */
1c6c0 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61 67 73  .  assert((flags
1c6d0 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
1c6e0 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20  YNC_NORMAL.     
1c6f0 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29   || (flags&0x0F)
1c700 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
1c710 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e  LL.  );..  /* Un
1c720 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73  ix cannot, but s
1c730 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20  ome systems may 
1c740 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
1c750 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68  LL from here. Th
1c760 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20  is.  ** line is 
1c770 74 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f 69  to test that doi
1c780 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63  ng so does not c
1c790 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d  ause any problem
1c7a0 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  s..  */.  Simula
1c7b0 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28  teDiskfullError(
1c7c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
1c7d0 55 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  ULL );..  assert
1c7e0 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
1c7f0 52 41 43 45 28 28 22 53 59 4e 43 20 20 20 20 25  RACE(("SYNC    %
1c800 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  -3d\n", pFile->h
1c810 29 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f  ));.  rc = full_
1c820 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20  fsync(pFile->h, 
1c830 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61  isFullsync, isDa
1c840 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c  taOnly);.  Simul
1c850 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31  ateIOError( rc=1
1c860 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a   );.  if( rc ){.
1c870 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
1c880 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29  no(pFile, errno)
1c890 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69  ;.    return uni
1c8a0 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
1c8b0 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20 22 66  _IOERR_FSYNC, "f
1c8c0 75 6c 6c 5f 66 73 79 6e 63 22 2c 20 70 46 69 6c  ull_fsync", pFil
1c8d0 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 0a  e->zPath);.  }..
1c8e0 20 20 2f 2a 20 41 6c 73 6f 20 66 73 79 6e 63 20    /* Also fsync 
1c8f0 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f  the directory co
1c900 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 66 69 6c  ntaining the fil
1c910 65 20 69 66 20 74 68 65 20 44 49 52 53 59 4e 43  e if the DIRSYNC
1c920 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20 73 65   flag.  ** is se
1c930 74 2e 20 20 54 68 69 73 20 69 73 20 61 20 6f 6e  t.  This is a on
1c940 65 2d 74 69 6d 65 20 6f 63 63 75 72 72 65 6e 63  e-time occurrenc
1c950 65 2e 20 20 4d 61 6e 79 20 73 79 73 74 65 6d 73  e.  Many systems
1c960 20 28 65 78 61 6d 70 6c 65 73 3a 20 41 49 58 29   (examples: AIX)
1c970 0a 20 20 2a 2a 20 61 72 65 20 75 6e 61 62 6c 65  .  ** are unable
1c980 20 74 6f 20 66 73 79 6e 63 20 61 20 64 69 72 65   to fsync a dire
1c990 63 74 6f 72 79 2c 20 73 6f 20 69 67 6e 6f 72 65  ctory, so ignore
1c9a0 20 65 72 72 6f 72 73 20 6f 6e 20 74 68 65 20 66   errors on the f
1c9b0 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sync..  */.  if(
1c9c0 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
1c9d0 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 49 52  s & UNIXFILE_DIR
1c9e0 53 59 4e 43 20 29 7b 0a 20 20 20 20 69 6e 74 20  SYNC ){.    int 
1c9f0 64 69 72 66 64 3b 0a 20 20 20 20 4f 53 54 52 41  dirfd;.    OSTRA
1ca00 43 45 28 28 22 44 49 52 53 59 4e 43 20 25 73 20  CE(("DIRSYNC %s 
1ca10 28 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e 63 3d  (have_fullfsync=
1ca20 25 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64 29 5c  %d fullsync=%d)\
1ca30 6e 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  n", pFile->zPath
1ca40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 48 41  ,.            HA
1ca50 56 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 69 73  VE_FULLFSYNC, is
1ca60 46 75 6c 6c 73 79 6e 63 29 29 3b 0a 20 20 20 20  Fullsync));.    
1ca70 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63  rc = osOpenDirec
1ca80 74 6f 72 79 28 70 46 69 6c 65 2d 3e 7a 50 61 74  tory(pFile->zPat
1ca90 68 2c 20 26 64 69 72 66 64 29 3b 0a 20 20 20 20  h, &dirfd);.    
1caa0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1cab0 4b 20 29 7b 0a 20 20 20 20 20 20 66 75 6c 6c 5f  K ){.      full_
1cac0 66 73 79 6e 63 28 64 69 72 66 64 2c 20 30 2c 20  fsync(dirfd, 0, 
1cad0 30 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73 74  0);.      robust
1cae0 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 64 69  _close(pFile, di
1caf0 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  rfd, __LINE__);.
1cb00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1cb10 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
1cb20 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 3b 0a  ITE_CANTOPEN );.
1cb30 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1cb40 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1cb50 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
1cb60 20 26 3d 20 7e 55 4e 49 58 46 49 4c 45 5f 44 49   &= ~UNIXFILE_DI
1cb70 52 53 59 4e 43 3b 0a 20 20 7d 0a 20 20 72 65 74  RSYNC;.  }.  ret
1cb80 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1cb90 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65   Truncate an ope
1cba0 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63  n file to a spec
1cbb0 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74  ified size.*/.st
1cbc0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 54 72 75  atic int unixTru
1cbd0 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69  ncate(sqlite3_fi
1cbe0 6c 65 20 2a 69 64 2c 20 69 36 34 20 6e 42 79 74  le *id, i64 nByt
1cbf0 65 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  e){.  unixFile *
1cc00 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
1cc10 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63  e *)id;.  int rc
1cc20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ;.  assert( pFil
1cc30 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  e );.  SimulateI
1cc40 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
1cc50 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
1cc60 43 41 54 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  CATE );..  /* If
1cc70 20 74 68 65 20 75 73 65 72 20 68 61 73 20 63 6f   the user has co
1cc80 6e 66 69 67 75 72 65 64 20 61 20 63 68 75 6e 6b  nfigured a chunk
1cc90 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 66  -size for this f
1cca0 69 6c 65 2c 20 74 72 75 6e 63 61 74 65 20 74 68  ile, truncate th
1ccb0 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74  e.  ** file so t
1ccc0 68 61 74 20 69 74 20 63 6f 6e 73 69 73 74 73 20  hat it consists 
1ccd0 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75  of an integer nu
1cce0 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b 73 20 28  mber of chunks (
1ccf0 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63  i.e. the.  ** ac
1cd00 74 75 61 6c 20 66 69 6c 65 20 73 69 7a 65 20 61  tual file size a
1cd10 66 74 65 72 20 74 68 65 20 6f 70 65 72 61 74 69  fter the operati
1cd20 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72 67 65 72  on may be larger
1cd30 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73   than the reques
1cd40 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a  ted.  ** size)..
1cd50 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
1cd60 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20  ->szChunk>0 ){. 
1cd70 20 20 20 6e 42 79 74 65 20 3d 20 28 28 6e 42 79     nByte = ((nBy
1cd80 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68  te + pFile->szCh
1cd90 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e  unk - 1)/pFile->
1cda0 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65  szChunk) * pFile
1cdb0 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a  ->szChunk;.  }..
1cdc0 20 20 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 74    rc = robust_ft
1cdd0 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68  runcate(pFile->h
1cde0 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20  , nByte);.  if( 
1cdf0 72 63 20 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c  rc ){.    storeL
1ce00 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
1ce10 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74 75  errno);.    retu
1ce20 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  rn unixLogError(
1ce30 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
1ce40 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74  NCATE, "ftruncat
1ce50 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  e", pFile->zPath
1ce60 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64  );.  }else{.#ifd
1ce70 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1ce80 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
1ce90 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20   doing a normal 
1cea0 77 72 69 74 65 20 74 6f 20 61 20 64 61 74 61 62  write to a datab
1ceb0 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f 70 70  ase file (as opp
1cec0 6f 73 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 64  osed to.    ** d
1ced0 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  oing a hot-journ
1cee0 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61  al rollback or a
1cef0 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66   write to some f
1cf00 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ile other than a
1cf10 0a 20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64  .    ** normal d
1cf20 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 61 6e  atabase file) an
1cf30 64 20 77 65 20 74 72 75 6e 63 61 74 65 20 74 68  d we truncate th
1cf40 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c  e file to zero l
1cf50 65 6e 67 74 68 2c 0a 20 20 20 20 2a 2a 20 74 68  ength,.    ** th
1cf60 61 74 20 65 66 66 65 63 74 69 76 65 6c 79 20 75  at effectively u
1cf70 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e 67  pdates the chang
1cf80 65 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73  e counter.  This
1cf90 20 6d 69 67 68 74 20 68 61 70 70 65 6e 0a 20 20   might happen.  
1cfa0 20 20 2a 2a 20 77 68 65 6e 20 72 65 73 74 6f 72    ** when restor
1cfb0 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20 75  ing a database u
1cfc0 73 69 6e 67 20 74 68 65 20 62 61 63 6b 75 70 20  sing the backup 
1cfd0 41 50 49 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d  API from a zero-
1cfe0 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 73 6f  length.    ** so
1cff0 75 72 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  urce..    */.   
1d000 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f   if( pFile->inNo
1d010 72 6d 61 6c 57 72 69 74 65 20 26 26 20 6e 42 79  rmalWrite && nBy
1d020 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  te==0 ){.      p
1d030 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43  File->transCntrC
1d040 68 6e 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23  hng = 1;.    }.#
1d050 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54  endif..#if SQLIT
1d060 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
1d070 30 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  0.    /* If the 
1d080 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20 74 72  file was just tr
1d090 75 6e 63 61 74 65 64 20 74 6f 20 61 20 73 69 7a  uncated to a siz
1d0a0 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  e smaller than t
1d0b0 68 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 20  he currently.   
1d0c0 20 2a 2a 20 6d 61 70 70 65 64 20 72 65 67 69 6f   ** mapped regio
1d0d0 6e 2c 20 72 65 64 75 63 65 20 74 68 65 20 65 66  n, reduce the ef
1d0e0 66 65 63 74 69 76 65 20 6d 61 70 70 69 6e 67 20  fective mapping 
1d0f0 73 69 7a 65 20 61 73 20 77 65 6c 6c 2e 20 53 51  size as well. SQ
1d100 4c 69 74 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  Lite will.    **
1d110 20 75 73 65 20 72 65 61 64 28 29 20 61 6e 64 20   use read() and 
1d120 77 72 69 74 65 28 29 20 74 6f 20 61 63 63 65 73  write() to acces
1d130 73 20 64 61 74 61 20 62 65 79 6f 6e 64 20 74 68  s data beyond th
1d140 69 73 20 70 6f 69 6e 74 20 66 72 6f 6d 20 6e 6f  is point from no
1d150 77 20 6f 6e 2e 20 20 0a 20 20 20 20 2a 2f 0a 20  w on.  .    */. 
1d160 20 20 20 69 66 28 20 6e 42 79 74 65 3c 70 46 69     if( nByte<pFi
1d170 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  le->mmapSize ){.
1d180 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61        pFile->mma
1d190 70 53 69 7a 65 20 3d 20 6e 42 79 74 65 3b 0a 20  pSize = nByte;. 
1d1a0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1d1b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1d1c0 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  K;.  }.}../*.** 
1d1d0 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75  Determine the cu
1d1e0 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20  rrent size of a 
1d1f0 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f  file in bytes.*/
1d200 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1d210 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33  FileSize(sqlite3
1d220 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a  _file *id, i64 *
1d230 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63  pSize){.  int rc
1d240 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  ;.  struct stat 
1d250 62 75 66 3b 0a 20 20 61 73 73 65 72 74 28 20 69  buf;.  assert( i
1d260 64 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73  d );.  rc = osFs
1d270 74 61 74 28 28 28 75 6e 69 78 46 69 6c 65 2a 29  tat(((unixFile*)
1d280 69 64 29 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20  id)->h, &buf);. 
1d290 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1d2a0 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20  ( rc=1 );.  if( 
1d2b0 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 74 6f  rc!=0 ){.    sto
1d2c0 72 65 4c 61 73 74 45 72 72 6e 6f 28 28 75 6e 69  reLastErrno((uni
1d2d0 78 46 69 6c 65 2a 29 69 64 2c 20 65 72 72 6e 6f  xFile*)id, errno
1d2e0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
1d2f0 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
1d300 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d  ;.  }.  *pSize =
1d310 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a 20   buf.st_size;.. 
1d320 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67   /* When opening
1d330 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20 64 61 74   a zero-size dat
1d340 61 62 61 73 65 2c 20 74 68 65 20 66 69 6e 64 49  abase, the findI
1d350 6e 6f 64 65 49 6e 66 6f 28 29 20 70 72 6f 63 65  nodeInfo() proce
1d360 64 75 72 65 0a 20 20 2a 2a 20 77 72 69 74 65 73  dure.  ** writes
1d370 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69   a single byte i
1d380 6e 74 6f 20 74 68 61 74 20 66 69 6c 65 20 69 6e  nto that file in
1d390 20 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b 20 61   order to work a
1d3a0 72 6f 75 6e 64 20 61 20 62 75 67 0a 20 20 2a 2a  round a bug.  **
1d3b0 20 69 6e 20 74 68 65 20 4f 53 2d 58 20 6d 73 64   in the OS-X msd
1d3c0 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2e 20 20  os filesystem.  
1d3d0 49 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69  In order to avoi
1d3e0 64 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20  d problems with 
1d3f0 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61 79 65 72  upper.  ** layer
1d400 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65  s, we need to re
1d410 70 6f 72 74 20 74 68 69 73 20 66 69 6c 65 20 73  port this file s
1d420 69 7a 65 20 61 73 20 7a 65 72 6f 20 65 76 65 6e  ize as zero even
1d430 20 74 68 6f 75 67 68 20 69 74 20 69 73 0a 20 20   though it is.  
1d440 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20 20 20 54  ** really 1.   T
1d450 69 63 6b 65 74 20 23 33 32 36 30 2e 0a 20 20 2a  icket #3260..  *
1d460 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a 65 3d 3d  /.  if( *pSize==
1d470 31 20 29 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a  1 ) *pSize = 0;.
1d480 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
1d490 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c  E_OK;.}..#if SQL
1d4a0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1d4b0 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
1d4c0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f  ned(__APPLE__)./
1d4d0 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20 66 6f 72  *.** Handler for
1d4e0 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 66   proxy-locking f
1d4f0 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76 65 72 62  ile-control verb
1d500 73 2e 20 20 44 65 66 69 6e 65 64 20 62 65 6c 6f  s.  Defined belo
1d510 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70 72 6f 78  w in the.** prox
1d520 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 64 69 76  ying locking div
1d530 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ision..*/.static
1d540 20 69 6e 74 20 70 72 6f 78 79 46 69 6c 65 43 6f   int proxyFileCo
1d550 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69  ntrol(sqlite3_fi
1d560 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b 0a  le*,int,void*);.
1d570 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20 54  #endif../* .** T
1d580 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1d590 63 61 6c 6c 65 64 20 74 6f 20 68 61 6e 64 6c 65  called to handle
1d5a0 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54   the SQLITE_FCNT
1d5b0 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 0a 2a 2a 20  L_SIZE_HINT .** 
1d5c0 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6f 70 65  file-control ope
1d5d0 72 61 74 69 6f 6e 2e 20 20 45 6e 6c 61 72 67 65  ration.  Enlarge
1d5e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
1d5f0 20 6e 42 79 74 65 73 20 69 6e 20 73 69 7a 65 0a   nBytes in size.
1d600 2a 2a 20 28 72 6f 75 6e 64 65 64 20 75 70 20 74  ** (rounded up t
1d610 6f 20 74 68 65 20 6e 65 78 74 20 63 68 75 6e 6b  o the next chunk
1d620 2d 73 69 7a 65 29 2e 20 20 49 66 20 74 68 65 20  -size).  If the 
1d630 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65  database is alre
1d640 61 64 79 0a 2a 2a 20 6e 42 79 74 65 73 20 6f 72  ady.** nBytes or
1d650 20 6c 61 72 67 65 72 2c 20 74 68 69 73 20 72 6f   larger, this ro
1d660 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
1d670 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d680 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 75 6e  fcntlSizeHint(un
1d690 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69  ixFile *pFile, i
1d6a0 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 66 28  64 nByte){.  if(
1d6b0 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e   pFile->szChunk>
1d6c0 30 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 53 69  0 ){.    i64 nSi
1d6d0 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
1d6e0 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69 72         /* Requir
1d6f0 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a  ed file size */.
1d700 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
1d710 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  buf;            
1d720 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 68 6f 6c    /* Used to hol
1d730 64 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20  d return values 
1d740 6f 66 20 66 73 74 61 74 28 29 20 2a 2f 0a 20 20  of fstat() */.  
1d750 20 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74 61   .    if( osFsta
1d760 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66  t(pFile->h, &buf
1d770 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
1d780 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  n SQLITE_IOERR_F
1d790 53 54 41 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  STAT;.    }..   
1d7a0 20 6e 53 69 7a 65 20 3d 20 28 28 6e 42 79 74 65   nSize = ((nByte
1d7b0 2b 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 2d  +pFile->szChunk-
1d7c0 31 29 20 2f 20 70 46 69 6c 65 2d 3e 73 7a 43 68  1) / pFile->szCh
1d7d0 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a  unk) * pFile->sz
1d7e0 43 68 75 6e 6b 3b 0a 20 20 20 20 69 66 28 20 6e  Chunk;.    if( n
1d7f0 53 69 7a 65 3e 28 69 36 34 29 62 75 66 2e 73 74  Size>(i64)buf.st
1d800 5f 73 69 7a 65 20 29 7b 0a 0a 23 69 66 20 64 65  _size ){..#if de
1d810 66 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49 58  fined(HAVE_POSIX
1d820 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20 48  _FALLOCATE) && H
1d830 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43  AVE_POSIX_FALLOC
1d840 41 54 45 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  ATE.      /* The
1d850 20 63 6f 64 65 20 62 65 6c 6f 77 20 69 73 20 68   code below is h
1d860 61 6e 64 6c 69 6e 67 20 74 68 65 20 72 65 74 75  andling the retu
1d870 72 6e 20 76 61 6c 75 65 20 6f 66 20 6f 73 46 61  rn value of osFa
1d880 6c 6c 6f 63 61 74 65 28 29 20 0a 20 20 20 20 20  llocate() .     
1d890 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20 70   ** correctly. p
1d8a0 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29  osix_fallocate()
1d8b0 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 22   is defined to "
1d8c0 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 6f 6e 20  returns zero on 
1d8d0 73 75 63 63 65 73 73 2c 20 0a 20 20 20 20 20 20  success, .      
1d8e0 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 6e  ** or an error n
1d8f0 75 6d 62 65 72 20 6f 6e 20 20 66 61 69 6c 75 72  umber on  failur
1d900 65 22 2e 20 53 65 65 20 74 68 65 20 6d 61 6e 70  e". See the manp
1d910 61 67 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  age for details.
1d920 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 65 72   */.      int er
1d930 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  r;.      do{.   
1d940 20 20 20 20 20 65 72 72 20 3d 20 6f 73 46 61 6c       err = osFal
1d950 6c 6f 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c  locate(pFile->h,
1d960 20 62 75 66 2e 73 74 5f 73 69 7a 65 2c 20 6e 53   buf.st_size, nS
1d970 69 7a 65 2d 62 75 66 2e 73 74 5f 73 69 7a 65 29  ize-buf.st_size)
1d980 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20  ;.      }while( 
1d990 65 72 72 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  err==EINTR );.  
1d9a0 20 20 20 20 69 66 28 20 65 72 72 20 29 20 72 65      if( err ) re
1d9b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1d9c0 52 5f 57 52 49 54 45 3b 0a 23 65 6c 73 65 0a 20  R_WRITE;.#else. 
1d9d0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4f       /* If the O
1d9e0 53 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  S does not have 
1d9f0 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28  posix_fallocate(
1da00 29 2c 20 66 61 6b 65 20 69 74 2e 20 57 72 69 74  ), fake it. Writ
1da10 65 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 73 69  e a .      ** si
1da20 6e 67 6c 65 20 62 79 74 65 20 74 6f 20 74 68 65  ngle byte to the
1da30 20 6c 61 73 74 20 62 79 74 65 20 69 6e 20 65 61   last byte in ea
1da40 63 68 20 62 6c 6f 63 6b 20 74 68 61 74 20 66 61  ch block that fa
1da50 6c 6c 73 20 65 6e 74 69 72 65 6c 79 0a 20 20 20  lls entirely.   
1da60 20 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68 65     ** within the
1da70 20 65 78 74 65 6e 64 65 64 20 72 65 67 69 6f 6e   extended region
1da80 2e 20 54 68 65 6e 2c 20 69 66 20 72 65 71 75 69  . Then, if requi
1da90 72 65 64 2c 20 61 20 73 69 6e 67 6c 65 20 62 79  red, a single by
1daa0 74 65 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f  te.      ** at o
1dab0 66 66 73 65 74 20 28 6e 53 69 7a 65 2d 31 29 2c  ffset (nSize-1),
1dac0 20 74 6f 20 73 65 74 20 74 68 65 20 73 69 7a 65   to set the size
1dad0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 72   of the file cor
1dae0 72 65 63 74 6c 79 2e 0a 20 20 20 20 20 20 2a 2a  rectly..      **
1daf0 20 54 68 69 73 20 69 73 20 61 20 73 69 6d 69 6c   This is a simil
1db00 61 72 20 74 65 63 68 6e 69 71 75 65 20 74 6f 20  ar technique to 
1db10 74 68 61 74 20 75 73 65 64 20 62 79 20 67 6c 69  that used by gli
1db20 62 63 20 6f 6e 20 73 79 73 74 65 6d 73 0a 20 20  bc on systems.  
1db30 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 20 6e      ** that do n
1db40 6f 74 20 68 61 76 65 20 61 20 72 65 61 6c 20 66  ot have a real f
1db50 61 6c 6c 6f 63 61 74 65 28 29 20 63 61 6c 6c 2e  allocate() call.
1db60 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1db70 69 6e 74 20 6e 42 6c 6b 20 3d 20 62 75 66 2e 73  int nBlk = buf.s
1db80 74 5f 62 6c 6b 73 69 7a 65 3b 20 20 2f 2a 20 46  t_blksize;  /* F
1db90 69 6c 65 2d 73 79 73 74 65 6d 20 62 6c 6f 63 6b  ile-system block
1dba0 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 69   size */.      i
1dbb0 6e 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 20 20  nt nWrite = 0;  
1dbc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1dbd0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72  mber of bytes wr
1dbe0 69 74 74 65 6e 20 62 79 20 73 65 65 6b 41 6e 64  itten by seekAnd
1dbf0 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 69  Write */.      i
1dc00 36 34 20 69 57 72 69 74 65 3b 20 20 20 20 20 20  64 iWrite;      
1dc10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
1dc20 78 74 20 6f 66 66 73 65 74 20 74 6f 20 77 72 69  xt offset to wri
1dc30 74 65 20 74 6f 20 2a 2f 0a 0a 20 20 20 20 20 20  te to */..      
1dc40 69 57 72 69 74 65 20 3d 20 28 62 75 66 2e 73 74  iWrite = (buf.st
1dc50 5f 73 69 7a 65 2f 6e 42 6c 6b 29 2a 6e 42 6c 6b  _size/nBlk)*nBlk
1dc60 20 2b 20 6e 42 6c 6b 20 2d 20 31 3b 0a 20 20 20   + nBlk - 1;.   
1dc70 20 20 20 61 73 73 65 72 74 28 20 69 57 72 69 74     assert( iWrit
1dc80 65 3e 3d 62 75 66 2e 73 74 5f 73 69 7a 65 20 29  e>=buf.st_size )
1dc90 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1dca0 28 28 69 57 72 69 74 65 2b 31 29 25 6e 42 6c 6b  ((iWrite+1)%nBlk
1dcb0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 6f  )==0 );.      fo
1dcc0 72 28 2f 2a 6e 6f 2d 6f 70 2a 2f 3b 20 69 57 72  r(/*no-op*/; iWr
1dcd0 69 74 65 3c 6e 53 69 7a 65 2b 6e 42 6c 6b 2d 31  ite<nSize+nBlk-1
1dce0 3b 20 69 57 72 69 74 65 2b 3d 6e 42 6c 6b 20 29  ; iWrite+=nBlk )
1dcf0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 57  {.        if( iW
1dd00 72 69 74 65 3e 3d 6e 53 69 7a 65 20 29 20 69 57  rite>=nSize ) iW
1dd10 72 69 74 65 20 3d 20 6e 53 69 7a 65 20 2d 20 31  rite = nSize - 1
1dd20 3b 0a 20 20 20 20 20 20 20 20 6e 57 72 69 74 65  ;.        nWrite
1dd30 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28   = seekAndWrite(
1dd40 70 46 69 6c 65 2c 20 69 57 72 69 74 65 2c 20 22  pFile, iWrite, "
1dd50 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  ", 1);.        i
1dd60 66 28 20 6e 57 72 69 74 65 21 3d 31 20 29 20 72  f( nWrite!=1 ) r
1dd70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1dd80 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 20 20  RR_WRITE;.      
1dd90 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
1dda0 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d   }..#if SQLITE_M
1ddb0 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
1ddc0 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d 6d 61 70   if( pFile->mmap
1ddd0 53 69 7a 65 4d 61 78 3e 30 20 26 26 20 6e 42 79  SizeMax>0 && nBy
1dde0 74 65 3e 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  te>pFile->mmapSi
1ddf0 7a 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  ze ){.    int rc
1de00 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  ;.    if( pFile-
1de10 3e 73 7a 43 68 75 6e 6b 3c 3d 30 20 29 7b 0a 20  >szChunk<=0 ){. 
1de20 20 20 20 20 20 69 66 28 20 72 6f 62 75 73 74 5f       if( robust_
1de30 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2d  ftruncate(pFile-
1de40 3e 68 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20 20  >h, nByte) ){.  
1de50 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
1de60 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e  rrno(pFile, errn
1de70 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  o);.        retu
1de80 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  rn unixLogError(
1de90 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
1dea0 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74  NCATE, "ftruncat
1deb0 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  e", pFile->zPath
1dec0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1ded0 0a 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4d  ..    rc = unixM
1dee0 61 70 66 69 6c 65 28 70 46 69 6c 65 2c 20 6e 42  apfile(pFile, nB
1def0 79 74 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  yte);.    return
1df00 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   rc;.  }.#endif.
1df10 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1df20 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  _OK;.}../*.** If
1df30 20 2a 70 41 72 67 20 69 73 20 69 6e 69 74 69 61   *pArg is initia
1df40 6c 6c 79 20 6e 65 67 61 74 69 76 65 20 74 68 65  lly negative the
1df50 6e 20 74 68 69 73 20 69 73 20 61 20 71 75 65 72  n this is a quer
1df60 79 2e 20 20 53 65 74 20 2a 70 41 72 67 20 74 6f  y.  Set *pArg to
1df70 0a 2a 2a 20 31 20 6f 72 20 30 20 64 65 70 65 6e  .** 1 or 0 depen
1df80 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20  ding on whether 
1df90 6f 72 20 6e 6f 74 20 62 69 74 20 6d 61 73 6b 20  or not bit mask 
1dfa0 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  of pFile->ctrlFl
1dfb0 61 67 73 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a  ags is set..**.*
1dfc0 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20 30 20  * If *pArg is 0 
1dfd0 6f 72 20 31 2c 20 74 68 65 6e 20 63 6c 65 61 72  or 1, then clear
1dfe0 20 6f 72 20 73 65 74 20 74 68 65 20 6d 61 73 6b   or set the mask
1dff0 20 62 69 74 20 6f 66 20 70 46 69 6c 65 2d 3e 63   bit of pFile->c
1e000 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61  trlFlags..*/.sta
1e010 74 69 63 20 76 6f 69 64 20 75 6e 69 78 4d 6f 64  tic void unixMod
1e020 65 42 69 74 28 75 6e 69 78 46 69 6c 65 20 2a 70  eBit(unixFile *p
1e030 46 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20 63  File, unsigned c
1e040 68 61 72 20 6d 61 73 6b 2c 20 69 6e 74 20 2a 70  har mask, int *p
1e050 41 72 67 29 7b 0a 20 20 69 66 28 20 2a 70 41 72  Arg){.  if( *pAr
1e060 67 3c 30 20 29 7b 0a 20 20 20 20 2a 70 41 72 67  g<0 ){.    *pArg
1e070 20 3d 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46   = (pFile->ctrlF
1e080 6c 61 67 73 20 26 20 6d 61 73 6b 29 21 3d 30 3b  lags & mask)!=0;
1e090 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 2a 70  .  }else if( (*p
1e0a0 41 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  Arg)==0 ){.    p
1e0b0 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
1e0c0 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73  &= ~mask;.  }els
1e0d0 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74  e{.    pFile->ct
1e0e0 72 6c 46 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b  rlFlags |= mask;
1e0f0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  .  }.}../* Forwa
1e100 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a  rd declaration *
1e110 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1e120 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74  xGetTempname(int
1e130 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
1e140 66 29 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72  f);../*.** Infor
1e150 6d 61 74 69 6f 6e 20 61 6e 64 20 63 6f 6e 74 72  mation and contr
1e160 6f 6c 20 6f 66 20 61 6e 20 6f 70 65 6e 20 66 69  ol of an open fi
1e170 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74  le handle..*/.st
1e180 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c  atic int unixFil
1e190 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33  eControl(sqlite3
1e1a0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f  _file *id, int o
1e1b0 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  p, void *pArg){.
1e1c0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
1e1d0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
1e1e0 64 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  d;.  switch( op 
1e1f0 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
1e200 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41  TE_FCNTL_LOCKSTA
1e210 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e  TE: {.      *(in
1e220 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d  t*)pArg = pFile-
1e230 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20  >eFileLock;.    
1e240 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e250 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
1e260 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1e270 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20  LAST_ERRNO: {.  
1e280 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20      *(int*)pArg 
1e290 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  = pFile->lastErr
1e2a0 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  no;.      return
1e2b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1e2c0 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1e2d0 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49  E_FCNTL_CHUNK_SI
1e2e0 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  ZE: {.      pFil
1e2f0 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69  e->szChunk = *(i
1e300 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  nt *)pArg;.     
1e310 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1e320 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1e330 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  e SQLITE_FCNTL_S
1e340 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20  IZE_HINT: {.    
1e350 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20    int rc;.      
1e360 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
1e370 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
1e380 72 63 20 3d 20 66 63 6e 74 6c 53 69 7a 65 48 69  rc = fcntlSizeHi
1e390 6e 74 28 70 46 69 6c 65 2c 20 2a 28 69 36 34 20  nt(pFile, *(i64 
1e3a0 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 53  *)pArg);.      S
1e3b0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
1e3c0 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 72  nign(0);.      r
1e3d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1e3e0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1e3f0 46 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57 41  FCNTL_PERSIST_WA
1e400 4c 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 4d  L: {.      unixM
1e410 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 55 4e  odeBit(pFile, UN
1e420 49 58 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57  IXFILE_PERSIST_W
1e430 41 4c 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b  AL, (int*)pArg);
1e440 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1e450 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1e460 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1e470 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f  CNTL_POWERSAFE_O
1e480 56 45 52 57 52 49 54 45 3a 20 7b 0a 20 20 20 20  VERWRITE: {.    
1e490 20 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 70 46    unixModeBit(pF
1e4a0 69 6c 65 2c 20 55 4e 49 58 46 49 4c 45 5f 50 53  ile, UNIXFILE_PS
1e4b0 4f 57 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b  OW, (int*)pArg);
1e4c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1e4d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1e4e0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1e4f0 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a  CNTL_VFSNAME: {.
1e500 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70        *(char**)p
1e510 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Arg = sqlite3_mp
1e520 72 69 6e 74 66 28 22 25 73 22 2c 20 70 46 69 6c  rintf("%s", pFil
1e530 65 2d 3e 70 56 66 73 2d 3e 7a 4e 61 6d 65 29 3b  e->pVfs->zName);
1e540 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1e550 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1e560 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1e570 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d  CNTL_TEMPFILENAM
1e580 45 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20  E: {.      char 
1e590 2a 7a 54 46 69 6c 65 20 3d 20 73 71 6c 69 74 65  *zTFile = sqlite
1e5a0 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 70 46 69 6c  3_malloc64( pFil
1e5b0 65 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  e->pVfs->mxPathn
1e5c0 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ame );.      if(
1e5d0 20 7a 54 46 69 6c 65 20 29 7b 0a 20 20 20 20 20   zTFile ){.     
1e5e0 20 20 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61     unixGetTempna
1e5f0 6d 65 28 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e  me(pFile->pVfs->
1e600 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a 54 46 69  mxPathname, zTFi
1e610 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 2a 28 63  le);.        *(c
1e620 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 7a 54 46  har**)pArg = zTF
1e630 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ile;.      }.   
1e640 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1e650 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
1e660 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1e670 5f 48 41 53 5f 4d 4f 56 45 44 3a 20 7b 0a 20 20  _HAS_MOVED: {.  
1e680 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20      *(int*)pArg 
1e690 3d 20 66 69 6c 65 48 61 73 4d 6f 76 65 64 28 70  = fileHasMoved(p
1e6a0 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 72 65 74  File);.      ret
1e6b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1e6c0 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f     }.#if SQLITE_
1e6d0 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
1e6e0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1e6f0 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 3a  FCNTL_MMAP_SIZE:
1e700 20 7b 0a 20 20 20 20 20 20 69 36 34 20 6e 65 77   {.      i64 new
1e710 4c 69 6d 69 74 20 3d 20 2a 28 69 36 34 2a 29 70  Limit = *(i64*)p
1e720 41 72 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  Arg;.      int r
1e730 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1e740 20 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69       if( newLimi
1e750 74 3e 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  t>sqlite3GlobalC
1e760 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 20 29 7b 0a  onfig.mxMmap ){.
1e770 20 20 20 20 20 20 20 20 6e 65 77 4c 69 6d 69 74          newLimit
1e780 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
1e790 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 3b 0a 20  Config.mxMmap;. 
1e7a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 28 69       }.      *(i
1e7b0 36 34 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65  64*)pArg = pFile
1e7c0 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20  ->mmapSizeMax;. 
1e7d0 20 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69       if( newLimi
1e7e0 74 3e 3d 30 20 26 26 20 6e 65 77 4c 69 6d 69 74  t>=0 && newLimit
1e7f0 21 3d 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  !=pFile->mmapSiz
1e800 65 4d 61 78 20 26 26 20 70 46 69 6c 65 2d 3e 6e  eMax && pFile->n
1e810 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 7b 0a 20  FetchOut==0 ){. 
1e820 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d         pFile->mm
1e830 61 70 53 69 7a 65 4d 61 78 20 3d 20 6e 65 77 4c  apSizeMax = newL
1e840 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 69 66  imit;.        if
1e850 28 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  ( pFile->mmapSiz
1e860 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  e>0 ){.         
1e870 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70   unixUnmapfile(p
1e880 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20  File);.         
1e890 20 72 63 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c   rc = unixMapfil
1e8a0 65 28 70 46 69 6c 65 2c 20 2d 31 29 3b 0a 20 20  e(pFile, -1);.  
1e8b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1e8c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1e8d0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
1e8e0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1e8f0 47 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  G.    /* The pag
1e900 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 6d 65  er calls this me
1e910 74 68 6f 64 20 74 6f 20 73 69 67 6e 61 6c 20 74  thod to signal t
1e920 68 61 74 20 69 74 20 68 61 73 20 64 6f 6e 65 0a  hat it has done.
1e930 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63      ** a rollbac
1e940 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 64  k and that the d
1e950 61 74 61 62 61 73 65 20 69 73 20 74 68 65 72 65  atabase is there
1e960 66 6f 72 65 20 75 6e 63 68 61 6e 67 65 64 20 61  fore unchanged a
1e970 6e 64 0a 20 20 20 20 2a 2a 20 69 74 20 68 65 6e  nd.    ** it hen
1e980 63 65 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20  ce it is OK for 
1e990 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1e9a0 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 74  change counter t
1e9b0 6f 20 62 65 0a 20 20 20 20 2a 2a 20 75 6e 63 68  o be.    ** unch
1e9c0 61 6e 67 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  anged..    */.  
1e9d0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1e9e0 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44  NTL_DB_UNCHANGED
1e9f0 3a 20 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78  : {.      ((unix
1ea00 46 69 6c 65 2a 29 69 64 29 2d 3e 64 62 55 70 64  File*)id)->dbUpd
1ea10 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  ate = 0;.      r
1ea20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1ea30 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
1ea40 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1ea50 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
1ea60 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1ea70 5f 5f 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c  __).    case SQL
1ea80 49 54 45 5f 46 43 4e 54 4c 5f 53 45 54 5f 4c 4f  ITE_FCNTL_SET_LO
1ea90 43 4b 50 52 4f 58 59 46 49 4c 45 3a 0a 20 20 20  CKPROXYFILE:.   
1eaa0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1eab0 54 4c 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TL_GET_LOCKPROXY
1eac0 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 72 65  FILE: {.      re
1ead0 74 75 72 6e 20 70 72 6f 78 79 46 69 6c 65 43 6f  turn proxyFileCo
1eae0 6e 74 72 6f 6c 28 69 64 2c 6f 70 2c 70 41 72 67  ntrol(id,op,pArg
1eaf0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  );.    }.#endif 
1eb00 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
1eb10 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
1eb20 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
1eb30 45 5f 5f 29 20 2a 2f 0a 20 20 7d 0a 20 20 72 65  E__) */.  }.  re
1eb40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46  turn SQLITE_NOTF
1eb50 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  OUND;.}../*.** R
1eb60 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72  eturn the sector
1eb70 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
1eb80 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  f the underlying
1eb90 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f   block device fo
1eba0 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69  r.** the specifi
1ebb0 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  ed file. This is
1ebc0 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35   almost always 5
1ebd0 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61  12 bytes, but ma
1ebe0 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66  y be.** larger f
1ebf0 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e  or some devices.
1ec00 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f  .**.** SQLite co
1ec10 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 20  de assumes this 
1ec20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  function cannot 
1ec30 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73  fail. It also as
1ec40 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66  sumes that.** if
1ec50 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63   two files are c
1ec60 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 61  reated in the sa
1ec70 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64  me file-system d
1ec80 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a  irectory (i.e..*
1ec90 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e 64  * a database and
1eca0 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   its journal fil
1ecb0 65 29 20 74 68 61 74 20 74 68 65 20 73 65 63 74  e) that the sect
1ecc0 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20  or size will be 
1ecd0 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20  the.** same for 
1ece0 62 6f 74 68 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  both..*/.#ifndef
1ecf0 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 20 0a 73 74 61   __QNXNTO__ .sta
1ed00 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 63 74  tic int unixSect
1ed10 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  orSize(sqlite3_f
1ed20 69 6c 65 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20  ile *NotUsed){. 
1ed30 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1ed40 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
1ed50 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 46 41  turn SQLITE_DEFA
1ed60 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b  ULT_SECTOR_SIZE;
1ed70 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1ed80 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
1ed90 65 72 73 69 6f 6e 20 6f 66 20 75 6e 69 78 53 65  ersion of unixSe
1eda0 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6f 70  ctorSize() is op
1edb0 74 69 6d 69 7a 65 64 20 66 6f 72 20 51 4e 58 2e  timized for QNX.
1edc0 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 51 4e 58  .*/.#ifdef __QNX
1edd0 4e 54 4f 5f 5f 0a 23 69 6e 63 6c 75 64 65 20 3c  NTO__.#include <
1ede0 73 79 73 2f 64 63 6d 64 5f 62 6c 6b 2e 68 3e 0a  sys/dcmd_blk.h>.
1edf0 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74  #include <sys/st
1ee00 61 74 76 66 73 2e 68 3e 0a 73 74 61 74 69 63 20  atvfs.h>.static 
1ee10 69 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69  int unixSectorSi
1ee20 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
1ee30 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  *id){.  unixFile
1ee40 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
1ee50 69 6c 65 2a 29 69 64 3b 0a 20 20 69 66 28 20 70  ile*)id;.  if( p
1ee60 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
1ee70 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 74 72   == 0 ){.    str
1ee80 75 63 74 20 73 74 61 74 76 66 73 20 66 73 49 6e  uct statvfs fsIn
1ee90 66 6f 3b 0a 20 20 20 20 20 20 20 0a 20 20 20 20  fo;.       .    
1eea0 2f 2a 20 53 65 74 20 64 65 66 61 75 6c 74 73 20  /* Set defaults 
1eeb0 66 6f 72 20 6e 6f 6e 2d 73 75 70 70 6f 72 74 65  for non-supporte
1eec0 64 20 66 69 6c 65 73 79 73 74 65 6d 73 20 2a 2f  d filesystems */
1eed0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74  .    pFile->sect
1eee0 6f 72 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f  orSize = SQLITE_
1eef0 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53  DEFAULT_SECTOR_S
1ef00 49 5a 45 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  IZE;.    pFile->
1ef10 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
1ef20 73 74 69 63 73 20 3d 20 30 3b 0a 20 20 20 20 69  stics = 0;.    i
1ef30 66 28 20 66 73 74 61 74 76 66 73 28 70 46 69 6c  f( fstatvfs(pFil
1ef40 65 2d 3e 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d  e->h, &fsInfo) =
1ef50 3d 20 2d 31 20 29 20 7b 0a 20 20 20 20 20 20 72  = -1 ) {.      r
1ef60 65 74 75 72 6e 20 70 46 69 6c 65 2d 3e 73 65 63  eturn pFile->sec
1ef70 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a  torSize;.    }..
1ef80 20 20 20 20 69 66 28 20 21 73 74 72 63 6d 70 28      if( !strcmp(
1ef90 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70  fsInfo.f_basetyp
1efa0 65 2c 20 22 74 6d 70 22 29 20 29 20 7b 0a 20 20  e, "tmp") ) {.  
1efb0 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f      pFile->secto
1efc0 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66  rSize = fsInfo.f
1efd0 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46  _bsize;.      pF
1efe0 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
1eff0 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20  cteristics =.   
1f000 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
1f010 50 5f 41 54 4f 4d 49 43 34 4b 20 7c 20 20 20 20  P_ATOMIC4K |    
1f020 20 20 20 2f 2a 20 41 6c 6c 20 72 61 6d 20 66 69     /* All ram fi
1f030 6c 65 73 79 73 74 65 6d 20 77 72 69 74 65 73 20  lesystem writes 
1f040 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20  are atomic */.  
1f050 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
1f060 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c  AP_SAFE_APPEND |
1f070 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74      /* growing t
1f080 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
1f090 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20   occur until.   
1f0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0c0 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20     ** the write 
1f0d0 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20  succeeds */.    
1f0e0 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
1f0f0 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20  _SEQUENTIAL |   
1f100 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c    /* The ram fil
1f110 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77  esystem has no w
1f120 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20  rite behind.    
1f130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f150 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72    ** so it is or
1f160 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  dered */.       
1f170 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
1f180 28 20 73 74 72 73 74 72 28 66 73 49 6e 66 6f 2e  ( strstr(fsInfo.
1f190 66 5f 62 61 73 65 74 79 70 65 2c 20 22 65 74 66  f_basetype, "etf
1f1a0 73 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  s") ){.      pFi
1f1b0 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  le->sectorSize =
1f1c0 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b   fsInfo.f_bsize;
1f1d0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65  .      pFile->de
1f1e0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1f1f0 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a  ics =.        /*
1f200 20 65 74 66 73 20 63 6c 75 73 74 65 72 20 73 69   etfs cluster si
1f210 7a 65 20 77 72 69 74 65 73 20 61 72 65 20 61 74  ze writes are at
1f220 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20  omic */.        
1f230 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69  (pFile->sectorSi
1f240 7a 65 20 2f 20 35 31 32 20 2a 20 53 51 4c 49 54  ze / 512 * SQLIT
1f250 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31  E_IOCAP_ATOMIC51
1f260 32 29 20 7c 0a 20 20 20 20 20 20 20 20 53 51 4c  2) |.        SQL
1f270 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
1f280 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72  PPEND |    /* gr
1f290 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64  owing the file d
1f2a0 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e  oes not occur un
1f2b0 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20  til.            
1f2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
1f2e0 20 77 72 69 74 65 20 73 75 63 63 65 65 64 73 20   write succeeds 
1f2f0 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54  */.        SQLIT
1f300 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
1f310 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20  AL |     /* The 
1f320 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68  ram filesystem h
1f330 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69  as no write behi
1f340 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  nd.             
1f350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f360 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69           ** so i
1f370 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a  t is ordered */.
1f380 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d          0;.    }
1f390 65 6c 73 65 20 69 66 28 20 21 73 74 72 63 6d 70  else if( !strcmp
1f3a0 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79  (fsInfo.f_basety
1f3b0 70 65 2c 20 22 71 6e 78 36 22 29 20 29 7b 0a 20  pe, "qnx6") ){. 
1f3c0 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74       pFile->sect
1f3d0 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e  orSize = fsInfo.
1f3e0 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70  f_bsize;.      p
1f3f0 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72  File->deviceChar
1f400 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20  acteristics =.  
1f410 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
1f420 41 50 5f 41 54 4f 4d 49 43 20 7c 20 20 20 20 20  AP_ATOMIC |     
1f430 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73      /* All files
1f440 79 73 74 65 6d 20 77 72 69 74 65 73 20 61 72 65  ystem writes are
1f450 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20   atomic */.     
1f460 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
1f470 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20  SAFE_APPEND |   
1f480 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20   /* growing the 
1f490 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63  file does not oc
1f4a0 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20  cur until.      
1f4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4d0 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73 75 63  ** the write suc
1f4e0 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20  ceeds */.       
1f4f0 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45   SQLITE_IOCAP_SE
1f500 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f  QUENTIAL |     /
1f510 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79  * The ram filesy
1f520 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74  stem has no writ
1f530 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20  e behind.       
1f540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1f560 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72  * so it is order
1f570 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b  ed */.        0;
1f580 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21  .    }else if( !
1f590 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f  strcmp(fsInfo.f_
1f5a0 62 61 73 65 74 79 70 65 2c 20 22 71 6e 78 34 22  basetype, "qnx4"
1f5b0 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
1f5c0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66  ->sectorSize = f
1f5d0 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20  sInfo.f_bsize;. 
1f5e0 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69       pFile->devi
1f5f0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1f600 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20 66  s =.        /* f
1f610 75 6c 6c 20 62 69 74 73 65 74 20 6f 66 20 61 74  ull bitset of at
1f620 6f 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78 20 73  omics from max s
1f630 65 63 74 6f 72 20 73 69 7a 65 20 61 6e 64 20 73  ector size and s
1f640 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 20 20  maller */.      
1f650 20 20 28 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f    ((pFile->secto
1f660 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20 53 51  rSize / 512 * SQ
1f670 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
1f680 43 35 31 32 29 20 3c 3c 20 31 29 20 2d 20 32 20  C512) << 1) - 2 
1f690 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  |.        SQLITE
1f6a0 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
1f6b0 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72  L |     /* The r
1f6c0 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61  am filesystem ha
1f6d0 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e  s no write behin
1f6e0 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
1f6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f700 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74          ** so it
1f710 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20   is ordered */. 
1f720 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65         0;.    }e
1f730 6c 73 65 20 69 66 28 20 73 74 72 73 74 72 28 66  lse if( strstr(f
1f740 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65  sInfo.f_basetype
1f750 2c 20 22 64 6f 73 22 29 20 29 7b 0a 20 20 20 20  , "dos") ){.    
1f760 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53    pFile->sectorS
1f770 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62  ize = fsInfo.f_b
1f780 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c  size;.      pFil
1f790 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  e->deviceCharact
1f7a0 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20  eristics =.     
1f7b0 20 20 20 2f 2a 20 66 75 6c 6c 20 62 69 74 73 65     /* full bitse
1f7c0 74 20 6f 66 20 61 74 6f 6d 69 63 73 20 66 72 6f  t of atomics fro
1f7d0 6d 20 6d 61 78 20 73 65 63 74 6f 72 20 73 69 7a  m max sector siz
1f7e0 65 20 61 6e 64 20 73 6d 61 6c 6c 65 72 20 2a 2f  e and smaller */
1f7f0 0a 20 20 20 20 20 20 20 20 28 28 70 46 69 6c 65  .        ((pFile
1f800 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20 35  ->sectorSize / 5
1f810 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41  12 * SQLITE_IOCA
1f820 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 3c 3c 20  P_ATOMIC512) << 
1f830 31 29 20 2d 20 32 20 7c 0a 20 20 20 20 20 20 20  1) - 2 |.       
1f840 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45   SQLITE_IOCAP_SE
1f850 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f  QUENTIAL |     /
1f860 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79  * The ram filesy
1f870 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74  stem has no writ
1f880 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20  e behind.       
1f890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1f8b0 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72  * so it is order
1f8c0 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b  ed */.        0;
1f8d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1f8e0 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43    pFile->deviceC
1f8f0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d  haracteristics =
1f900 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
1f910 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 20  IOCAP_ATOMIC512 
1f920 7c 20 20 20 20 20 20 2f 2a 20 62 6c 6f 63 6b 73  |      /* blocks
1f930 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20   are atomic */. 
1f940 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
1f950 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20  CAP_SAFE_APPEND 
1f960 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20  |    /* growing 
1f970 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  the file does no
1f980 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20  t occur until.  
1f990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9b0 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65      ** the write
1f9c0 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20   succeeds */.   
1f9d0 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 0a 20 20       0;.    }.  
1f9e0 7d 0a 20 20 2f 2a 20 4c 61 73 74 20 63 68 61 6e  }.  /* Last chan
1f9f0 63 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 2e  ce verification.
1fa00 20 20 49 66 20 74 68 65 20 73 65 63 74 6f 72 20    If the sector 
1fa10 73 69 7a 65 20 69 73 6e 27 74 20 61 20 6d 75 6c  size isn't a mul
1fa20 74 69 70 6c 65 20 6f 66 20 35 31 32 0a 20 20 2a  tiple of 512.  *
1fa30 2a 20 74 68 65 6e 20 69 74 20 69 73 6e 27 74 20  * then it isn't 
1fa40 76 61 6c 69 64 2e 2a 2f 0a 20 20 69 66 28 20 70  valid.*/.  if( p
1fa50 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
1fa60 20 25 20 35 31 32 20 21 3d 20 30 20 29 7b 0a 20   % 512 != 0 ){. 
1fa70 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65     pFile->device
1fa80 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
1fa90 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  = 0;.    pFile->
1faa0 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 53 51 4c  sectorSize = SQL
1fab0 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54  ITE_DEFAULT_SECT
1fac0 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 20 20 72  OR_SIZE;.  }.  r
1fad0 65 74 75 72 6e 20 70 46 69 6c 65 2d 3e 73 65 63  eturn pFile->sec
1fae0 74 6f 72 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69  torSize;.}.#endi
1faf0 66 20 2f 2a 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 20  f /* __QNXNTO__ 
1fb00 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
1fb10 20 74 68 65 20 64 65 76 69 63 65 20 63 68 61 72   the device char
1fb20 61 63 74 65 72 69 73 74 69 63 73 20 66 6f 72 20  acteristics for 
1fb30 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
1fb40 54 68 69 73 20 56 46 53 20 69 73 20 73 65 74 20  This VFS is set 
1fb50 75 70 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c  up to return SQL
1fb60 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53  ITE_IOCAP_POWERS
1fb70 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 62 79  AFE_OVERWRITE by
1fb80 20 64 65 66 61 75 6c 74 2e 0a 2a 2a 20 48 6f 77   default..** How
1fb90 65 76 65 72 2c 20 74 68 61 74 20 63 68 6f 69 63  ever, that choic
1fba0 65 20 69 73 20 63 6f 6e 74 72 6f 76 65 72 73 69  e is controversi
1fbb0 61 6c 20 73 69 6e 63 65 20 74 65 63 68 6e 69 63  al since technic
1fbc0 61 6c 6c 79 20 74 68 65 20 75 6e 64 65 72 6c 79  ally the underly
1fbd0 69 6e 67 0a 2a 2a 20 66 69 6c 65 20 73 79 73 74  ing.** file syst
1fbe0 65 6d 20 64 6f 65 73 20 6e 6f 74 20 61 6c 77 61  em does not alwa
1fbf0 79 73 20 70 72 6f 76 69 64 65 20 70 6f 77 65 72  ys provide power
1fc00 73 61 66 65 20 6f 76 65 72 77 72 69 74 65 73 2e  safe overwrites.
1fc10 20 20 28 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77    (In other.** w
1fc20 6f 72 64 73 2c 20 61 66 74 65 72 20 61 20 70 6f  ords, after a po
1fc30 77 65 72 2d 6c 6f 73 73 20 65 76 65 6e 74 2c 20  wer-loss event, 
1fc40 70 61 72 74 73 20 6f 66 20 74 68 65 20 66 69 6c  parts of the fil
1fc50 65 20 74 68 61 74 20 77 65 72 65 20 6e 65 76 65  e that were neve
1fc60 72 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6d 69 67  r.** written mig
1fc70 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20  ht end up being 
1fc80 61 6c 74 65 72 65 64 2e 29 20 20 48 6f 77 65 76  altered.)  Howev
1fc90 65 72 2c 20 6e 6f 6e 2d 50 53 4f 57 20 62 65 68  er, non-PSOW beh
1fca0 61 76 69 6f 72 20 69 73 20 76 65 72 79 2c 0a 2a  avior is very,.*
1fcb0 2a 20 76 65 72 79 20 72 61 72 65 2e 20 20 41 6e  * very rare.  An
1fcc0 64 20 61 73 73 65 72 74 69 6e 67 20 50 53 4f 57  d asserting PSOW
1fcd0 20 6d 61 6b 65 73 20 61 20 6c 61 72 67 65 20 72   makes a large r
1fce0 65 64 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  eduction in the 
1fcf0 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 72 65 71  amount.** of req
1fd00 75 69 72 65 64 20 49 2f 4f 20 66 6f 72 20 6a 6f  uired I/O for jo
1fd10 75 72 6e 61 6c 69 6e 67 2c 20 73 69 6e 63 65 20  urnaling, since 
1fd20 61 20 6c 6f 74 20 6f 66 20 70 61 64 64 69 6e 67  a lot of padding
1fd30 20 69 73 20 65 6c 69 6d 69 6e 61 74 65 64 2e 0a   is eliminated..
1fd40 2a 2a 20 20 48 65 6e 63 65 2c 20 77 68 69 6c 65  **  Hence, while
1fd50 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57   POWERSAFE_OVERW
1fd60 52 49 54 45 20 69 73 20 6f 6e 20 62 79 20 64 65  RITE is on by de
1fd70 66 61 75 6c 74 2c 20 74 68 65 72 65 20 69 73 20  fault, there is 
1fd80 61 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 0a 2a  a file-control.*
1fd90 2a 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74  * available to t
1fda0 75 72 6e 20 69 74 20 6f 66 66 20 61 6e 64 20 55  urn it off and U
1fdb0 52 49 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  RI query paramet
1fdc0 65 72 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  er available to 
1fdd0 74 75 72 6e 20 69 74 20 6f 66 66 2e 0a 2a 2f 0a  turn it off..*/.
1fde0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44  static int unixD
1fdf0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1fe00 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  tics(sqlite3_fil
1fe10 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69  e *id){.  unixFi
1fe20 6c 65 20 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c  le *p = (unixFil
1fe30 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20  e*)id;.  int rc 
1fe40 3d 20 30 3b 0a 23 69 66 64 65 66 20 5f 5f 51 4e  = 0;.#ifdef __QN
1fe50 58 4e 54 4f 5f 5f 0a 20 20 69 66 28 20 70 2d 3e  XNTO__.  if( p->
1fe60 73 65 63 74 6f 72 53 69 7a 65 3d 3d 30 20 29 20  sectorSize==0 ) 
1fe70 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28 69  unixSectorSize(i
1fe80 64 29 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 64 65  d);.  rc = p->de
1fe90 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1fea0 69 63 73 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  ics;.#endif.  if
1feb0 28 20 70 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ( p->ctrlFlags &
1fec0 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 20 29   UNIXFILE_PSOW )
1fed0 7b 0a 20 20 20 20 72 63 20 7c 3d 20 53 51 4c 49  {.    rc |= SQLI
1fee0 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41  TE_IOCAP_POWERSA
1fef0 46 45 5f 4f 56 45 52 57 52 49 54 45 3b 0a 20 20  FE_OVERWRITE;.  
1ff00 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1ff10 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
1ff20 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20  QLITE_OMIT_WAL) 
1ff30 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  || SQLITE_MAX_MM
1ff40 41 50 5f 53 49 5a 45 3e 30 0a 0a 2f 2a 0a 2a 2a  AP_SIZE>0../*.**
1ff50 20 52 65 74 75 72 6e 20 74 68 65 20 73 79 73 74   Return the syst
1ff60 65 6d 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  em page size..**
1ff70 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1ff80 6e 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  n should not be 
1ff90 63 61 6c 6c 65 64 20 64 69 72 65 63 74 6c 79 20  called directly 
1ffa0 62 79 20 6f 74 68 65 72 20 63 6f 64 65 20 69 6e  by other code in
1ffb0 20 74 68 69 73 20 66 69 6c 65 2e 20 0a 2a 2a 20   this file. .** 
1ffc0 49 6e 73 74 65 61 64 2c 20 69 74 20 73 68 6f 75  Instead, it shou
1ffd0 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 76 69 61  ld be called via
1ffe0 20 6d 61 63 72 6f 20 6f 73 47 65 74 70 61 67 65   macro osGetpage
1fff0 73 69 7a 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  size()..*/.stati
20000 63 20 69 6e 74 20 75 6e 69 78 47 65 74 70 61 67  c int unixGetpag
20010 65 73 69 7a 65 28 76 6f 69 64 29 7b 0a 23 69 66  esize(void){.#if
20020 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 72 65   OS_VXWORKS.  re
20030 74 75 72 6e 20 31 30 32 34 3b 0a 23 65 6c 69 66  turn 1024;.#elif
20040 20 64 65 66 69 6e 65 64 28 5f 42 53 44 5f 53 4f   defined(_BSD_SO
20050 55 52 43 45 29 0a 20 20 72 65 74 75 72 6e 20 67  URCE).  return g
20060 65 74 70 61 67 65 73 69 7a 65 28 29 3b 0a 23 65  etpagesize();.#e
20070 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 28 69 6e  lse.  return (in
20080 74 29 73 79 73 63 6f 6e 66 28 5f 53 43 5f 50 41  t)sysconf(_SC_PA
20090 47 45 53 49 5a 45 29 3b 0a 23 65 6e 64 69 66 0a  GESIZE);.#endif.
200a0 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  }..#endif /* !de
200b0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
200c0 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45  T_WAL) || SQLITE
200d0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
200e0 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
200f0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a  ITE_OMIT_WAL../*
20100 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65 64 20  .** Object used 
20110 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 6e 20  to represent an 
20120 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 75  shared memory bu
20130 66 66 65 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68  ffer.  .**.** Wh
20140 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65  en multiple thre
20150 61 64 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63  ads all referenc
20160 65 20 74 68 65 20 73 61 6d 65 20 77 61 6c 2d 69  e the same wal-i
20170 6e 64 65 78 2c 20 65 61 63 68 20 74 68 72 65 61  ndex, each threa
20180 64 0a 2a 2a 20 68 61 73 20 69 74 73 20 6f 77 6e  d.** has its own
20190 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 2c   unixShm object,
201a0 20 62 75 74 20 74 68 65 79 20 61 6c 6c 20 70 6f   but they all po
201b0 69 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20  int to a single 
201c0 69 6e 73 74 61 6e 63 65 0a 2a 2a 20 6f 66 20 74  instance.** of t
201d0 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  his unixShmNode 
201e0 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65  object.  In othe
201f0 72 20 77 6f 72 64 73 2c 20 65 61 63 68 20 77 61  r words, each wa
20200 6c 2d 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65  l-index is opene
20210 64 0a 2a 2a 20 6f 6e 6c 79 20 6f 6e 63 65 20 70  d.** only once p
20220 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  er process..**.*
20230 2a 20 45 61 63 68 20 75 6e 69 78 53 68 6d 4e 6f  * Each unixShmNo
20240 64 65 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e  de object is con
20250 6e 65 63 74 65 64 20 74 6f 20 61 20 73 69 6e 67  nected to a sing
20260 6c 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  le unixInodeInfo
20270 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 57 65 20 63   object..** We c
20280 6f 75 6c 64 20 63 6f 61 6c 65 73 63 65 20 74 68  ould coalesce th
20290 69 73 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 75  is object into u
202a0 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2c 20 62 75  nixInodeInfo, bu
202b0 74 20 74 68 61 74 20 77 6f 75 6c 64 20 6d 65 61  t that would mea
202c0 6e 0a 2a 2a 20 65 76 65 72 79 20 6f 70 65 6e 20  n.** every open 
202d0 66 69 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e  file that does n
202e0 6f 74 20 75 73 65 20 73 68 61 72 65 64 20 6d 65  ot use shared me
202f0 6d 6f 72 79 20 28 69 6e 20 6f 74 68 65 72 20 77  mory (in other w
20300 6f 72 64 73 2c 20 6d 6f 73 74 0a 2a 2a 20 6f 70  ords, most.** op
20310 65 6e 20 66 69 6c 65 73 29 20 77 6f 75 6c 64 20  en files) would 
20320 68 61 76 65 20 74 6f 20 63 61 72 72 79 20 61 72  have to carry ar
20330 6f 75 6e 64 20 74 68 69 73 20 65 78 74 72 61 20  ound this extra 
20340 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 53 6f  information.  So
20350 0a 2a 2a 20 74 68 65 20 75 6e 69 78 49 6e 6f 64  .** the unixInod
20360 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63 6f 6e  eInfo object con
20370 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  tains a pointer 
20380 74 6f 20 74 68 69 73 20 75 6e 69 78 53 68 6d 4e  to this unixShmN
20390 6f 64 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 61 6e  ode object.** an
203a0 64 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64  d the unixShmNod
203b0 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  e object is crea
203c0 74 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20 6e 65  ted only when ne
203d0 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69 78  eded..**.** unix
203e0 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74  MutexHeld() must
203f0 20 62 65 20 74 72 75 65 20 77 68 65 6e 20 63 72   be true when cr
20400 65 61 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f  eating or destro
20410 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a  ying.** this obj
20420 65 63 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61  ect or while rea
20430 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
20440 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  the following fi
20450 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  elds:.**.**     
20460 20 6e 52 65 66 0a 2a 2a 0a 2a 2a 20 54 68 65 20   nRef.**.** The 
20470 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
20480 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61   are read-only a
20490 66 74 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20  fter the object 
204a0 69 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a  is created:.** .
204b0 2a 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a 20 20  **      fid.**  
204c0 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a      zFilename.**
204d0 0a 2a 2a 20 45 69 74 68 65 72 20 75 6e 69 78 53  .** Either unixS
204e0 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73  hmNode.mutex mus
204f0 74 20 62 65 20 68 65 6c 64 20 6f 72 20 75 6e 69  t be held or uni
20500 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30  xShmNode.nRef==0
20510 20 61 6e 64 0a 2a 2a 20 75 6e 69 78 4d 75 74 65   and.** unixMute
20520 78 48 65 6c 64 28 29 20 69 73 20 74 72 75 65 20  xHeld() is true 
20530 77 68 65 6e 20 72 65 61 64 69 6e 67 20 6f 72 20  when reading or 
20540 77 72 69 74 69 6e 67 20 61 6e 79 20 6f 74 68 65  writing any othe
20550 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68  r field.** in th
20560 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  is structure..*/
20570 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e  .struct unixShmN
20580 6f 64 65 20 7b 0a 20 20 75 6e 69 78 49 6e 6f 64  ode {.  unixInod
20590 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20  eInfo *pInode;  
205a0 20 20 20 2f 2a 20 75 6e 69 78 49 6e 6f 64 65 49     /* unixInodeI
205b0 6e 66 6f 20 74 68 61 74 20 6f 77 6e 73 20 74 68  nfo that owns th
205c0 69 73 20 53 48 4d 20 6e 6f 64 65 20 2a 2f 0a 20  is SHM node */. 
205d0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
205e0 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d  mutex;      /* M
205f0 75 74 65 78 20 74 6f 20 61 63 63 65 73 73 20 74  utex to access t
20600 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  his object */.  
20610 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
20620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
20630 6d 65 20 6f 66 20 74 68 65 20 6d 6d 61 70 70 65  me of the mmappe
20640 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  d file */.  int 
20650 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
20660 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66         /* Open f
20670 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
20680 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e  /.  int szRegion
20690 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
206a0 2a 20 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64  * Size of shared
206b0 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20  -memory regions 
206c0 2a 2f 0a 20 20 75 31 36 20 6e 52 65 67 69 6f 6e  */.  u16 nRegion
206d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
206e0 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79  /* Size of array
206f0 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 75   apRegion */.  u
20700 38 20 69 73 52 65 61 64 6f 6e 6c 79 3b 20 20 20  8 isReadonly;   
20710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
20720 65 20 69 66 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  e if read-only *
20730 2f 0a 20 20 63 68 61 72 20 2a 2a 61 70 52 65 67  /.  char **apReg
20740 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ion;           /
20750 2a 20 41 72 72 61 79 20 6f 66 20 6d 61 70 70 65  * Array of mappe
20760 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  d shared-memory 
20770 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  regions */.  int
20780 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
20790 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
207a0 72 20 6f 66 20 75 6e 69 78 53 68 6d 20 6f 62 6a  r of unixShm obj
207b0 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ects pointing to
207c0 20 74 68 69 73 20 2a 2f 0a 20 20 75 6e 69 78 53   this */.  unixS
207d0 68 6d 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20  hm *pFirst;     
207e0 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 75 6e 69        /* All uni
207f0 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69  xShm objects poi
20800 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f  nting to this */
20810 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
20820 45 42 55 47 0a 20 20 75 38 20 65 78 63 6c 4d 61  EBUG.  u8 exclMa
20830 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
20840 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63    /* Mask of exc
20850 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c  lusive locks hel
20860 64 20 2a 2f 0a 20 20 75 38 20 73 68 61 72 65 64  d */.  u8 shared
20870 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
20880 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61    /* Mask of sha
20890 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  red locks held *
208a0 2f 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64  /.  u8 nextShmId
208b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
208c0 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65  * Next available
208d0 20 75 6e 69 78 53 68 6d 2e 69 64 20 76 61 6c 75   unixShm.id valu
208e0 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  e */.#endif.};..
208f0 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20  /*.** Structure 
20900 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20  used internally 
20910 62 79 20 74 68 69 73 20 56 46 53 20 74 6f 20 72  by this VFS to r
20920 65 63 6f 72 64 20 74 68 65 20 73 74 61 74 65 20  ecord the state 
20930 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68  of an.** open sh
20940 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e  ared memory conn
20950 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ection..**.** Th
20960 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
20970 64 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a  ds are initializ
20980 65 64 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a  ed when this obj
20990 65 63 74 20 69 73 20 63 72 65 61 74 65 64 20 61  ect is created a
209a0 6e 64 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f  nd.** are read-o
209b0 6e 6c 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a  nly thereafter:.
209c0 2a 2a 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d  **.**    unixShm
209d0 2e 70 46 69 6c 65 0a 2a 2a 20 20 20 20 75 6e 69  .pFile.**    uni
209e0 78 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c  xShm.id.**.** Al
209f0 6c 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61  l other fields a
20a00 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20  re read/write.  
20a10 54 68 65 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c  The unixShm.pFil
20a20 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20 62 65  e->mutex must be
20a30 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61   held.** while a
20a40 63 63 65 73 73 69 6e 67 20 61 6e 79 20 72 65 61  ccessing any rea
20a50 64 2f 77 72 69 74 65 20 66 69 65 6c 64 73 2e 0a  d/write fields..
20a60 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68  */.struct unixSh
20a70 6d 20 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64  m {.  unixShmNod
20a80 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20  e *pShmNode;    
20a90 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
20aa0 6e 67 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f  ng unixShmNode o
20ab0 62 6a 65 63 74 20 2a 2f 0a 20 20 75 6e 69 78 53  bject */.  unixS
20ac0 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20  hm *pNext;      
20ad0 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e        /* Next un
20ae0 69 78 53 68 6d 20 77 69 74 68 20 74 68 65 20 73  ixShm with the s
20af0 61 6d 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  ame unixShmNode 
20b00 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78  */.  u8 hasMutex
20b10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20b20 2f 2a 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69  /* True if holdi
20b30 6e 67 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f  ng the unixShmNo
20b40 64 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75 38  de mutex */.  u8
20b50 20 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20   id;            
20b60 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64 20 6f           /* Id o
20b70 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  f this connectio
20b80 6e 20 77 69 74 68 69 6e 20 69 74 73 20 75 6e 69  n within its uni
20b90 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 31  xShmNode */.  u1
20ba0 36 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20  6 sharedMask;   
20bb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
20bc0 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73   of shared locks
20bd0 20 68 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65   held */.  u16 e
20be0 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  xclMask;        
20bf0 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
20c00 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73   exclusive locks
20c10 20 68 65 6c 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a   held */.};../*.
20c20 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75 73 65  ** Constants use
20c30 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f  d for locking.*/
20c40 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48  .#define UNIX_SH
20c50 4d 5f 42 41 53 45 20 20 20 28 28 32 32 2b 53 51  M_BASE   ((22+SQ
20c60 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a  LITE_SHM_NLOCK)*
20c70 34 29 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69  4)         /* fi
20c80 72 73 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f  rst lock byte */
20c90 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48  .#define UNIX_SH
20ca0 4d 5f 44 4d 53 20 20 20 20 28 55 4e 49 58 5f 53  M_DMS    (UNIX_S
20cb0 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53  HM_BASE+SQLITE_S
20cc0 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65  HM_NLOCK)  /* de
20cd0 61 64 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a  adman switch */.
20ce0 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 70 6f 73  ./*.** Apply pos
20cf0 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  ix advisory lock
20d00 73 20 66 6f 72 20 61 6c 6c 20 62 79 74 65 73 20  s for all bytes 
20d10 66 72 6f 6d 20 6f 66 73 74 20 74 68 72 6f 75 67  from ofst throug
20d20 68 20 6f 66 73 74 2b 6e 2d 31 2e 0a 2a 2a 0a 2a  h ofst+n-1..**.*
20d30 2a 20 4c 6f 63 6b 73 20 62 6c 6f 63 6b 20 69 66  * Locks block if
20d40 20 74 68 65 20 6d 61 73 6b 20 69 73 20 65 78 61   the mask is exa
20d50 63 74 6c 79 20 55 4e 49 58 5f 53 48 4d 5f 43 20  ctly UNIX_SHM_C 
20d60 61 6e 64 20 61 72 65 20 6e 6f 6e 2d 62 6c 6f 63  and are non-bloc
20d70 6b 69 6e 67 0a 2a 2a 20 6f 74 68 65 72 77 69 73  king.** otherwis
20d80 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
20d90 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f   unixShmSystemLo
20da0 63 6b 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ck(.  unixFile *
20db0 70 46 69 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20  pFile,       /* 
20dc0 4f 70 65 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  Open connection 
20dd0 74 6f 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20  to the WAL file 
20de0 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70  */.  int lockTyp
20df0 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  e,          /* F
20e00 5f 55 4e 4c 43 4b 2c 20 46 5f 52 44 4c 43 4b 2c  _UNLCK, F_RDLCK,
20e10 20 6f 72 20 46 5f 57 52 4c 43 4b 20 2a 2f 0a 20   or F_WRLCK */. 
20e20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20   int ofst,      
20e30 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
20e40 20 62 79 74 65 20 6f 66 20 74 68 65 20 6c 6f 63   byte of the loc
20e50 6b 69 6e 67 20 72 61 6e 67 65 20 2a 2f 0a 20 20  king range */.  
20e60 69 6e 74 20 6e 20 20 20 20 20 20 20 20 20 20 20  int n           
20e70 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
20e80 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63   of bytes to loc
20e90 6b 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53 68  k */.){.  unixSh
20ea0 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
20eb0 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20   /* Apply locks 
20ec0 74 6f 20 74 68 69 73 20 6f 70 65 6e 20 73 68 61  to this open sha
20ed0 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65  red-memory segme
20ee0 6e 74 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 66  nt */.  struct f
20ef0 6c 6f 63 6b 20 66 3b 20 20 20 20 20 20 20 20 2f  lock f;        /
20f00 2a 20 54 68 65 20 70 6f 73 69 78 20 61 64 76 69  * The posix advi
20f10 73 6f 72 79 20 6c 6f 63 6b 69 6e 67 20 73 74 72  sory locking str
20f20 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20  ucture */.  int 
20f30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
20f40 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
20f50 65 20 66 6f 72 6d 20 66 63 6e 74 6c 28 29 20 2a  e form fcntl() *
20f60 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73 20 74  /..  /* Access t
20f70 6f 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64  o the unixShmNod
20f80 65 20 6f 62 6a 65 63 74 20 69 73 20 73 65 72 69  e object is seri
20f90 61 6c 69 7a 65 64 20 62 79 20 74 68 65 20 63 61  alized by the ca
20fa0 6c 6c 65 72 20 2a 2f 0a 20 20 70 53 68 6d 4e 6f  ller */.  pShmNo
20fb0 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
20fc0 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20  de->pShmNode;.  
20fd0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
20fe0 6d 75 74 65 78 5f 68 65 6c 64 28 70 53 68 6d 4e  mutex_held(pShmN
20ff0 6f 64 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70  ode->mutex) || p
21000 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30  ShmNode->nRef==0
21010 20 29 3b 0a 0a 20 20 2f 2a 20 53 68 61 72 65 64   );..  /* Shared
21020 20 6c 6f 63 6b 73 20 6e 65 76 65 72 20 73 70 61   locks never spa
21030 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  n more than one 
21040 62 79 74 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  byte */.  assert
21050 28 20 6e 3d 3d 31 20 7c 7c 20 6c 6f 63 6b 54 79  ( n==1 || lockTy
21060 70 65 21 3d 46 5f 52 44 4c 43 4b 20 29 3b 0a 0a  pe!=F_RDLCK );..
21070 20 20 2f 2a 20 4c 6f 63 6b 73 20 61 72 65 20 77    /* Locks are w
21080 69 74 68 69 6e 20 72 61 6e 67 65 20 2a 2f 0a 20  ithin range */. 
21090 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 26 26   assert( n>=1 &&
210a0 20 6e 3c 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c   n<SQLITE_SHM_NL
210b0 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 53  OCK );..  if( pS
210c0 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a  hmNode->h>=0 ){.
210d0 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
210e0 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61  e the locking pa
210f0 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20 20  rameters */.    
21100 6d 65 6d 73 65 74 28 26 66 2c 20 30 2c 20 73 69  memset(&f, 0, si
21110 7a 65 6f 66 28 66 29 29 3b 0a 20 20 20 20 66 2e  zeof(f));.    f.
21120 6c 5f 74 79 70 65 20 3d 20 6c 6f 63 6b 54 79 70  l_type = lockTyp
21130 65 3b 0a 20 20 20 20 66 2e 6c 5f 77 68 65 6e 63  e;.    f.l_whenc
21140 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
21150 20 20 66 2e 6c 5f 73 74 61 72 74 20 3d 20 6f 66    f.l_start = of
21160 73 74 3b 0a 20 20 20 20 66 2e 6c 5f 6c 65 6e 20  st;.    f.l_len 
21170 3d 20 6e 3b 0a 0a 20 20 20 20 72 63 20 3d 20 6f  = n;..    rc = o
21180 73 46 63 6e 74 6c 28 70 53 68 6d 4e 6f 64 65 2d  sFcntl(pShmNode-
21190 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 66 29  >h, F_SETLK, &f)
211a0 3b 0a 20 20 20 20 72 63 20 3d 20 28 72 63 21 3d  ;.    rc = (rc!=
211b0 28 2d 31 29 29 20 3f 20 53 51 4c 49 54 45 5f 4f  (-1)) ? SQLITE_O
211c0 4b 20 3a 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  K : SQLITE_BUSY;
211d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74  .  }..  /* Updat
211e0 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 6f 63  e the global loc
211f0 6b 20 73 74 61 74 65 20 61 6e 64 20 64 6f 20 64  k state and do d
21200 65 62 75 67 20 74 72 61 63 69 6e 67 20 2a 2f 0a  ebug tracing */.
21210 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
21220 42 55 47 0a 20 20 7b 20 75 31 36 20 6d 61 73 6b  BUG.  { u16 mask
21230 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48  ;.  OSTRACE(("SH
21240 4d 2d 4c 4f 43 4b 20 22 29 29 3b 0a 20 20 6d 61  M-LOCK "));.  ma
21250 73 6b 20 3d 20 6f 66 73 74 3e 33 31 20 3f 20 30  sk = ofst>31 ? 0
21260 78 66 66 66 66 20 3a 20 28 31 3c 3c 28 6f 66 73  xffff : (1<<(ofs
21270 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74  t+n)) - (1<<ofst
21280 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
21290 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
212a0 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e  ( lockType==F_UN
212b0 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54  LCK ){.      OST
212c0 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64  RACE(("unlock %d
212d0 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20   ok", ofst));.  
212e0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78      pShmNode->ex
212f0 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  clMask &= ~mask;
21300 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
21310 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e  >sharedMask &= ~
21320 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20  mask;.    }else 
21330 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  if( lockType==F_
21340 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f  RDLCK ){.      O
21350 53 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c 6f  STRACE(("read-lo
21360 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29  ck %d ok", ofst)
21370 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  );.      pShmNod
21380 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e  e->exclMask &= ~
21390 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d  mask;.      pShm
213a0 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b  Node->sharedMask
213b0 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 65   |= mask;.    }e
213c0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
213d0 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57  t( lockType==F_W
213e0 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53  RLCK );.      OS
213f0 54 52 41 43 45 28 28 22 77 72 69 74 65 2d 6c 6f  TRACE(("write-lo
21400 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29  ck %d ok", ofst)
21410 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  );.      pShmNod
21420 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d  e->exclMask |= m
21430 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  ask;.      pShmN
21440 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20  ode->sharedMask 
21450 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a  &= ~mask;.    }.
21460 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
21470 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c   lockType==F_UNL
21480 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  CK ){.      OSTR
21490 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20  ACE(("unlock %d 
214a0 66 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b  failed", ofst));
214b0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  .    }else if( l
214c0 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  ockType==F_RDLCK
214d0 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   ){.      OSTRAC
214e0 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 66 61  E(("read-lock fa
214f0 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 7d 65 6c  iled"));.    }el
21500 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
21510 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52  ( lockType==F_WR
21520 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53 54  LCK );.      OST
21530 52 41 43 45 28 28 22 77 72 69 74 65 2d 6c 6f 63  RACE(("write-loc
21540 6b 20 25 64 20 66 61 69 6c 65 64 22 2c 20 6f 66  k %d failed", of
21550 73 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  st));.    }.  }.
21560 20 20 4f 53 54 52 41 43 45 28 28 22 20 2d 20 61    OSTRACE((" - a
21570 66 74 65 72 77 61 72 64 73 20 25 30 33 78 2c 25  fterwards %03x,%
21580 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  03x\n",.        
21590 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61     pShmNode->sha
215a0 72 65 64 4d 61 73 6b 2c 20 70 53 68 6d 4e 6f 64  redMask, pShmNod
215b0 65 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20  e->exclMask));. 
215c0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
215d0 75 72 6e 20 72 63 3b 20 20 20 20 20 20 20 20 0a  urn rc;        .
215e0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
215f0 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6e 75 6d 62  the minimum numb
21600 65 72 20 6f 66 20 33 32 4b 42 20 73 68 6d 20 72  er of 32KB shm r
21610 65 67 69 6f 6e 73 20 74 68 61 74 20 73 68 6f 75  egions that shou
21620 6c 64 20 62 65 20 6d 61 70 70 65 64 20 61 74 0a  ld be mapped at.
21630 2a 2a 20 61 20 74 69 6d 65 2c 20 61 73 73 75 6d  ** a time, assum
21640 69 6e 67 20 74 68 61 74 20 65 61 63 68 20 6d 61  ing that each ma
21650 70 70 69 6e 67 20 6d 75 73 74 20 62 65 20 61 6e  pping must be an
21660 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c   integer multipl
21670 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 75 72 72  e of the.** curr
21680 65 6e 74 20 73 79 73 74 65 6d 20 70 61 67 65 2d  ent system page-
21690 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 75 61  size..**.** Usua
216a0 6c 6c 79 2c 20 74 68 69 73 20 69 73 20 31 2e 20  lly, this is 1. 
216b0 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 73 65  The exception se
216c0 65 6d 73 20 74 6f 20 62 65 20 73 79 73 74 65 6d  ems to be system
216d0 73 20 74 68 61 74 20 61 72 65 20 63 6f 6e 66 69  s that are confi
216e0 67 75 72 65 64 0a 2a 2a 20 74 6f 20 75 73 65 20  gured.** to use 
216f0 36 34 4b 42 20 70 61 67 65 73 20 2d 20 69 6e 20  64KB pages - in 
21700 74 68 69 73 20 63 61 73 65 20 65 61 63 68 20 6d  this case each m
21710 61 70 70 69 6e 67 20 6d 75 73 74 20 63 6f 76 65  apping must cove
21720 72 20 61 74 20 6c 65 61 73 74 20 74 77 6f 0a 2a  r at least two.*
21730 2a 20 73 68 6d 20 72 65 67 69 6f 6e 73 2e 0a 2a  * shm regions..*
21740 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
21750 78 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d 61 70  xShmRegionPerMap
21760 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 73 68  (void){.  int sh
21770 6d 73 7a 20 3d 20 33 32 2a 31 30 32 34 3b 20 20  msz = 32*1024;  
21780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 48 4d            /* SHM
21790 20 72 65 67 69 6f 6e 20 73 69 7a 65 20 2a 2f 0a   region size */.
217a0 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 6f 73 47    int pgsz = osG
217b0 65 74 70 61 67 65 73 69 7a 65 28 29 3b 20 20 20  etpagesize();   
217c0 2f 2a 20 53 79 73 74 65 6d 20 70 61 67 65 20 73  /* System page s
217d0 69 7a 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ize */.  assert(
217e0 20 28 28 70 67 73 7a 2d 31 29 26 70 67 73 7a 29   ((pgsz-1)&pgsz)
217f0 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 50 61 67 65  ==0 );   /* Page
21800 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20   size must be a 
21810 70 6f 77 65 72 20 6f 66 20 32 20 2a 2f 0a 20 20  power of 2 */.  
21820 69 66 28 20 70 67 73 7a 3c 73 68 6d 73 7a 20 29  if( pgsz<shmsz )
21830 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74   return 1;.  ret
21840 75 72 6e 20 70 67 73 7a 2f 73 68 6d 73 7a 3b 0a  urn pgsz/shmsz;.
21850 7d 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74  }../*.** Purge t
21860 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 4c 69  he unixShmNodeLi
21870 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65  st list of all e
21880 6e 74 72 69 65 73 20 77 69 74 68 20 75 6e 69 78  ntries with unix
21890 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e  ShmNode.nRef==0.
218a0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e  .**.** This is n
218b0 6f 74 20 61 20 56 46 53 20 73 68 61 72 65 64 2d  ot a VFS shared-
218c0 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69  memory method; i
218d0 74 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66  t is a utility f
218e0 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a  unction called.*
218f0 2a 20 62 79 20 56 46 53 20 73 68 61 72 65 64 2d  * by VFS shared-
21900 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a  memory methods..
21910 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
21920 6e 69 78 53 68 6d 50 75 72 67 65 28 75 6e 69 78  nixShmPurge(unix
21930 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20 75 6e  File *pFd){.  un
21940 69 78 53 68 6d 4e 6f 64 65 20 2a 70 20 3d 20 70  ixShmNode *p = p
21950 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
21960 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Node;.  assert( 
21970 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
21980 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 41 4c  );.  if( p && AL
21990 57 41 59 53 28 70 2d 3e 6e 52 65 66 3d 3d 30 29  WAYS(p->nRef==0)
219a0 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 68 6d   ){.    int nShm
219b0 50 65 72 4d 61 70 20 3d 20 75 6e 69 78 53 68 6d  PerMap = unixShm
219c0 52 65 67 69 6f 6e 50 65 72 4d 61 70 28 29 3b 0a  RegionPerMap();.
219d0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 61      int i;.    a
219e0 73 73 65 72 74 28 20 70 2d 3e 70 49 6e 6f 64 65  ssert( p->pInode
219f0 3d 3d 70 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b  ==pFd->pInode );
21a00 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
21a10 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65 78  ex_free(p->mutex
21a20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
21a30 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b  i<p->nRegion; i+
21a40 3d 6e 53 68 6d 50 65 72 4d 61 70 29 7b 0a 20 20  =nShmPerMap){.  
21a50 20 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20      if( p->h>=0 
21a60 29 7b 0a 20 20 20 20 20 20 20 20 6f 73 4d 75 6e  ){.        osMun
21a70 6d 61 70 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b  map(p->apRegion[
21a80 69 5d 2c 20 70 2d 3e 73 7a 52 65 67 69 6f 6e 29  i], p->szRegion)
21a90 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
21aa0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
21ab0 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b  ree(p->apRegion[
21ac0 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
21ad0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
21ae0 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e 29  ree(p->apRegion)
21af0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d  ;.    if( p->h>=
21b00 30 20 29 7b 0a 20 20 20 20 20 20 72 6f 62 75 73  0 ){.      robus
21b10 74 5f 63 6c 6f 73 65 28 70 46 64 2c 20 70 2d 3e  t_close(pFd, p->
21b20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
21b30 20 20 20 20 70 2d 3e 68 20 3d 20 2d 31 3b 0a 20      p->h = -1;. 
21b40 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 49 6e 6f     }.    p->pIno
21b50 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 30  de->pShmNode = 0
21b60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
21b70 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ee(p);.  }.}../*
21b80 0a 2a 2a 20 4f 70 65 6e 20 61 20 73 68 61 72 65  .** Open a share
21b90 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73  d-memory area as
21ba0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6f 70  sociated with op
21bb0 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
21bc0 20 70 44 62 46 64 2e 20 20 0a 2a 2a 20 54 68 69   pDbFd.  .** Thi
21bd0 73 20 70 61 72 74 69 63 75 6c 61 72 20 69 6d 70  s particular imp
21be0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73  lementation uses
21bf0 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 73 2e 0a   mmapped files..
21c00 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 75  **.** The file u
21c10 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
21c20 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69   shared-memory i
21c30 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69  s in the same di
21c40 72 65 63 74 6f 72 79 0a 2a 2a 20 61 73 20 74 68  rectory.** as th
21c50 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  e open database 
21c60 66 69 6c 65 20 61 6e 64 20 68 61 73 20 74 68 65  file and has the
21c70 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68   same name as th
21c80 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 0a  e open database.
21c90 2a 2a 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  ** file with the
21ca0 20 22 2d 73 68 6d 22 20 73 75 66 66 69 78 20 61   "-shm" suffix a
21cb0 64 64 65 64 2e 20 20 46 6f 72 20 65 78 61 6d 70  dded.  For examp
21cc0 6c 65 2c 20 69 66 20 74 68 65 20 64 61 74 61 62  le, if the datab
21cd0 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 22  ase file.** is "
21ce0 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66  /home/user1/conf
21cf0 69 67 2e 64 62 22 20 74 68 65 6e 20 74 68 65 20  ig.db" then the 
21d00 66 69 6c 65 20 74 68 61 74 20 69 73 20 63 72 65  file that is cre
21d10 61 74 65 64 20 61 6e 64 20 6d 6d 61 70 70 65 64  ated and mmapped
21d20 0a 2a 2a 20 66 6f 72 20 73 68 61 72 65 64 20 6d  .** for shared m
21d30 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 63 61  emory will be ca
21d40 6c 6c 65 64 20 22 2f 68 6f 6d 65 2f 75 73 65 72  lled "/home/user
21d50 31 2f 63 6f 6e 66 69 67 2e 64 62 2d 73 68 6d 22  1/config.db-shm"
21d60 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74 68 65  .  .**.** Anothe
21d70 72 20 61 70 70 72 6f 61 63 68 20 74 6f 20 69 73  r approach to is
21d80 20 74 6f 20 75 73 65 20 66 69 6c 65 73 20 69 6e   to use files in
21d90 20 2f 64 65 76 2f 73 68 6d 20 6f 72 20 2f 64 65   /dev/shm or /de
21da0 76 2f 74 6d 70 20 6f 72 20 61 6e 0a 2a 2a 20 73  v/tmp or an.** s
21db0 6f 6d 65 20 6f 74 68 65 72 20 74 6d 70 66 73 20  ome other tmpfs 
21dc0 6d 6f 75 6e 74 2e 20 42 75 74 20 69 66 20 61 20  mount. But if a 
21dd0 66 69 6c 65 20 69 6e 20 61 20 64 69 66 66 65 72  file in a differ
21de0 65 6e 74 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a  ent directory.**
21df0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
21e00 73 65 20 66 69 6c 65 20 69 73 20 75 73 65 64 2c  se file is used,
21e10 20 74 68 65 6e 20 64 69 66 66 65 72 69 6e 67 20   then differing 
21e20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f  access permissio
21e30 6e 73 0a 2a 2a 20 6f 72 20 61 20 63 68 72 6f 6f  ns.** or a chroo
21e40 74 28 29 20 6d 69 67 68 74 20 63 61 75 73 65 20  t() might cause 
21e50 74 77 6f 20 64 69 66 66 65 72 65 6e 74 20 70 72  two different pr
21e60 6f 63 65 73 73 65 73 20 6f 6e 20 74 68 65 20 73  ocesses on the s
21e70 61 6d 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ame.** database 
21e80 74 6f 20 65 6e 64 20 75 70 20 75 73 69 6e 67 20  to end up using 
21e90 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65 73 20  different files 
21ea0 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  for shared memor
21eb0 79 20 2d 20 0a 2a 2a 20 6d 65 61 6e 69 6e 67 20  y - .** meaning 
21ec0 74 68 61 74 20 74 68 65 69 72 20 6d 65 6d 6f 72  that their memor
21ed0 79 20 77 6f 75 6c 64 20 6e 6f 74 20 72 65 61 6c  y would not real
21ee0 6c 79 20 62 65 20 73 68 61 72 65 64 20 2d 20 72  ly be shared - r
21ef0 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 69 6e 20 64  esulting.** in d
21f00 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
21f10 6f 6e 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73  on.  Nevertheles
21f20 73 2c 20 74 68 69 73 20 74 6d 70 66 73 20 66 69  s, this tmpfs fi
21f30 6c 65 20 75 73 61 67 65 0a 2a 2a 20 63 61 6e 20  le usage.** can 
21f40 62 65 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f  be enabled at co
21f50 6d 70 69 6c 65 2d 74 69 6d 65 20 75 73 69 6e 67  mpile-time using
21f60 20 2d 44 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49   -DSQLITE_SHM_DI
21f70 52 45 43 54 4f 52 59 3d 22 2f 64 65 76 2f 73 68  RECTORY="/dev/sh
21f80 6d 22 0a 2a 2a 20 6f 72 20 74 68 65 20 65 71 75  m".** or the equ
21f90 69 76 61 6c 65 6e 74 2e 20 20 54 68 65 20 75 73  ivalent.  The us
21fa0 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f  e of the SQLITE_
21fb0 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f  SHM_DIRECTORY co
21fc0 6d 70 69 6c 65 2d 74 69 6d 65 0a 2a 2a 20 6f 70  mpile-time.** op
21fd0 74 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 20  tion results in 
21fe0 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
21ff0 62 75 69 6c 64 20 6f 66 20 53 51 4c 69 74 65 3b  build of SQLite;
22000 20 20 62 75 69 6c 64 73 20 6f 66 20 53 51 4c 69    builds of SQLi
22010 74 65 0a 2a 2a 20 74 68 61 74 20 77 69 74 68 20  te.** that with 
22020 64 69 66 66 65 72 69 6e 67 20 53 51 4c 49 54 45  differing SQLITE
22030 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 73  _SHM_DIRECTORY s
22040 65 74 74 69 6e 67 73 20 61 74 74 65 6d 70 74 20  ettings attempt 
22050 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 73 61  to use the.** sa
22060 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  me database file
22070 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
22080 65 2c 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  e, database corr
22090 75 70 74 69 6f 6e 20 77 69 6c 6c 20 6c 69 6b 65  uption will like
220a0 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 54 68  ly.** result. Th
220b0 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  e SQLITE_SHM_DIR
220c0 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74  ECTORY compile-t
220d0 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 63 6f  ime option is co
220e0 6e 73 69 64 65 72 65 64 0a 2a 2a 20 22 75 6e 73  nsidered.** "uns
220f0 75 70 70 6f 72 74 65 64 22 20 61 6e 64 20 6d 61  upported" and ma
22100 79 20 67 6f 20 61 77 61 79 20 69 6e 20 61 20 66  y go away in a f
22110 75 74 75 72 65 20 53 51 4c 69 74 65 20 72 65 6c  uture SQLite rel
22120 65 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ease..**.** When
22130 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73   opening a new s
22140 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
22150 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69  e, if no other i
22160 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74  nstances of that
22170 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72  .** file are cur
22180 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20  rently open, in 
22190 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20  this process or 
221a0 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  in other process
221b0 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  es, then.** the 
221c0 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75  file must be tru
221d0 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c  ncated to zero l
221e0 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69 74  ength or have it
221f0 73 20 68 65 61 64 65 72 20 63 6c 65 61 72 65 64  s header cleared
22200 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f  ..**.** If the o
22210 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
22220 20 66 69 6c 65 20 28 70 44 62 46 64 29 20 69 73   file (pDbFd) is
22230 20 75 73 69 6e 67 20 74 68 65 20 22 75 6e 69 78   using the "unix
22240 2d 65 78 63 6c 22 20 56 46 53 0a 2a 2a 20 74 68  -excl" VFS.** th
22250 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6e  at means that an
22260 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
22270 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
22280 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
22290 0a 2a 2a 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  .** that no othe
222a0 72 20 70 72 6f 63 65 73 73 65 73 20 61 72 65 20  r processes are 
222b0 61 62 6c 65 20 74 6f 20 72 65 61 64 20 6f 72 20  able to read or 
222c0 77 72 69 74 65 20 74 68 65 20 64 61 74 61 62 61  write the databa
222d0 73 65 2e 20 20 49 6e 0a 2a 2a 20 74 68 61 74 20  se.  In.** that 
222e0 63 61 73 65 2c 20 77 65 20 64 6f 20 6e 6f 74 20  case, we do not 
222f0 72 65 61 6c 6c 79 20 6e 65 65 64 20 73 68 61 72  really need shar
22300 65 64 20 6d 65 6d 6f 72 79 2e 20 20 4e 6f 20 73  ed memory.  No s
22310 68 61 72 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20  hared memory.** 
22320 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2e  file is created.
22330 20 20 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d    The shared mem
22340 6f 72 79 20 77 69 6c 6c 20 62 65 20 73 69 6d 75  ory will be simu
22350 6c 61 74 65 64 20 77 69 74 68 20 68 65 61 70 20  lated with heap 
22360 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  memory..*/.stati
22370 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 53 68  c int unixOpenSh
22380 61 72 65 64 4d 65 6d 6f 72 79 28 75 6e 69 78 46  aredMemory(unixF
22390 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20 20 73  ile *pDbFd){.  s
223a0 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 2a 70  truct unixShm *p
223b0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
223c0 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * The connection
223d0 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f   to be opened */
223e0 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 53 68  .  struct unixSh
223f0 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
22400 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
22410 79 69 6e 67 20 6d 6d 61 70 70 65 64 20 66 69 6c  ying mmapped fil
22420 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
22430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22440 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
22450 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 69 78 49   code */.  unixI
22460 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
22470 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
22480 65 20 69 6e 6f 64 65 20 6f 66 20 66 64 20 2a 2f  e inode of fd */
22490 0a 20 20 63 68 61 72 20 2a 7a 53 68 6d 46 69 6c  .  char *zShmFil
224a0 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
224b0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
224c0 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20  e file used for 
224d0 53 48 4d 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68  SHM */.  int nSh
224e0 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  mFilename;      
224f0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
22500 20 6f 66 20 74 68 65 20 53 48 4d 20 66 69 6c 65   of the SHM file
22510 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  name in bytes */
22520 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
22530 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65  space for the ne
22540 77 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74  w unixShm object
22550 2e 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74  . */.  p = sqlit
22560 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a  e3_malloc64( siz
22570 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
22580 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   p==0 ) return S
22590 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d  QLITE_NOMEM;.  m
225a0 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
225b0 6f 66 28 2a 70 29 29 3b 0a 20 20 61 73 73 65 72  of(*p));.  asser
225c0 74 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d  t( pDbFd->pShm==
225d0 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  0 );..  /* Check
225e0 20 74 6f 20 73 65 65 20 69 66 20 61 20 75 6e 69   to see if a uni
225f0 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20  xShmNode object 
22600 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 20  already exists. 
22610 52 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e  Reuse an existin
22620 67 0a 20 20 2a 2a 20 6f 6e 65 20 69 66 20 70 72  g.  ** one if pr
22630 65 73 65 6e 74 2e 20 43 72 65 61 74 65 20 61 20  esent. Create a 
22640 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73  new one if neces
22650 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69  sary..  */.  uni
22660 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
22670 20 70 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d   pInode = pDbFd-
22680 3e 70 49 6e 6f 64 65 3b 0a 20 20 70 53 68 6d 4e  >pInode;.  pShmN
22690 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 53  ode = pInode->pS
226a0 68 6d 4e 6f 64 65 3b 0a 20 20 69 66 28 20 70 53  hmNode;.  if( pS
226b0 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20  hmNode==0 ){.   
226c0 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74   struct stat sSt
226d0 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  at;             
226e0 20 20 20 20 2f 2a 20 66 73 74 61 74 28 29 20 69      /* fstat() i
226f0 6e 66 6f 20 66 6f 72 20 64 61 74 61 62 61 73 65  nfo for database
22700 20 66 69 6c 65 20 2a 2f 0a 23 69 66 6e 64 65 66   file */.#ifndef
22710 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
22720 43 54 4f 52 59 0a 20 20 20 20 63 6f 6e 73 74 20  CTORY.    const 
22730 63 68 61 72 20 2a 7a 42 61 73 65 50 61 74 68 20  char *zBasePath 
22740 3d 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 3b 0a  = pDbFd->zPath;.
22750 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43  #endif..    /* C
22760 61 6c 6c 20 66 73 74 61 74 28 29 20 74 6f 20 66  all fstat() to f
22770 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 70 65  igure out the pe
22780 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65  rmissions on the
22790 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
227a0 49 66 0a 20 20 20 20 2a 2a 20 61 20 6e 65 77 20  If.    ** a new 
227b0 2a 2d 73 68 6d 20 66 69 6c 65 20 69 73 20 63 72  *-shm file is cr
227c0 65 61 74 65 64 2c 20 61 6e 20 61 74 74 65 6d 70  eated, an attemp
227d0 74 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74  t will be made t
227e0 6f 20 63 72 65 61 74 65 20 69 74 0a 20 20 20 20  o create it.    
227f0 2a 2a 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ** with the same
22800 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 20 20   permissions..  
22810 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 73 46    */.    if( osF
22820 73 74 61 74 28 70 44 62 46 64 2d 3e 68 2c 20 26  stat(pDbFd->h, &
22830 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20  sStat) ){.      
22840 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
22850 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 20 20 67  R_FSTAT;.      g
22860 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
22870 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
22880 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
22890 54 4f 52 59 0a 20 20 20 20 6e 53 68 6d 46 69 6c  TORY.    nShmFil
228a0 65 6e 61 6d 65 20 3d 20 73 69 7a 65 6f 66 28 53  ename = sizeof(S
228b0 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
228c0 4f 52 59 29 20 2b 20 33 31 3b 0a 23 65 6c 73 65  ORY) + 31;.#else
228d0 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d  .    nShmFilenam
228e0 65 20 3d 20 36 20 2b 20 28 69 6e 74 29 73 74 72  e = 6 + (int)str
228f0 6c 65 6e 28 7a 42 61 73 65 50 61 74 68 29 3b 0a  len(zBasePath);.
22900 23 65 6e 64 69 66 0a 20 20 20 20 70 53 68 6d 4e  #endif.    pShmN
22910 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ode = sqlite3_ma
22920 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a  lloc64( sizeof(*
22930 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 53 68 6d  pShmNode) + nShm
22940 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20 20 20  Filename );.    
22950 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20  if( pShmNode==0 
22960 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
22970 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
22980 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f    goto shm_open_
22990 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  err;.    }.    m
229a0 65 6d 73 65 74 28 70 53 68 6d 4e 6f 64 65 2c 20  emset(pShmNode, 
229b0 30 2c 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e  0, sizeof(*pShmN
229c0 6f 64 65 29 2b 6e 53 68 6d 46 69 6c 65 6e 61 6d  ode)+nShmFilenam
229d0 65 29 3b 0a 20 20 20 20 7a 53 68 6d 46 69 6c 65  e);.    zShmFile
229e0 6e 61 6d 65 20 3d 20 70 53 68 6d 4e 6f 64 65 2d  name = pShmNode-
229f0 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68  >zFilename = (ch
22a00 61 72 2a 29 26 70 53 68 6d 4e 6f 64 65 5b 31 5d  ar*)&pShmNode[1]
22a10 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
22a20 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20  SHM_DIRECTORY.  
22a30 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
22a40 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c  tf(nShmFilename,
22a50 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 0a   zShmFilename, .
22a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a70 20 20 20 20 20 53 51 4c 49 54 45 5f 53 48 4d 5f       SQLITE_SHM_
22a80 44 49 52 45 43 54 4f 52 59 20 22 2f 73 71 6c 69  DIRECTORY "/sqli
22a90 74 65 2d 73 68 6d 2d 25 78 2d 25 78 22 2c 0a 20  te-shm-%x-%x",. 
22aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ab0 20 20 20 20 28 75 33 32 29 73 53 74 61 74 2e 73      (u32)sStat.s
22ac0 74 5f 69 6e 6f 2c 20 28 75 33 32 29 73 53 74 61  t_ino, (u32)sSta
22ad0 74 2e 73 74 5f 64 65 76 29 3b 0a 23 65 6c 73 65  t.st_dev);.#else
22ae0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
22af0 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61  rintf(nShmFilena
22b00 6d 65 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65  me, zShmFilename
22b10 2c 20 22 25 73 2d 73 68 6d 22 2c 20 7a 42 61 73  , "%s-shm", zBas
22b20 65 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69  ePath);.    sqli
22b30 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70  te3FileSuffix3(p
22b40 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 7a 53 68  DbFd->zPath, zSh
22b50 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64  mFilename);.#end
22b60 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  if.    pShmNode-
22b70 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 70 44 62  >h = -1;.    pDb
22b80 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
22b90 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b  Node = pShmNode;
22ba0 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  .    pShmNode->p
22bb0 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70  Inode = pDbFd->p
22bc0 49 6e 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e  Inode;.    pShmN
22bd0 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c  ode->mutex = sql
22be0 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
22bf0 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41  (SQLITE_MUTEX_FA
22c00 53 54 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68  ST);.    if( pSh
22c10 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20  mNode->mutex==0 
22c20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
22c30 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
22c40 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f    goto shm_open_
22c50 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  err;.    }..    
22c60 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  if( pInode->bPro
22c70 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20  cessLock==0 ){. 
22c80 20 20 20 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61       int openFla
22c90 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f  gs = O_RDWR | O_
22ca0 43 52 45 41 54 3b 0a 20 20 20 20 20 20 69 66 28  CREAT;.      if(
22cb0 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f   sqlite3_uri_boo
22cc0 6c 65 61 6e 28 70 44 62 46 64 2d 3e 7a 50 61 74  lean(pDbFd->zPat
22cd0 68 2c 20 22 72 65 61 64 6f 6e 6c 79 5f 73 68 6d  h, "readonly_shm
22ce0 22 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  ", 0) ){.       
22cf0 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52   openFlags = O_R
22d00 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 70  DONLY;.        p
22d10 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f  ShmNode->isReado
22d20 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  nly = 1;.      }
22d30 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
22d40 3e 68 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  >h = robust_open
22d50 28 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 6f  (zShmFilename, o
22d60 70 65 6e 46 6c 61 67 73 2c 20 28 73 53 74 61 74  penFlags, (sStat
22d70 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37 29 29 3b  .st_mode&0777));
22d80 0a 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e  .      if( pShmN
22d90 6f 64 65 2d 3e 68 3c 30 20 29 7b 0a 20 20 20 20  ode->h<0 ){.    
22da0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
22db0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
22dc0 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65  TOPEN_BKPT, "ope
22dd0 6e 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65  n", zShmFilename
22de0 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
22df0 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
22e00 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
22e10 49 66 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  If this process 
22e20 69 73 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f  is running as ro
22e30 6f 74 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  ot, make sure th
22e40 61 74 20 74 68 65 20 53 48 4d 20 66 69 6c 65 0a  at the SHM file.
22e50 20 20 20 20 20 20 2a 2a 20 69 73 20 6f 77 6e 65        ** is owne
22e60 64 20 62 79 20 74 68 65 20 73 61 6d 65 20 75 73  d by the same us
22e70 65 72 20 74 68 61 74 20 6f 77 6e 73 20 74 68 65  er that owns the
22e80 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
22e90 73 65 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a  se.  Otherwise,.
22ea0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69        ** the ori
22eb0 67 69 6e 61 6c 20 6f 77 6e 65 72 20 77 69 6c 6c  ginal owner will
22ec0 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20   not be able to 
22ed0 63 6f 6e 6e 65 63 74 2e 0a 20 20 20 20 20 20 2a  connect..      *
22ee0 2f 0a 20 20 20 20 20 20 72 6f 62 75 73 74 46 63  /.      robustFc
22ef0 68 6f 77 6e 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  hown(pShmNode->h
22f00 2c 20 73 53 74 61 74 2e 73 74 5f 75 69 64 2c 20  , sStat.st_uid, 
22f10 73 53 74 61 74 2e 73 74 5f 67 69 64 29 3b 0a 20  sStat.st_gid);. 
22f20 20 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b   .      /* Check
22f30 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68   to see if anoth
22f40 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f  er process is ho
22f50 6c 64 69 6e 67 20 74 68 65 20 64 65 61 64 2d 6d  lding the dead-m
22f60 61 6e 20 73 77 69 74 63 68 2e 0a 20 20 20 20 20  an switch..     
22f70 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e   ** If not, trun
22f80 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f  cate the file to
22f90 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2e 20 0a 20   zero length. . 
22fa0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
22fb0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
22fc0 20 20 20 20 69 66 28 20 75 6e 69 78 53 68 6d 53      if( unixShmS
22fd0 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c  ystemLock(pDbFd,
22fe0 20 46 5f 57 52 4c 43 4b 2c 20 55 4e 49 58 5f 53   F_WRLCK, UNIX_S
22ff0 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49  HM_DMS, 1)==SQLI
23000 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
23010 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75   if( robust_ftru
23020 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  ncate(pShmNode->
23030 68 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  h, 0) ){.       
23040 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
23050 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
23060 52 5f 53 48 4d 4f 50 45 4e 2c 20 22 66 74 72 75  R_SHMOPEN, "ftru
23070 6e 63 61 74 65 22 2c 20 7a 53 68 6d 46 69 6c 65  ncate", zShmFile
23080 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  name);.        }
23090 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
230a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
230b0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
230c0 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f   unixShmSystemLo
230d0 63 6b 28 70 44 62 46 64 2c 20 46 5f 52 44 4c 43  ck(pDbFd, F_RDLC
230e0 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c  K, UNIX_SHM_DMS,
230f0 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   1);.      }.   
23100 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
23110 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
23120 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d     }.  }..  /* M
23130 61 6b 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e  ake the new conn
23140 65 63 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f  ection a child o
23150 66 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64  f the unixShmNod
23160 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f  e */.  p->pShmNo
23170 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23  de = pShmNode;.#
23180 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
23190 55 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68  UG.  p->id = pSh
231a0 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64  mNode->nextShmId
231b0 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68  ++;.#endif.  pSh
231c0 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  mNode->nRef++;. 
231d0 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70   pDbFd->pShm = p
231e0 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  ;.  unixLeaveMut
231f0 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ex();..  /* The 
23200 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
23210 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20  on pShmNode has 
23220 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63  already been inc
23230 72 65 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20  remented under. 
23240 20 2a 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66   ** the cover of
23250 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75   the unixEnterMu
23260 74 65 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20  tex() mutex and 
23270 74 68 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d  the pointer from
23280 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73   the.  ** new (s
23290 74 72 75 63 74 20 75 6e 69 78 53 68 6d 29 20 6f  truct unixShm) o
232a0 62 6a 65 63 74 20 74 6f 20 74 68 65 20 70 53 68  bject to the pSh
232b0 6d 4e 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73  mNode has been s
232c0 65 74 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a  et. All that is.
232d0 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20    ** left to do 
232e0 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e  is to link the n
232f0 65 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74  ew object into t
23300 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73  he linked list s
23310 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20  tarting.  ** at 
23320 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
23330 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 64  . This must be d
23340 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e  one while holdin
23350 67 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e  g the pShmNode->
23360 6d 75 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65  mutex .  ** mute
23370 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  x..  */.  sqlite
23380 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
23390 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
233a0 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68    p->pNext = pSh
233b0 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20  mNode->pFirst;. 
233c0 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73   pShmNode->pFirs
233d0 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33  t = p;.  sqlite3
233e0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
233f0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
23400 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
23410 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  K;..  /* Jump he
23420 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20  re on any error 
23430 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a  */.shm_open_err:
23440 0a 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28  .  unixShmPurge(
23450 70 44 62 46 64 29 3b 20 20 20 20 20 20 20 2f 2a  pDbFd);       /*
23460 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73   This call frees
23470 20 70 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71   pShmNode if req
23480 75 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  uired */.  sqlit
23490 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 75 6e  e3_free(p);.  un
234a0 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
234b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
234c0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
234d0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
234e0 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65   obtain a pointe
234f0 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67  r to region iReg
23500 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73  ion of the .** s
23510 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73  hared-memory ass
23520 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
23530 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
23540 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79  d. Shared-memory
23550 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65   regions .** are
23560 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74 69   numbered starti
23570 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61  ng from zero. Ea
23580 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ch shared-memory
23590 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67   region is szReg
235a0 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e  ion .** bytes in
235b0 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   size..**.** If 
235c0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
235d0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
235e0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
235f0 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  pp is set to NUL
23600 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  L..**.** Otherwi
23610 73 65 2c 20 69 66 20 74 68 65 20 62 45 78 74 65  se, if the bExte
23620 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
23630 30 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  0 and the reques
23640 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ted shared-memor
23650 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20  y.** region has 
23660 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  not been allocat
23670 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e  ed (by any clien
23680 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65  t, including one
23690 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a   running in a.**
236a0 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73   separate proces
236b0 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20  s), then *pp is 
236c0 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20  set to NULL and 
236d0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
236e0 65 64 2e 20 49 66 20 0a 2a 2a 20 62 45 78 74 65  ed. If .** bExte
236f0 6e 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61  nd is non-zero a
23700 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64  nd the requested
23710 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
23720 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65  egion has not ye
23730 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63  t .** been alloc
23740 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f  ated, it is allo
23750 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75  cated by this fu
23760 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
23770 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f   the shared-memo
23780 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c  ry region has al
23790 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
237a0 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63  ated or is alloc
237b0 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20  ated by.** this 
237c0 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65  call as describe
237d0 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74  d above, then it
237e0 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20   is mapped into 
237f0 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 0a  this processes .
23800 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61 63 65  ** address space
23810 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
23820 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20  lready), *pp is 
23830 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
23840 74 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d  the mapped .** m
23850 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45  emory and SQLITE
23860 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  _OK returned..*/
23870 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
23880 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65  ShmMap(.  sqlite
23890 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20  3_file *fd,     
238a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
238b0 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61  dle open on data
238c0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
238d0 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20  nt iRegion,     
238e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
238f0 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72  * Region to retr
23900 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  ieve */.  int sz
23910 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20  Region,         
23920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
23930 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a  e of regions */.
23940 20 20 69 6e 74 20 62 45 78 74 65 6e 64 2c 20 20    int bExtend,  
23950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23960 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74    /* True to ext
23970 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65  end file if nece
23980 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20  ssary */.  void 
23990 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20  volatile **pp   
239a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
239b0 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79  T: Mapped memory
239c0 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c   */.){.  unixFil
239d0 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78  e *pDbFd = (unix
239e0 46 69 6c 65 2a 29 66 64 3b 0a 20 20 75 6e 69 78  File*)fd;.  unix
239f0 53 68 6d 20 2a 70 3b 0a 20 20 75 6e 69 78 53 68  Shm *p;.  unixSh
23a00 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
23a10 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
23a20 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 53 68  TE_OK;.  int nSh
23a30 6d 50 65 72 4d 61 70 20 3d 20 75 6e 69 78 53 68  mPerMap = unixSh
23a40 6d 52 65 67 69 6f 6e 50 65 72 4d 61 70 28 29 3b  mRegionPerMap();
23a50 0a 20 20 69 6e 74 20 6e 52 65 71 52 65 67 69 6f  .  int nReqRegio
23a60 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  n;..  /* If the 
23a70 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
23a80 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  le has not yet b
23a90 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e  een opened, open
23aa0 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69 66   it now. */.  if
23ab0 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30  ( pDbFd->pShm==0
23ac0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69   ){.    rc = uni
23ad0 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72  xOpenSharedMemor
23ae0 79 28 70 44 62 46 64 29 3b 0a 20 20 20 20 69 66  y(pDbFd);.    if
23af0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
23b00 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
23b10 0a 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70  ..  p = pDbFd->p
23b20 53 68 6d 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20  Shm;.  pShmNode 
23b30 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20  = p->pShmNode;. 
23b40 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
23b50 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
23b60 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
23b70 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e   szRegion==pShmN
23b80 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c  ode->szRegion ||
23b90 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
23ba0 6f 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  on==0 );.  asser
23bb0 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e  t( pShmNode->pIn
23bc0 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f  ode==pDbFd->pIno
23bd0 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  de );.  assert( 
23be0 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c  pShmNode->h>=0 |
23bf0 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d  | pDbFd->pInode-
23c00 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31  >bProcessLock==1
23c10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
23c20 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70  hmNode->h<0 || p
23c30 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50  DbFd->pInode->bP
23c40 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b  rocessLock==0 );
23c50 0a 0a 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6e  ..  /* Minimum n
23c60 75 6d 62 65 72 20 6f 66 20 72 65 67 69 6f 6e 73  umber of regions
23c70 20 72 65 71 75 69 72 65 64 20 74 6f 20 62 65 20   required to be 
23c80 6d 61 70 70 65 64 2e 20 2a 2f 0a 20 20 6e 52 65  mapped. */.  nRe
23c90 71 52 65 67 69 6f 6e 20 3d 20 28 28 69 52 65 67  qRegion = ((iReg
23ca0 69 6f 6e 2b 6e 53 68 6d 50 65 72 4d 61 70 29 20  ion+nShmPerMap) 
23cb0 2f 20 6e 53 68 6d 50 65 72 4d 61 70 29 20 2a 20  / nShmPerMap) * 
23cc0 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 0a 20 20 69  nShmPerMap;..  i
23cd0 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  f( pShmNode->nRe
23ce0 67 69 6f 6e 3c 6e 52 65 71 52 65 67 69 6f 6e 20  gion<nReqRegion 
23cf0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 70  ){.    char **ap
23d00 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
23d10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
23d20 20 61 70 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61   apRegion[] arra
23d30 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79  y */.    int nBy
23d40 74 65 20 3d 20 6e 52 65 71 52 65 67 69 6f 6e 2a  te = nReqRegion*
23d50 73 7a 52 65 67 69 6f 6e 3b 20 20 20 2f 2a 20 4d  szRegion;   /* M
23d60 69 6e 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20  inimum required 
23d70 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20  file size */.   
23d80 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74   struct stat sSt
23d90 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  at;             
23da0 20 20 20 20 2f 2a 20 55 73 65 64 20 62 79 20 66      /* Used by f
23db0 73 74 61 74 28 29 20 2a 2f 0a 0a 20 20 20 20 70  stat() */..    p
23dc0 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f  ShmNode->szRegio
23dd0 6e 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20  n = szRegion;.. 
23de0 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d     if( pShmNode-
23df0 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  >h>=0 ){.      /
23e00 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
23e10 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61  region is not ma
23e20 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70  pped into this p
23e30 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73 73  rocesses address
23e40 20 73 70 61 63 65 2e 0a 20 20 20 20 20 20 2a 2a   space..      **
23e50 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
23e60 20 69 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c   it has been all
23e70 6f 63 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20  ocated (i.e. if 
23e80 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69  the wal-index fi
23e90 6c 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6c  le is.      ** l
23ea0 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63  arge enough to c
23eb0 6f 6e 74 61 69 6e 20 74 68 65 20 72 65 71 75 65  ontain the reque
23ec0 73 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20  sted region)..  
23ed0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
23ee0 20 6f 73 46 73 74 61 74 28 70 53 68 6d 4e 6f 64   osFstat(pShmNod
23ef0 65 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 29 7b  e->h, &sStat) ){
23f00 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
23f10 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49  LITE_IOERR_SHMSI
23f20 5a 45 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  ZE;.        goto
23f30 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
23f40 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 69      }.  .      i
23f50 66 28 20 73 53 74 61 74 2e 73 74 5f 73 69 7a 65  f( sStat.st_size
23f60 3c 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20  <nByte ){.      
23f70 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
23f80 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed memory region
23f90 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
23fa0 20 49 66 20 62 45 78 74 65 6e 64 20 69 73 20 73   If bExtend is s
23fb0 65 74 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  et to.        **
23fc0 20 66 61 6c 73 65 2c 20 65 78 69 74 20 65 61 72   false, exit ear
23fd0 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20  ly. *pp will be 
23fe0 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20  set to NULL and 
23ff0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
24000 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
24010 20 20 20 20 20 20 20 69 66 28 20 21 62 45 78 74         if( !bExt
24020 65 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  end ){.         
24030 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
24040 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  t;.        }..  
24050 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61        /* Alterna
24060 74 69 76 65 6c 79 2c 20 69 66 20 62 45 78 74 65  tively, if bExte
24070 6e 64 20 69 73 20 74 72 75 65 2c 20 65 78 74 65  nd is true, exte
24080 6e 64 20 74 68 65 20 66 69 6c 65 2e 20 44 6f 20  nd the file. Do 
24090 74 68 69 73 20 62 79 0a 20 20 20 20 20 20 20 20  this by.        
240a0 2a 2a 20 77 72 69 74 69 6e 67 20 61 20 73 69 6e  ** writing a sin
240b0 67 6c 65 20 62 79 74 65 20 74 6f 20 74 68 65 20  gle byte to the 
240c0 65 6e 64 20 6f 66 20 65 61 63 68 20 28 4f 53 29  end of each (OS)
240d0 20 70 61 67 65 20 62 65 69 6e 67 0a 20 20 20 20   page being.    
240e0 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64      ** allocated
240f0 20 6f 72 20 65 78 74 65 6e 64 65 64 2e 20 54 65   or extended. Te
24100 63 68 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6e 65  chnically, we ne
24110 65 64 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 6f  ed only write to
24120 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
24130 6c 61 73 74 20 70 61 67 65 20 69 6e 20 6f 72 64  last page in ord
24140 65 72 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65  er to extend the
24150 20 66 69 6c 65 2e 20 42 75 74 20 77 72 69 74 69   file. But writi
24160 6e 67 20 74 6f 20 61 6c 6c 20 6e 65 77 0a 20 20  ng to all new.  
24170 20 20 20 20 20 20 2a 2a 20 70 61 67 65 73 20 66        ** pages f
24180 6f 72 63 65 73 20 74 68 65 20 4f 53 20 74 6f 20  orces the OS to 
24190 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d 20 69 6d  allocate them im
241a0 6d 65 64 69 61 74 65 6c 79 2c 20 77 68 69 63 68  mediately, which
241b0 20 72 65 64 75 63 65 73 0a 20 20 20 20 20 20 20   reduces.       
241c0 20 2a 2a 20 74 68 65 20 63 68 61 6e 63 65 73 20   ** the chances 
241d0 6f 66 20 53 49 47 42 55 53 20 77 68 69 6c 65 20  of SIGBUS while 
241e0 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 6d 61  accessing the ma
241f0 70 70 65 64 20 72 65 67 69 6f 6e 20 6c 61 74 65  pped region late
24200 72 20 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f  r on..        */
24210 0a 20 20 20 20 20 20 20 20 65 6c 73 65 7b 0a 20  .        else{. 
24220 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20           static 
24230 63 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d  const int pgsz =
24240 20 34 30 39 36 3b 0a 20 20 20 20 20 20 20 20 20   4096;.         
24250 20 69 6e 74 20 69 50 67 3b 0a 0a 20 20 20 20 20   int iPg;..     
24260 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f       /* Write to
24270 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f   the last byte o
24280 66 20 65 61 63 68 20 6e 65 77 6c 79 20 61 6c 6c  f each newly all
24290 6f 63 61 74 65 64 20 6f 72 20 65 78 74 65 6e 64  ocated or extend
242a0 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ed page */.     
242b0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 6e 42       assert( (nB
242c0 79 74 65 20 25 20 70 67 73 7a 29 3d 3d 30 20 29  yte % pgsz)==0 )
242d0 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
242e0 69 50 67 3d 28 73 53 74 61 74 2e 73 74 5f 73 69  iPg=(sStat.st_si
242f0 7a 65 2f 70 67 73 7a 29 3b 20 69 50 67 3c 28 6e  ze/pgsz); iPg<(n
24300 42 79 74 65 2f 70 67 73 7a 29 3b 20 69 50 67 2b  Byte/pgsz); iPg+
24310 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
24320 69 6e 74 20 78 20 3d 20 30 3b 0a 20 20 20 20 20  int x = 0;.     
24330 20 20 20 20 20 20 20 69 66 28 20 73 65 65 6b 41         if( seekA
24340 6e 64 57 72 69 74 65 46 64 28 70 53 68 6d 4e 6f  ndWriteFd(pShmNo
24350 64 65 2d 3e 68 2c 20 69 50 67 2a 70 67 73 7a 20  de->h, iPg*pgsz 
24360 2b 20 70 67 73 7a 2d 31 2c 20 22 22 2c 20 31 2c  + pgsz-1, "", 1,
24370 20 26 78 29 21 3d 31 20 29 7b 0a 20 20 20 20 20   &x)!=1 ){.     
24380 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63           const c
24390 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 70 53 68  har *zFile = pSh
243a0 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65  mNode->zFilename
243b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
243c0 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  rc = unixLogErro
243d0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
243e0 48 4d 53 49 5a 45 2c 20 22 77 72 69 74 65 22 2c  HMSIZE, "write",
243f0 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20   zFile);.       
24400 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70         goto shmp
24410 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  age_out;.       
24420 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
24430 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
24440 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
24450 2f 2a 20 4d 61 70 20 74 68 65 20 72 65 71 75 65  /* Map the reque
24460 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69  sted memory regi
24470 6f 6e 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f  on into this pro
24480 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73  cesses address s
24490 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e  pace. */.    apN
244a0 65 77 20 3d 20 28 63 68 61 72 20 2a 2a 29 73 71  ew = (char **)sq
244b0 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20  lite3_realloc(. 
244c0 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
244d0 3e 61 70 52 65 67 69 6f 6e 2c 20 6e 52 65 71 52  >apRegion, nReqR
244e0 65 67 69 6f 6e 2a 73 69 7a 65 6f 66 28 63 68 61  egion*sizeof(cha
244f0 72 20 2a 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  r *).    );.    
24500 69 66 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 20  if( !apNew ){.  
24510 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
24520 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
24530 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
24540 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  out;.    }.    p
24550 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f  ShmNode->apRegio
24560 6e 20 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20 77  n = apNew;.    w
24570 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  hile( pShmNode->
24580 6e 52 65 67 69 6f 6e 3c 6e 52 65 71 52 65 67 69  nRegion<nReqRegi
24590 6f 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  on ){.      int 
245a0 6e 4d 61 70 20 3d 20 73 7a 52 65 67 69 6f 6e 2a  nMap = szRegion*
245b0 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 20 20 20 20  nShmPerMap;.    
245c0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 76    int i;.      v
245d0 6f 69 64 20 2a 70 4d 65 6d 3b 0a 20 20 20 20 20  oid *pMem;.     
245e0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68   if( pShmNode->h
245f0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  >=0 ){.        p
24600 4d 65 6d 20 3d 20 6f 73 4d 6d 61 70 28 30 2c 20  Mem = osMmap(0, 
24610 6e 4d 61 70 2c 0a 20 20 20 20 20 20 20 20 20 20  nMap,.          
24620 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65    pShmNode->isRe
24630 61 64 6f 6e 6c 79 20 3f 20 50 52 4f 54 5f 52 45  adonly ? PROT_RE
24640 41 44 20 3a 20 50 52 4f 54 5f 52 45 41 44 7c 50  AD : PROT_READ|P
24650 52 4f 54 5f 57 52 49 54 45 2c 20 0a 20 20 20 20  ROT_WRITE, .    
24660 20 20 20 20 20 20 20 20 4d 41 50 5f 53 48 41 52          MAP_SHAR
24670 45 44 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  ED, pShmNode->h,
24680 20 73 7a 52 65 67 69 6f 6e 2a 28 69 36 34 29 70   szRegion*(i64)p
24690 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
246a0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
246b0 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 4d 41      if( pMem==MA
246c0 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20  P_FAILED ){.    
246d0 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c        rc = unixL
246e0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
246f0 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20 22 6d 6d  OERR_SHMMAP, "mm
24700 61 70 22 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a  ap", pShmNode->z
24710 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
24720 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
24730 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  e_out;.        }
24740 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
24750 20 20 20 20 20 20 70 4d 65 6d 20 3d 20 73 71 6c        pMem = sql
24760 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 7a  ite3_malloc64(sz
24770 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20  Region);.       
24780 20 69 66 28 20 70 4d 65 6d 3d 3d 30 20 29 7b 0a   if( pMem==0 ){.
24790 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
247a0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
247b0 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70         goto shmp
247c0 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  age_out;.       
247d0 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65   }.        memse
247e0 74 28 70 4d 65 6d 2c 20 30 2c 20 73 7a 52 65 67  t(pMem, 0, szReg
247f0 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  ion);.      }.. 
24800 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
24810 6e 53 68 6d 50 65 72 4d 61 70 3b 20 69 2b 2b 29  nShmPerMap; i++)
24820 7b 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f  {.        pShmNo
24830 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 70 53 68  de->apRegion[pSh
24840 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 69  mNode->nRegion+i
24850 5d 20 3d 20 26 28 28 63 68 61 72 2a 29 70 4d 65  ] = &((char*)pMe
24860 6d 29 5b 73 7a 52 65 67 69 6f 6e 2a 69 5d 3b 0a  m)[szRegion*i];.
24870 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53        }.      pS
24880 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 20  hmNode->nRegion 
24890 2b 3d 20 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 20  += nShmPerMap;. 
248a0 20 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67     }.  }..shmpag
248b0 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 53 68  e_out:.  if( pSh
248c0 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69  mNode->nRegion>i
248d0 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 2a 70  Region ){.    *p
248e0 70 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70  p = pShmNode->ap
248f0 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 3b  Region[iRegion];
24900 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
24910 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  p = 0;.  }.  if(
24920 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61   pShmNode->isRea
24930 64 6f 6e 6c 79 20 26 26 20 72 63 3d 3d 53 51 4c  donly && rc==SQL
24940 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 53 51  ITE_OK ) rc = SQ
24950 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
24960 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
24970 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
24980 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
24990 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  rc;.}../*.** Cha
249a0 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  nge the lock sta
249b0 74 65 20 66 6f 72 20 61 20 73 68 61 72 65 64 2d  te for a shared-
249c0 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a  memory segment..
249d0 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
249e0 74 68 65 20 72 65 6c 61 74 69 6f 6e 73 68 69 70  the relationship
249f0 20 62 65 74 77 65 65 6e 20 53 48 41 52 45 64 20   between SHAREd 
24a00 61 6e 64 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  and EXCLUSIVE lo
24a10 63 6b 73 20 69 73 20 61 20 6c 69 74 74 6c 65 0a  cks is a little.
24a20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 68 65 72  ** different her
24a30 65 20 74 68 61 6e 20 69 6e 20 70 6f 73 69 78 2e  e than in posix.
24a40 20 20 49 6e 20 78 53 68 6d 4c 6f 63 6b 28 29 2c    In xShmLock(),
24a50 20 6f 6e 65 20 63 61 6e 20 67 6f 20 66 72 6f 6d   one can go from
24a60 20 75 6e 6c 6f 63 6b 65 64 0a 2a 2a 20 74 6f 20   unlocked.** to 
24a70 73 68 61 72 65 64 20 61 6e 64 20 62 61 63 6b 20  shared and back 
24a80 6f 72 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64  or from unlocked
24a90 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 61 6e   to exclusive an
24aa0 64 20 62 61 63 6b 2e 20 20 42 75 74 20 6f 6e 65  d back.  But one
24ab0 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 67 6f 20 66   may.** not go f
24ac0 72 6f 6d 20 73 68 61 72 65 64 20 74 6f 20 65 78  rom shared to ex
24ad0 63 6c 75 73 69 76 65 20 6f 72 20 66 72 6f 6d 20  clusive or from 
24ae0 65 78 63 6c 75 73 69 76 65 20 74 6f 20 73 68 61  exclusive to sha
24af0 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
24b00 6e 74 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 28 0a  nt unixShmLock(.
24b10 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
24b20 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fd,          /* 
24b30 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f  Database file ho
24b40 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  lding the shared
24b50 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74   memory */.  int
24b60 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20   ofst,          
24b70 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
24b80 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69 72 65   lock to acquire
24b90 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20   or release */. 
24ba0 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20   int n,         
24bb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
24bc0 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 74  umber of locks t
24bd0 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c  o acquire or rel
24be0 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  ease */.  int fl
24bf0 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ags             
24c00 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
24c10 64 6f 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  do with the lock
24c20 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c   */.){.  unixFil
24c30 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78  e *pDbFd = (unix
24c40 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20 2f  File*)fd;      /
24c50 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c  * Connection hol
24c60 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f  ding shared memo
24c70 72 79 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  ry */.  unixShm 
24c80 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d  *p = pDbFd->pShm
24c90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
24ca0 20 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   The shared memo
24cb0 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 20  ry being locked 
24cc0 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 58  */.  unixShm *pX
24cd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24ce0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
24cf0 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61  r looping over a
24d00 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20  ll siblings */. 
24d10 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
24d20 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d  hmNode = p->pShm
24d30 4e 6f 64 65 3b 20 20 2f 2a 20 54 68 65 20 75 6e  Node;  /* The un
24d40 64 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 69 4e  derlying file iN
24d50 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ode */.  int rc 
24d60 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
24d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24d80 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  * Result code */
24d90 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20 20  .  u16 mask;    
24da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24db0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
24dc0 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61 6b   of locks to tak
24dd0 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
24de0 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
24df0 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f  ode==pDbFd->pIno
24e00 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a  de->pShmNode );.
24e10 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
24e20 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46  de->pInode==pDbF
24e30 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61  d->pInode );.  a
24e40 73 73 65 72 74 28 20 6f 66 73 74 3e 3d 30 20 26  ssert( ofst>=0 &
24e50 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45  & ofst+n<=SQLITE
24e60 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20  _SHM_NLOCK );.  
24e70 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a  assert( n>=1 );.
24e80 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
24e90 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43  =(SQLITE_SHM_LOC
24ea0 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53  K | SQLITE_SHM_S
24eb0 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c  HARED).       ||
24ec0 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
24ed0 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  SHM_LOCK | SQLIT
24ee0 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
24ef0 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
24f00 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e  ==(SQLITE_SHM_UN
24f10 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
24f20 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20  M_SHARED).      
24f30 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49   || flags==(SQLI
24f40 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20  TE_SHM_UNLOCK | 
24f50 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
24f60 53 49 56 45 29 20 29 3b 0a 20 20 61 73 73 65 72  SIVE) );.  asser
24f70 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67  t( n==1 || (flag
24f80 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45  s & SQLITE_SHM_E
24f90 58 43 4c 55 53 49 56 45 29 21 3d 30 20 29 3b 0a  XCLUSIVE)!=0 );.
24fa0 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
24fb0 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44 62 46  de->h>=0 || pDbF
24fc0 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  d->pInode->bProc
24fd0 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20  essLock==1 );.  
24fe0 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
24ff0 2d 3e 68 3c 30 20 7c 7c 20 70 44 62 46 64 2d 3e  ->h<0 || pDbFd->
25000 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
25010 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 6d 61  Lock==0 );..  ma
25020 73 6b 20 3d 20 28 31 3c 3c 28 6f 66 73 74 2b 6e  sk = (1<<(ofst+n
25030 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a  )) - (1<<ofst);.
25040 20 20 61 73 73 65 72 74 28 20 6e 3e 31 20 7c 7c    assert( n>1 ||
25050 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29   mask==(1<<ofst)
25060 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   );.  sqlite3_mu
25070 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
25080 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  de->mutex);.  if
25090 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
250a0 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  _SHM_UNLOCK ){. 
250b0 20 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20 3d     u16 allMask =
250c0 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c   0; /* Mask of l
250d0 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 73 69 62  ocks held by sib
250e0 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a  lings */..    /*
250f0 20 53 65 65 20 69 66 20 61 6e 79 20 73 69 62 6c   See if any sibl
25100 69 6e 67 73 20 68 6f 6c 64 20 74 68 69 73 20 73  ings hold this s
25110 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ame lock */.    
25120 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d  for(pX=pShmNode-
25130 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d  >pFirst; pX; pX=
25140 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  pX->pNext){.    
25150 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63 6f    if( pX==p ) co
25160 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73  ntinue;.      as
25170 73 65 72 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d  sert( (pX->exclM
25180 61 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61  ask & (p->exclMa
25190 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b  sk|p->sharedMask
251a0 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  ))==0 );.      a
251b0 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73 68  llMask |= pX->sh
251c0 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a  aredMask;.    }.
251d0 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74  .    /* Unlock t
251e0 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20  he system-level 
251f0 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28  locks */.    if(
25200 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73 6b   (mask & allMask
25210 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  )==0 ){.      rc
25220 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d   = unixShmSystem
25230 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f 55 4e  Lock(pDbFd, F_UN
25240 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53  LCK, ofst+UNIX_S
25250 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20  HM_BASE, n);.   
25260 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
25270 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
25280 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f    }..    /* Undo
25290 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73   the local locks
252a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
252b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
252c0 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26     p->exclMask &
252d0 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70  = ~mask;.      p
252e0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20  ->sharedMask &= 
252f0 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20  ~mask;.    } .  
25300 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
25310 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41  & SQLITE_SHM_SHA
25320 52 45 44 20 29 7b 0a 20 20 20 20 75 31 36 20 61  RED ){.    u16 a
25330 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f  llShared = 0;  /
25340 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73  * Union of locks
25350 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74   held by connect
25360 69 6f 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20  ions other than 
25370 22 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46  "p" */..    /* F
25380 69 6e 64 20 6f 75 74 20 77 68 69 63 68 20 73 68  ind out which sh
25390 61 72 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61  ared locks are a
253a0 6c 72 65 61 64 79 20 68 65 6c 64 20 62 79 20 73  lready held by s
253b0 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
253c0 6e 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e  ns..    ** If an
253d0 79 20 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64  y sibling alread
253e0 79 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75  y holds an exclu
253f0 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68  sive lock, go ah
25400 65 61 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20  ead and return. 
25410 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53     ** SQLITE_BUS
25420 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  Y..    */.    fo
25430 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70  r(pX=pShmNode->p
25440 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58  First; pX; pX=pX
25450 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
25460 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73  if( (pX->exclMas
25470 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a  k & mask)!=0 ){.
25480 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
25490 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
254a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
254b0 0a 20 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64  .      allShared
254c0 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61   |= pX->sharedMa
254d0 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  sk;.    }..    /
254e0 2a 20 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63  * Get shared loc
254f0 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d  ks at the system
25500 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73   level, if neces
25510 73 61 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20  sary */.    if( 
25520 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
25530 0a 20 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53  .      if( (allS
25540 68 61 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30  hared & mask)==0
25550 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
25560 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f   unixShmSystemLo
25570 63 6b 28 70 44 62 46 64 2c 20 46 5f 52 44 4c 43  ck(pDbFd, F_RDLC
25580 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d  K, ofst+UNIX_SHM
25590 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20  _BASE, n);.     
255a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
255b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
255c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
255d0 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f     /* Get the lo
255e0 63 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  cal shared locks
255f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
25600 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25610 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b     p->sharedMask
25620 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a   |= mask;.    }.
25630 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
25640 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 73 69 62  Make sure no sib
25650 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
25660 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74   hold locks that
25670 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73   will block this
25680 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49  .    ** lock.  I
25690 66 20 61 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e  f any do, return
256a0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 72 69 67   SQLITE_BUSY rig
256b0 68 74 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a  ht away..    */.
256c0 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e      for(pX=pShmN
256d0 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b  ode->pFirst; pX;
256e0 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
256f0 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65        if( (pX->e
25700 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21  xclMask & mask)!
25710 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65  =0 || (pX->share
25720 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  dMask & mask)!=0
25730 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
25740 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
25750 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
25760 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
25770 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65 78 63    /* Get the exc
25780 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 61 74 20  lusive locks at 
25790 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c  the system level
257a0 2e 20 20 54 68 65 6e 20 69 66 20 73 75 63 63 65  .  Then if succe
257b0 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73  ssful.    ** als
257c0 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c  o mark the local
257d0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62   connection as b
257e0 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20  eing locked..   
257f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
25800 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25810 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53     rc = unixShmS
25820 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c  ystemLock(pDbFd,
25830 20 46 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 55   F_WRLCK, ofst+U
25840 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29  NIX_SHM_BASE, n)
25850 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
25860 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25870 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d       assert( (p-
25880 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61  >sharedMask & ma
25890 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  sk)==0 );.      
258a0 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d    p->exclMask |=
258b0 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20   mask;.      }. 
258c0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
258d0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
258e0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
258f0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d  .  OSTRACE(("SHM
25900 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25 64 2c 20  -LOCK shmid-%d, 
25910 70 69 64 2d 25 64 20 67 6f 74 20 25 30 33 78 2c  pid-%d got %03x,
25920 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %03x\n",.       
25930 20 20 20 20 70 2d 3e 69 64 2c 20 6f 73 47 65 74      p->id, osGet
25940 70 69 64 28 30 29 2c 20 70 2d 3e 73 68 61 72 65  pid(0), p->share
25950 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61  dMask, p->exclMa
25960 73 6b 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  sk));.  return r
25970 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  c;.}../*.** Impl
25980 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62  ement a memory b
25990 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79  arrier or memory
259a0 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72 65 64   fence on shared
259b0 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a   memory.  .**.**
259c0 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73   All loads and s
259d0 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65 66 6f  tores begun befo
259e0 72 65 20 74 68 65 20 62 61 72 72 69 65 72 20 6d  re the barrier m
259f0 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 66  ust complete bef
25a00 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20  ore.** any load 
25a10 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e 20 61  or store begun a
25a20 66 74 65 72 20 74 68 65 20 62 61 72 72 69 65 72  fter the barrier
25a30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
25a40 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 28   unixShmBarrier(
25a50 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
25a60 2a 66 64 20 20 20 20 20 20 20 20 20 20 20 20 20  *fd             
25a70 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66     /* Database f
25a80 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ile holding the 
25a90 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
25aa0 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  .){.  UNUSED_PAR
25ab0 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 73 71  AMETER(fd);.  sq
25ac0 6c 69 74 65 33 4d 65 6d 6f 72 79 42 61 72 72 69  lite3MemoryBarri
25ad0 65 72 28 29 3b 20 20 20 20 20 20 20 20 20 2f 2a  er();         /*
25ae0 20 63 6f 6d 70 69 6c 65 72 2d 64 65 66 69 6e 65   compiler-define
25af0 64 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72  d memory barrier
25b00 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
25b10 75 74 65 78 28 29 3b 20 20 20 20 20 20 20 20 20  utex();         
25b20 20 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20 6d 75        /* Also mu
25b30 74 65 78 2c 20 66 6f 72 20 72 65 64 75 6e 64 61  tex, for redunda
25b40 6e 63 79 20 2a 2f 0a 20 20 75 6e 69 78 4c 65 61  ncy */.  unixLea
25b50 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a  veMutex();.}../*
25b60 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e  .** Close a conn
25b70 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64  ection to shared
25b80 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65  -memory.  Delete
25b90 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
25ba0 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69 66 20 64  .** storage if d
25bb0 65 6c 65 74 65 46 6c 61 67 20 69 73 20 74 72 75  eleteFlag is tru
25bc0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  e..**.** If ther
25bd0 65 20 69 73 20 6e 6f 20 73 68 61 72 65 64 20 6d  e is no shared m
25be0 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
25bf0 20 77 69 74 68 20 74 68 65 20 63 6f 6e 6e 65 63   with the connec
25c00 74 69 6f 6e 20 74 68 65 6e 20 74 68 69 73 0a 2a  tion then this.*
25c10 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68  * routine is a h
25c20 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a  armless no-op..*
25c30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
25c40 78 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c  xShmUnmap(.  sql
25c50 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
25c60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25c70 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  The underlying d
25c80 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
25c90 20 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67    int deleteFlag
25ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25cb0 20 20 2f 2a 20 44 65 6c 65 74 65 20 73 68 61 72    /* Delete shar
25cc0 65 64 2d 6d 65 6d 6f 72 79 20 69 66 20 74 72 75  ed-memory if tru
25cd0 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53 68  e */.){.  unixSh
25ce0 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  m *p;           
25cf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
25d00 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62   connection to b
25d10 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 75 6e  e closed */.  un
25d20 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
25d30 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ode;          /*
25d40 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
25d50 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
25d60 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  le */.  unixShm 
25d70 2a 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20 20  **pp;           
25d80 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
25d90 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c  ooping over sibl
25da0 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ing connections 
25db0 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  */.  unixFile *p
25dc0 44 62 46 64 3b 20 20 20 20 20 20 20 20 20 20 20  DbFd;           
25dd0 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65       /* The unde
25de0 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
25df0 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 44 62 46 64  file */..  pDbFd
25e00 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64   = (unixFile*)fd
25e10 3b 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70  ;.  p = pDbFd->p
25e20 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  Shm;.  if( p==0 
25e30 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
25e40 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d  OK;.  pShmNode =
25e50 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20   p->pShmNode;.. 
25e60 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
25e70 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
25e80 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20  ->pShmNode );.  
25e90 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
25ea0 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d  ->pInode==pDbFd-
25eb0 3e 70 49 6e 6f 64 65 20 29 3b 0a 0a 20 20 2f 2a  >pInode );..  /*
25ec0 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69   Remove connecti
25ed0 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65  on p from the se
25ee0 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  t of connections
25ef0 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a   associated.  **
25f00 20 77 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a   with pShmNode *
25f10 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
25f20 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
25f30 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28  ->mutex);.  for(
25f40 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  pp=&pShmNode->pF
25f50 69 72 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20  irst; (*pp)!=p; 
25f60 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65  pp = &(*pp)->pNe
25f70 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d  xt){}.  *pp = p-
25f80 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72  >pNext;..  /* Fr
25f90 65 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ee the connectio
25fa0 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  n p */.  sqlite3
25fb0 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46  _free(p);.  pDbF
25fc0 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73  d->pShm = 0;.  s
25fd0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
25fe0 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
25ff0 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53  ex);..  /* If pS
26000 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73  hmNode->nRef has
26010 20 72 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e   reached 0, then
26020 20 63 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72   close the under
26030 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65  lying.  ** share
26040 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74  d-memory file, t
26050 6f 6f 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65  oo */.  unixEnte
26060 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65  rMutex();.  asse
26070 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  rt( pShmNode->nR
26080 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f  ef>0 );.  pShmNo
26090 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  de->nRef--;.  if
260a0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  ( pShmNode->nRef
260b0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64  ==0 ){.    if( d
260c0 65 6c 65 74 65 46 6c 61 67 20 26 26 20 70 53 68  eleteFlag && pSh
260d0 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20  mNode->h>=0 ){. 
260e0 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 70 53       osUnlink(pS
260f0 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d  hmNode->zFilenam
26100 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e  e);.    }.    un
26110 69 78 53 68 6d 50 75 72 67 65 28 70 44 62 46 64  ixShmPurge(pDbFd
26120 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61  );.  }.  unixLea
26130 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65  veMutex();..  re
26140 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
26150 7d 0a 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }...#else.# defi
26160 6e 65 20 75 6e 69 78 53 68 6d 4d 61 70 20 20 20  ne unixShmMap   
26170 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69    0.# define uni
26180 78 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20  xShmLock    0.# 
26190 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 42 61  define unixShmBa
261a0 72 72 69 65 72 20 30 0a 23 20 64 65 66 69 6e 65  rrier 0.# define
261b0 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 20 20 20   unixShmUnmap   
261c0 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e  0.#endif /* #ifn
261d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
261e0 57 41 4c 20 2a 2f 0a 0a 23 69 66 20 53 51 4c 49  WAL */..#if SQLI
261f0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
26200 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74 20 69  >0./*.** If it i
26210 73 20 63 75 72 72 65 6e 74 6c 79 20 6d 65 6d 6f  s currently memo
26220 72 79 20 6d 61 70 70 65 64 2c 20 75 6e 6d 61 70  ry mapped, unmap
26230 20 66 69 6c 65 20 70 46 64 2e 0a 2a 2f 0a 73 74   file pFd..*/.st
26240 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 55 6e  atic void unixUn
26250 6d 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65  mapfile(unixFile
26260 20 2a 70 46 64 29 7b 0a 20 20 61 73 73 65 72 74   *pFd){.  assert
26270 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74  ( pFd->nFetchOut
26280 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 64  ==0 );.  if( pFd
26290 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 29 7b 0a  ->pMapRegion ){.
262a0 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 46 64      osMunmap(pFd
262b0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c 20 70 46  ->pMapRegion, pF
262c0 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  d->mmapSizeActua
262d0 6c 29 3b 0a 20 20 20 20 70 46 64 2d 3e 70 4d 61  l);.    pFd->pMa
262e0 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 20  pRegion = 0;.   
262f0 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d   pFd->mmapSize =
26300 20 30 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61   0;.    pFd->mma
26310 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b  pSizeActual = 0;
26320 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74  .  }.}../*.** At
26330 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65  tempt to set the
26340 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 65 6d   size of the mem
26350 6f 72 79 20 6d 61 70 70 69 6e 67 20 6d 61 69 6e  ory mapping main
26360 74 61 69 6e 65 64 20 62 79 20 66 69 6c 65 20 0a  tained by file .
26370 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  ** descriptor pF
26380 64 20 74 6f 20 6e 4e 65 77 20 62 79 74 65 73 2e  d to nNew bytes.
26390 20 41 6e 79 20 65 78 69 73 74 69 6e 67 20 6d 61   Any existing ma
263a0 70 70 69 6e 67 20 69 73 20 64 69 73 63 61 72 64  pping is discard
263b0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  ed..**.** If suc
263c0 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20 66 75  cessful, this fu
263d0 6e 63 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20  nction sets the 
263e0 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
263f0 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  les:.**.**      
26400 20 75 6e 69 78 46 69 6c 65 2e 70 4d 61 70 52 65   unixFile.pMapRe
26410 67 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 75 6e  gion.**       un
26420 69 78 46 69 6c 65 2e 6d 6d 61 70 53 69 7a 65 0a  ixFile.mmapSize.
26430 2a 2a 20 20 20 20 20 20 20 75 6e 69 78 46 69 6c  **       unixFil
26440 65 2e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  e.mmapSizeActual
26450 0a 2a 2a 0a 2a 2a 20 49 66 20 75 6e 73 75 63 63  .**.** If unsucc
26460 65 73 73 66 75 6c 2c 20 61 6e 20 65 72 72 6f 72  essful, an error
26470 20 6d 65 73 73 61 67 65 20 69 73 20 6c 6f 67 67   message is logg
26480 65 64 20 76 69 61 20 73 71 6c 69 74 65 33 5f 6c  ed via sqlite3_l
26490 6f 67 28 29 20 61 6e 64 0a 2a 2a 20 74 68 65 20  og() and.** the 
264a0 74 68 72 65 65 20 76 61 72 69 61 62 6c 65 73 20  three variables 
264b0 61 62 6f 76 65 20 61 72 65 20 7a 65 72 6f 65 64  above are zeroed
264c0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 53  . In this case S
264d0 51 4c 69 74 65 20 73 68 6f 75 6c 64 0a 2a 2a 20  QLite should.** 
264e0 63 6f 6e 74 69 6e 75 65 20 61 63 63 65 73 73 69  continue accessi
264f0 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
26500 75 73 69 6e 67 20 74 68 65 20 78 52 65 61 64 28  using the xRead(
26510 29 20 61 6e 64 20 78 57 72 69 74 65 28 29 0a 2a  ) and xWrite().*
26520 2a 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74  * methods..*/.st
26530 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 52 65  atic void unixRe
26540 6d 61 70 66 69 6c 65 28 0a 20 20 75 6e 69 78 46  mapfile(.  unixF
26550 69 6c 65 20 2a 70 46 64 2c 20 20 20 20 20 20 20  ile *pFd,       
26560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
26570 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 62  le descriptor ob
26580 6a 65 63 74 20 2a 2f 0a 20 20 69 36 34 20 6e 4e  ject */.  i64 nN
26590 65 77 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ew              
265a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71            /* Req
265b0 75 69 72 65 64 20 6d 61 70 70 69 6e 67 20 73 69  uired mapping si
265c0 7a 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  ze */.){.  const
265d0 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 22 6d   char *zErr = "m
265e0 6d 61 70 22 3b 0a 20 20 69 6e 74 20 68 20 3d 20  map";.  int h = 
265f0 70 46 64 2d 3e 68 3b 20 20 20 20 20 20 20 20 20  pFd->h;         
26600 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26610 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
26620 6f 70 65 6e 20 6f 6e 20 64 62 20 66 69 6c 65 20  open on db file 
26630 2a 2f 0a 20 20 75 38 20 2a 70 4f 72 69 67 20 3d  */.  u8 *pOrig =
26640 20 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70   (u8 *)pFd->pMap
26650 52 65 67 69 6f 6e 3b 20 20 20 2f 2a 20 50 6f 69  Region;   /* Poi
26660 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20  nter to current 
26670 66 69 6c 65 20 6d 61 70 70 69 6e 67 20 2a 2f 0a  file mapping */.
26680 20 20 69 36 34 20 6e 4f 72 69 67 20 3d 20 70 46    i64 nOrig = pF
26690 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  d->mmapSizeActua
266a0 6c 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  l;     /* Size o
266b0 66 20 70 4f 72 69 67 20 72 65 67 69 6f 6e 20 69  f pOrig region i
266c0 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 38 20  n bytes */.  u8 
266d0 2a 70 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20  *pNew = 0;      
266e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
266f0 20 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20 6f 66    /* Location of
26700 20 6e 65 77 20 6d 61 70 70 69 6e 67 20 2a 2f 0a   new mapping */.
26710 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 50 52    int flags = PR
26720 4f 54 5f 52 45 41 44 3b 20 20 20 20 20 20 20 20  OT_READ;        
26730 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
26740 74 6f 20 70 61 73 73 20 74 6f 20 6d 6d 61 70 28  to pass to mmap(
26750 29 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  ) */..  assert( 
26760 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d  pFd->nFetchOut==
26770 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
26780 4e 65 77 3e 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  New>pFd->mmapSiz
26790 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  e );.  assert( n
267a0 4e 65 77 3c 3d 70 46 64 2d 3e 6d 6d 61 70 53 69  New<=pFd->mmapSi
267b0 7a 65 4d 61 78 20 29 3b 0a 20 20 61 73 73 65 72  zeMax );.  asser
267c0 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20 61  t( nNew>0 );.  a
267d0 73 73 65 72 74 28 20 70 46 64 2d 3e 6d 6d 61 70  ssert( pFd->mmap
267e0 53 69 7a 65 41 63 74 75 61 6c 3e 3d 70 46 64 2d  SizeActual>=pFd-
267f0 3e 6d 6d 61 70 53 69 7a 65 20 29 3b 0a 20 20 61  >mmapSize );.  a
26800 73 73 65 72 74 28 20 4d 41 50 5f 46 41 49 4c 45  ssert( MAP_FAILE
26810 44 21 3d 30 20 29 3b 0a 0a 23 69 66 64 65 66 20  D!=0 );..#ifdef 
26820 53 51 4c 49 54 45 5f 4d 4d 41 50 5f 52 45 41 44  SQLITE_MMAP_READ
26830 57 52 49 54 45 0a 20 20 69 66 28 20 28 70 46 64  WRITE.  if( (pFd
26840 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
26850 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d  IXFILE_RDONLY)==
26860 30 20 29 20 66 6c 61 67 73 20 7c 3d 20 50 52 4f  0 ) flags |= PRO
26870 54 5f 57 52 49 54 45 3b 0a 23 65 6e 64 69 66 0a  T_WRITE;.#endif.
26880 0a 20 20 69 66 28 20 70 4f 72 69 67 20 29 7b 0a  .  if( pOrig ){.
26890 23 69 66 20 48 41 56 45 5f 4d 52 45 4d 41 50 0a  #if HAVE_MREMAP.
268a0 20 20 20 20 69 36 34 20 6e 52 65 75 73 65 20 3d      i64 nReuse =
268b0 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 3b 0a   pFd->mmapSize;.
268c0 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74 20  #else.    const 
268d0 69 6e 74 20 73 7a 53 79 73 70 61 67 65 20 3d 20  int szSyspage = 
268e0 6f 73 47 65 74 70 61 67 65 73 69 7a 65 28 29 3b  osGetpagesize();
268f0 0a 20 20 20 20 69 36 34 20 6e 52 65 75 73 65 20  .    i64 nReuse 
26900 3d 20 28 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  = (pFd->mmapSize
26910 20 26 20 7e 28 73 7a 53 79 73 70 61 67 65 2d 31   & ~(szSyspage-1
26920 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 75  ));.#endif.    u
26930 38 20 2a 70 52 65 71 20 3d 20 26 70 4f 72 69 67  8 *pReq = &pOrig
26940 5b 6e 52 65 75 73 65 5d 3b 0a 0a 20 20 20 20 2f  [nReuse];..    /
26950 2a 20 55 6e 6d 61 70 20 61 6e 79 20 70 61 67 65  * Unmap any page
26960 73 20 6f 66 20 74 68 65 20 65 78 69 73 74 69 6e  s of the existin
26970 67 20 6d 61 70 70 69 6e 67 20 74 68 61 74 20 63  g mapping that c
26980 61 6e 6e 6f 74 20 62 65 20 72 65 75 73 65 64 2e  annot be reused.
26990 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 75   */.    if( nReu
269a0 73 65 21 3d 6e 4f 72 69 67 20 29 7b 0a 20 20 20  se!=nOrig ){.   
269b0 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 52 65 71     osMunmap(pReq
269c0 2c 20 6e 4f 72 69 67 2d 6e 52 65 75 73 65 29 3b  , nOrig-nReuse);
269d0 0a 20 20 20 20 7d 0a 0a 23 69 66 20 48 41 56 45  .    }..#if HAVE
269e0 5f 4d 52 45 4d 41 50 0a 20 20 20 20 70 4e 65 77  _MREMAP.    pNew
269f0 20 3d 20 6f 73 4d 72 65 6d 61 70 28 70 4f 72 69   = osMremap(pOri
26a00 67 2c 20 6e 52 65 75 73 65 2c 20 6e 4e 65 77 2c  g, nReuse, nNew,
26a10 20 4d 52 45 4d 41 50 5f 4d 41 59 4d 4f 56 45 29   MREMAP_MAYMOVE)
26a20 3b 0a 20 20 20 20 7a 45 72 72 20 3d 20 22 6d 72  ;.    zErr = "mr
26a30 65 6d 61 70 22 3b 0a 23 65 6c 73 65 0a 20 20 20  emap";.#else.   
26a40 20 70 4e 65 77 20 3d 20 6f 73 4d 6d 61 70 28 70   pNew = osMmap(p
26a50 52 65 71 2c 20 6e 4e 65 77 2d 6e 52 65 75 73 65  Req, nNew-nReuse
26a60 2c 20 66 6c 61 67 73 2c 20 4d 41 50 5f 53 48 41  , flags, MAP_SHA
26a70 52 45 44 2c 20 68 2c 20 6e 52 65 75 73 65 29 3b  RED, h, nReuse);
26a80 0a 20 20 20 20 69 66 28 20 70 4e 65 77 21 3d 4d  .    if( pNew!=M
26a90 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20  AP_FAILED ){.   
26aa0 20 20 20 69 66 28 20 70 4e 65 77 21 3d 70 52 65     if( pNew!=pRe
26ab0 71 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 73 4d  q ){.        osM
26ac0 75 6e 6d 61 70 28 70 4e 65 77 2c 20 6e 4e 65 77  unmap(pNew, nNew
26ad0 20 2d 20 6e 52 65 75 73 65 29 3b 0a 20 20 20 20   - nReuse);.    
26ae0 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20      pNew = 0;.  
26af0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26b00 20 20 20 70 4e 65 77 20 3d 20 70 4f 72 69 67 3b     pNew = pOrig;
26b10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
26b20 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68  endif..    /* Th
26b30 65 20 61 74 74 65 6d 70 74 20 74 6f 20 65 78 74  e attempt to ext
26b40 65 6e 64 20 74 68 65 20 65 78 69 73 74 69 6e 67  end the existing
26b50 20 6d 61 70 70 69 6e 67 20 66 61 69 6c 65 64 2e   mapping failed.
26b60 20 46 72 65 65 20 69 74 2e 20 2a 2f 0a 20 20 20   Free it. */.   
26b70 20 69 66 28 20 70 4e 65 77 3d 3d 4d 41 50 5f 46   if( pNew==MAP_F
26b80 41 49 4c 45 44 20 7c 7c 20 70 4e 65 77 3d 3d 30  AILED || pNew==0
26b90 20 29 7b 0a 20 20 20 20 20 20 6f 73 4d 75 6e 6d   ){.      osMunm
26ba0 61 70 28 70 4f 72 69 67 2c 20 6e 52 65 75 73 65  ap(pOrig, nReuse
26bb0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
26bc0 2f 2a 20 49 66 20 70 4e 65 77 20 69 73 20 73 74  /* If pNew is st
26bd0 69 6c 6c 20 4e 55 4c 4c 2c 20 74 72 79 20 74 6f  ill NULL, try to
26be0 20 63 72 65 61 74 65 20 61 6e 20 65 6e 74 69 72   create an entir
26bf0 65 6c 79 20 6e 65 77 20 6d 61 70 70 69 6e 67 2e  ely new mapping.
26c00 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   */.  if( pNew==
26c10 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20  0 ){.    pNew = 
26c20 6f 73 4d 6d 61 70 28 30 2c 20 6e 4e 65 77 2c 20  osMmap(0, nNew, 
26c30 66 6c 61 67 73 2c 20 4d 41 50 5f 53 48 41 52 45  flags, MAP_SHARE
26c40 44 2c 20 68 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  D, h, 0);.  }.. 
26c50 20 69 66 28 20 70 4e 65 77 3d 3d 4d 41 50 5f 46   if( pNew==MAP_F
26c60 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 70 4e 65  AILED ){.    pNe
26c70 77 20 3d 20 30 3b 0a 20 20 20 20 6e 4e 65 77 20  w = 0;.    nNew 
26c80 3d 20 30 3b 0a 20 20 20 20 75 6e 69 78 4c 6f 67  = 0;.    unixLog
26c90 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 4f 4b 2c  Error(SQLITE_OK,
26ca0 20 7a 45 72 72 2c 20 70 46 64 2d 3e 7a 50 61 74   zErr, pFd->zPat
26cb0 68 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  h);..    /* If t
26cc0 68 65 20 6d 6d 61 70 28 29 20 61 62 6f 76 65 20  he mmap() above 
26cd0 66 61 69 6c 65 64 2c 20 61 73 73 75 6d 65 20 74  failed, assume t
26ce0 68 61 74 20 61 6c 6c 20 73 75 62 73 65 71 75 65  hat all subseque
26cf0 6e 74 20 6d 6d 61 70 28 29 20 63 61 6c 6c 73 0a  nt mmap() calls.
26d00 20 20 20 20 2a 2a 20 77 69 6c 6c 20 70 72 6f 62      ** will prob
26d10 61 62 6c 79 20 66 61 69 6c 20 74 6f 6f 2e 20 46  ably fail too. F
26d20 61 6c 6c 20 62 61 63 6b 20 74 6f 20 75 73 69 6e  all back to usin
26d30 67 20 78 52 65 61 64 2f 78 57 72 69 74 65 20 65  g xRead/xWrite e
26d40 78 63 6c 75 73 69 76 65 6c 79 0a 20 20 20 20 2a  xclusively.    *
26d50 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  * in this case. 
26d60 20 2a 2f 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61   */.    pFd->mma
26d70 70 53 69 7a 65 4d 61 78 20 3d 20 30 3b 0a 20 20  pSizeMax = 0;.  
26d80 7d 0a 20 20 70 46 64 2d 3e 70 4d 61 70 52 65 67  }.  pFd->pMapReg
26d90 69 6f 6e 20 3d 20 28 76 6f 69 64 20 2a 29 70 4e  ion = (void *)pN
26da0 65 77 3b 0a 20 20 70 46 64 2d 3e 6d 6d 61 70 53  ew;.  pFd->mmapS
26db0 69 7a 65 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53  ize = pFd->mmapS
26dc0 69 7a 65 41 63 74 75 61 6c 20 3d 20 6e 4e 65 77  izeActual = nNew
26dd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72  ;.}../*.** Memor
26de0 79 20 6d 61 70 20 6f 72 20 72 65 6d 61 70 20 74  y map or remap t
26df0 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 62  he file opened b
26e00 79 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f  y file-descripto
26e10 72 20 70 46 64 20 28 69 66 20 74 68 65 20 66 69  r pFd (if the fi
26e20 6c 65 0a 2a 2a 20 69 73 20 61 6c 72 65 61 64 79  le.** is already
26e30 20 6d 61 70 70 65 64 2c 20 74 68 65 20 65 78 69   mapped, the exi
26e40 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73  sting mapping is
26e50 20 72 65 70 6c 61 63 65 64 20 62 79 20 74 68 65   replaced by the
26e60 20 6e 65 77 29 2e 20 4f 72 2c 20 69 66 20 0a 2a   new). Or, if .*
26e70 2a 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 20  * there already 
26e80 65 78 69 73 74 73 20 61 20 6d 61 70 70 69 6e 67  exists a mapping
26e90 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20   for this file, 
26ea0 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 73 74  and there are st
26eb0 69 6c 6c 20 0a 2a 2a 20 6f 75 74 73 74 61 6e 64  ill .** outstand
26ec0 69 6e 67 20 78 46 65 74 63 68 28 29 20 72 65 66  ing xFetch() ref
26ed0 65 72 65 6e 63 65 73 20 74 6f 20 69 74 2c 20 74  erences to it, t
26ee0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
26ef0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
26f00 66 20 70 61 72 61 6d 65 74 65 72 20 6e 42 79 74  f parameter nByt
26f10 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  e is non-negativ
26f20 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  e, then it is th
26f30 65 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65  e requested size
26f40 20 6f 66 20 0a 2a 2a 20 74 68 65 20 6d 61 70 70   of .** the mapp
26f50 69 6e 67 20 74 6f 20 63 72 65 61 74 65 2e 20 4f  ing to create. O
26f60 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 42 79  therwise, if nBy
26f70 74 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  te is less than 
26f80 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 0a  zero, then the .
26f90 2a 2a 20 72 65 71 75 65 73 74 65 64 20 73 69 7a  ** requested siz
26fa0 65 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66  e is the size of
26fb0 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
26fc0 6b 2e 20 54 68 65 20 61 63 74 75 61 6c 20 73 69  k. The actual si
26fd0 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 72 65  ze of the.** cre
26fe0 61 74 65 64 20 6d 61 70 70 69 6e 67 20 69 73 20  ated mapping is 
26ff0 65 69 74 68 65 72 20 74 68 65 20 72 65 71 75 65  either the reque
27000 73 74 65 64 20 73 69 7a 65 20 6f 72 20 74 68 65  sted size or the
27010 20 76 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65   value configure
27020 64 20 0a 2a 2a 20 75 73 69 6e 67 20 53 51 4c 49  d .** using SQLI
27030 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 4c 49  TE_FCNTL_MMAP_LI
27040 4d 49 54 2c 20 77 68 69 63 68 65 76 65 72 20 69  MIT, whichever i
27050 73 20 73 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a  s smaller..**.**
27060 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
27070 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72  turned if no err
27080 6f 72 20 6f 63 63 75 72 73 20 28 65 76 65 6e 20  or occurs (even 
27090 69 66 20 74 68 65 20 6d 61 70 70 69 6e 67 20 69  if the mapping i
270a0 73 20 6e 6f 74 0a 2a 2a 20 72 65 63 72 65 61 74  s not.** recreat
270b0 65 64 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ed as a result o
270c0 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  f outstanding re
270d0 66 65 72 65 6e 63 65 73 29 20 6f 72 20 61 6e 20  ferences) or an 
270e0 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20  SQLite error.** 
270f0 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  code otherwise..
27100 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
27110 69 78 4d 61 70 66 69 6c 65 28 75 6e 69 78 46 69  ixMapfile(unixFi
27120 6c 65 20 2a 70 46 64 2c 20 69 36 34 20 6e 4d 61  le *pFd, i64 nMa
27130 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6e 4d  p){.  assert( nM
27140 61 70 3e 3d 30 20 7c 7c 20 70 46 64 2d 3e 6e 46  ap>=0 || pFd->nF
27150 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20  etchOut==0 );.  
27160 69 66 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f  if( pFd->nFetchO
27170 75 74 3e 30 20 29 20 72 65 74 75 72 6e 20 53 51  ut>0 ) return SQ
27180 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20  LITE_OK;..  if( 
27190 6e 4d 61 70 3c 30 20 29 7b 0a 20 20 20 20 73 74  nMap<0 ){.    st
271a0 72 75 63 74 20 73 74 61 74 20 73 74 61 74 62 75  ruct stat statbu
271b0 66 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  f;          /* L
271c0 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e  ow-level file in
271d0 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  formation */.   
271e0 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 46 64   if( osFstat(pFd
271f0 2d 3e 68 2c 20 26 73 74 61 74 62 75 66 29 20 29  ->h, &statbuf) )
27200 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
27210 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
27220 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61  T;.    }.    nMa
27230 70 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 73  p = statbuf.st_s
27240 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  ize;.  }.  if( n
27250 4d 61 70 3e 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  Map>pFd->mmapSiz
27260 65 4d 61 78 20 29 7b 0a 20 20 20 20 6e 4d 61 70  eMax ){.    nMap
27270 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65   = pFd->mmapSize
27280 4d 61 78 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  Max;.  }..  if( 
27290 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d 61 70 53  nMap!=pFd->mmapS
272a0 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ize ){.    if( n
272b0 4d 61 70 3e 30 20 29 7b 0a 20 20 20 20 20 20 75  Map>0 ){.      u
272c0 6e 69 78 52 65 6d 61 70 66 69 6c 65 28 70 46 64  nixRemapfile(pFd
272d0 2c 20 6e 4d 61 70 29 3b 0a 20 20 20 20 7d 65 6c  , nMap);.    }el
272e0 73 65 7b 0a 20 20 20 20 20 20 75 6e 69 78 55 6e  se{.      unixUn
272f0 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20  mapfile(pFd);.  
27300 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
27310 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
27320 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
27330 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20  MAX_MMAP_SIZE>0 
27340 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73  */../*.** If pos
27350 73 69 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 20  sible, return a 
27360 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d 61 70  pointer to a map
27370 70 69 6e 67 20 6f 66 20 66 69 6c 65 20 66 64 20  ping of file fd 
27380 73 74 61 72 74 69 6e 67 20 61 74 20 6f 66 66 73  starting at offs
27390 65 74 0a 2a 2a 20 69 4f 66 66 2e 20 54 68 65 20  et.** iOff. The 
273a0 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65 20  mapping must be 
273b0 76 61 6c 69 64 20 66 6f 72 20 61 74 20 6c 65 61  valid for at lea
273c0 73 74 20 6e 41 6d 74 20 62 79 74 65 73 2e 0a 2a  st nAmt bytes..*
273d0 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 20 70  *.** If such a p
273e0 6f 69 6e 74 65 72 20 63 61 6e 20 62 65 20 6f 62  ointer can be ob
273f0 74 61 69 6e 65 64 2c 20 73 74 6f 72 65 20 69 74  tained, store it
27400 20 69 6e 20 2a 70 70 20 61 6e 64 20 72 65 74 75   in *pp and retu
27410 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  rn SQLITE_OK..**
27420 20 4f 72 2c 20 69 66 20 6f 6e 65 20 63 61 6e 6e   Or, if one cann
27430 6f 74 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20  ot but no error 
27440 6f 63 63 75 72 73 2c 20 73 65 74 20 2a 70 70 20  occurs, set *pp 
27450 74 6f 20 30 20 61 6e 64 20 72 65 74 75 72 6e 20  to 0 and return 
27460 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69  SQLITE_OK..** Fi
27470 6e 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72  nally, if an err
27480 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 72  or does occur, r
27490 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
274a0 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65 20  error code. The 
274b0 66 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f  final.** value o
274c0 66 20 2a 70 70 20 69 73 20 75 6e 64 65 66 69 6e  f *pp is undefin
274d0 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ed in this case.
274e0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66  .**.** If this f
274f0 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 72 65 74  unction does ret
27500 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 2c 20 74  urn a pointer, t
27510 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
27520 76 65 6e 74 75 61 6c 6c 79 20 0a 2a 2a 20 72 65  ventually .** re
27530 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65  lease the refere
27540 6e 63 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 75  nce by calling u
27550 6e 69 78 55 6e 66 65 74 63 68 28 29 2e 0a 2a 2f  nixUnfetch()..*/
27560 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
27570 46 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69  Fetch(sqlite3_fi
27580 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66  le *fd, i64 iOff
27590 2c 20 69 6e 74 20 6e 41 6d 74 2c 20 76 6f 69 64  , int nAmt, void
275a0 20 2a 2a 70 70 29 7b 0a 23 69 66 20 53 51 4c 49   **pp){.#if SQLI
275b0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
275c0 3e 30 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  >0.  unixFile *p
275d0 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  Fd = (unixFile *
275e0 29 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e  )fd;   /* The un
275f0 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73  derlying databas
27600 65 20 66 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66  e file */.#endif
27610 0a 20 20 2a 70 70 20 3d 20 30 3b 0a 0a 23 69 66  .  *pp = 0;..#if
27620 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
27630 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70 46  _SIZE>0.  if( pF
27640 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30  d->mmapSizeMax>0
27650 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 64 2d   ){.    if( pFd-
27660 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 20 29  >pMapRegion==0 )
27670 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  {.      int rc =
27680 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 64   unixMapfile(pFd
27690 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 69 66 28  , -1);.      if(
276a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
276b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
276c0 7d 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 6d  }.    if( pFd->m
276d0 6d 61 70 53 69 7a 65 20 3e 3d 20 69 4f 66 66 2b  mapSize >= iOff+
276e0 6e 41 6d 74 20 29 7b 0a 20 20 20 20 20 20 2a 70  nAmt ){.      *p
276f0 70 20 3d 20 26 28 28 75 38 20 2a 29 70 46 64 2d  p = &((u8 *)pFd-
27700 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66  >pMapRegion)[iOf
27710 66 5d 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6e  f];.      pFd->n
27720 46 65 74 63 68 4f 75 74 2b 2b 3b 0a 20 20 20 20  FetchOut++;.    
27730 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  }.  }.#endif.  r
27740 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
27750 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
27760 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20   third argument 
27770 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65  is non-NULL, the
27780 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
27790 72 65 6c 65 61 73 65 73 20 61 20 0a 2a 2a 20 72  releases a .** r
277a0 65 66 65 72 65 6e 63 65 20 6f 62 74 61 69 6e 65  eference obtaine
277b0 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  d by an earlier 
277c0 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46 65 74 63  call to unixFetc
277d0 68 28 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 0a  h(). The second.
277e0 2a 2a 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  ** argument pass
277f0 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
27800 69 6f 6e 20 6d 75 73 74 20 62 65 20 74 68 65 20  ion must be the 
27810 73 61 6d 65 20 61 73 20 74 68 65 20 63 6f 72 72  same as the corr
27820 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72 67  esponding.** arg
27830 75 6d 65 6e 74 20 74 68 61 74 20 77 61 73 20 70  ument that was p
27840 61 73 73 65 64 20 74 6f 20 74 68 65 20 75 6e 69  assed to the uni
27850 78 46 65 74 63 68 28 29 20 69 6e 76 6f 63 61 74  xFetch() invocat
27860 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  ion. .**.** Or, 
27870 69 66 20 74 68 65 20 74 68 69 72 64 20 61 72 67  if the third arg
27880 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74  ument is NULL, t
27890 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
278a0 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  n is being calle
278b0 64 20 0a 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d 20  d .** to inform 
278c0 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 74 68  the VFS layer th
278d0 61 74 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  at, according to
278e0 20 50 4f 53 49 58 2c 20 61 6e 79 20 65 78 69 73   POSIX, any exis
278f0 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 0a 2a 2a  ting mapping .**
27900 20 6d 61 79 20 6e 6f 77 20 62 65 20 69 6e 76 61   may now be inva
27910 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c 64 20 62  lid and should b
27920 65 20 75 6e 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73  e unmapped..*/.s
27930 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e  tatic int unixUn
27940 66 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69  fetch(sqlite3_fi
27950 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66  le *fd, i64 iOff
27960 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 23 69 66 20  , void *p){.#if 
27970 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
27980 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78 46 69 6c  SIZE>0.  unixFil
27990 65 20 2a 70 46 64 20 3d 20 28 75 6e 69 78 46 69  e *pFd = (unixFi
279a0 6c 65 20 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68  le *)fd;   /* Th
279b0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
279c0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
279d0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
279e0 28 69 4f 66 66 29 3b 0a 0a 20 20 2f 2a 20 49 66  (iOff);..  /* If
279f0 20 70 3d 3d 30 20 28 75 6e 6d 61 70 20 74 68 65   p==0 (unmap the
27a00 20 65 6e 74 69 72 65 20 66 69 6c 65 29 20 74 68   entire file) th
27a10 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
27a20 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
27a30 0a 20 20 2a 2a 20 78 46 65 74 63 68 20 72 65 66  .  ** xFetch ref
27a40 65 72 65 6e 63 65 73 2e 20 4f 72 2c 20 69 66 20  erences. Or, if 
27a50 70 21 3d 30 20 28 6d 65 61 6e 69 6e 67 20 69 74  p!=0 (meaning it
27a60 20 69 73 20 61 6e 20 78 46 65 74 63 68 20 72 65   is an xFetch re
27a70 66 65 72 65 6e 63 65 29 2c 0a 20 20 2a 2a 20 74  ference),.  ** t
27a80 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
27a90 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  e at least one o
27aa0 75 74 73 74 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a  utstanding.  */.
27ab0 20 20 61 73 73 65 72 74 28 20 28 70 3d 3d 30 29    assert( (p==0)
27ac0 3d 3d 28 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  ==(pFd->nFetchOu
27ad0 74 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  t==0) );..  /* I
27ae0 66 20 70 21 3d 30 2c 20 69 74 20 6d 75 73 74 20  f p!=0, it must 
27af0 6d 61 74 63 68 20 74 68 65 20 69 4f 66 66 20 76  match the iOff v
27b00 61 6c 75 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72  alue. */.  asser
27b10 74 28 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28  t( p==0 || p==&(
27b20 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52  (u8 *)pFd->pMapR
27b30 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a  egion)[iOff] );.
27b40 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
27b50 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2d 2d  pFd->nFetchOut--
27b60 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75  ;.  }else{.    u
27b70 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 64  nixUnmapfile(pFd
27b80 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
27b90 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74  ( pFd->nFetchOut
27ba0 3e 3d 30 20 29 3b 0a 23 65 6c 73 65 0a 20 20 55  >=0 );.#else.  U
27bb0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
27bc0 66 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  fd);.  UNUSED_PA
27bd0 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 55 4e  RAMETER(p);.  UN
27be0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69  USED_PARAMETER(i
27bf0 4f 66 66 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  Off);.#endif.  r
27c00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
27c10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65  .}../*.** Here e
27c20 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  nds the implemen
27c30 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71  tation of all sq
27c40 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f  lite3_file metho
27c50 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds..**.*********
27c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
27c70 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d  d sqlite3_file M
27c80 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
27c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27ca0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
27cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27cf0 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  *****/../*.** Th
27d00 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74  is division cont
27d10 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73  ains definitions
27d20 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   of sqlite3_io_m
27d30 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 74  ethods objects t
27d40 68 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  hat.** implement
27d50 20 76 61 72 69 6f 75 73 20 66 69 6c 65 20 6c 6f   various file lo
27d60 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65 73  cking strategies
27d70 2e 20 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74 61  .  It also conta
27d80 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a  ins definitions.
27d90 2a 2a 20 6f 66 20 22 66 69 6e 64 65 72 22 20 66  ** of "finder" f
27da0 75 6e 63 74 69 6f 6e 73 2e 20 20 41 20 66 69 6e  unctions.  A fin
27db0 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20  der-function is 
27dc0 75 73 65 64 20 74 6f 20 6c 6f 63 61 74 65 20 74  used to locate t
27dd0 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a  he appropriate.*
27de0 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
27df0 68 6f 64 73 20 6f 62 6a 65 63 74 20 66 6f 72 20  hods object for 
27e00 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74  a particular dat
27e10 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65  abase file.  The
27e20 20 70 41 70 70 44 61 74 61 0a 2a 2a 20 66 69 65   pAppData.** fie
27e30 6c 64 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  ld of the sqlite
27e40 33 5f 76 66 73 20 56 46 53 20 6f 62 6a 65 63 74  3_vfs VFS object
27e50 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65  s are initialize
27e60 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 65 72 73  d to be pointers
27e70 20 74 6f 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   to.** the corre
27e80 63 74 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  ct finder-functi
27e90 6f 6e 20 66 6f 72 20 74 68 61 74 20 56 46 53 2e  on for that VFS.
27ea0 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69 6e 64  .**.** Most find
27eb0 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74  er functions ret
27ec0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
27ed0 20 61 20 66 69 78 65 64 20 73 71 6c 69 74 65 33   a fixed sqlite3
27ee0 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f  _io_methods.** o
27ef0 62 6a 65 63 74 2e 20 20 54 68 65 20 6f 6e 6c 79  bject.  The only
27f00 20 69 6e 74 65 72 65 73 74 69 6e 67 20 66 69 6e   interesting fin
27f10 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20  der-function is 
27f20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
27f30 2c 20 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f 6b 73  , which.** looks
27f40 20 61 74 20 74 68 65 20 66 69 6c 65 73 79 73 74   at the filesyst
27f50 65 6d 20 74 79 70 65 20 61 6e 64 20 74 72 69 65  em type and trie
27f60 73 20 74 6f 20 67 75 65 73 73 20 74 68 65 20 62  s to guess the b
27f70 65 73 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73  est locking.** s
27f80 74 72 61 74 65 67 79 20 66 72 6f 6d 20 74 68 61  trategy from tha
27f90 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66 69 6e  t..**.** For fin
27fa0 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 46 2c 20  der-function F, 
27fb0 74 77 6f 20 6f 62 6a 65 63 74 73 20 61 72 65 20  two objects are 
27fc0 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20  created:.**.**  
27fd0 20 20 28 31 29 20 54 68 65 20 72 65 61 6c 20 66    (1) The real f
27fe0 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 6e  inder-function n
27ff0 61 6d 65 64 20 22 46 49 6d 70 74 28 29 22 2e 0a  amed "FImpt()"..
28000 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 41 20 63  **.**    (2) A c
28010 6f 6e 73 74 61 6e 74 20 70 6f 69 6e 74 65 72 20  onstant pointer 
28020 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
28030 20 6e 61 6d 65 64 20 6a 75 73 74 20 22 46 22 2e   named just "F".
28040 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e  .**.**.** A poin
28050 74 65 72 20 74 6f 20 74 68 65 20 46 20 70 6f 69  ter to the F poi
28060 6e 74 65 72 20 69 73 20 75 73 65 64 20 61 73 20  nter is used as 
28070 74 68 65 20 70 41 70 70 44 61 74 61 20 76 61 6c  the pAppData val
28080 75 65 20 66 6f 72 20 56 46 53 0a 2a 2a 20 6f 62  ue for VFS.** ob
28090 6a 65 63 74 73 2e 20 20 57 65 20 68 61 76 65 20  jects.  We have 
280a0 74 6f 20 64 6f 20 74 68 69 73 20 69 6e 73 74 65  to do this inste
280b0 61 64 20 6f 66 20 6c 65 74 74 69 6e 67 20 70 41  ad of letting pA
280c0 70 70 44 61 74 61 20 70 6f 69 6e 74 0a 2a 2a 20  ppData point.** 
280d0 64 69 72 65 63 74 6c 79 20 61 74 20 74 68 65 20  directly at the 
280e0 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20  finder-function 
280f0 73 69 6e 63 65 20 43 39 30 20 72 75 6c 65 73 20  since C90 rules 
28100 70 72 65 76 65 6e 74 20 61 20 76 6f 69 64 2a 0a  prevent a void*.
28110 2a 2a 20 66 72 6f 6d 20 62 65 20 63 61 73 74 20  ** from be cast 
28120 69 6e 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  into a function 
28130 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a  pointer..**.**.*
28140 2a 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20  * Each instance 
28150 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 20 67 65  of this macro ge
28160 6e 65 72 61 74 65 73 20 74 77 6f 20 6f 62 6a 65  nerates two obje
28170 63 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  cts:.**.**   *  
28180 41 20 63 6f 6e 73 74 61 6e 74 20 73 71 6c 69 74  A constant sqlit
28190 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
281a0 6a 65 63 74 20 63 61 6c 6c 20 4d 45 54 48 4f 44  ject call METHOD
281b0 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 69 6e   that has lockin
281c0 67 0a 2a 2a 20 20 20 20 20 20 6d 65 74 68 6f 64  g.**      method
281d0 73 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55  s CLOSE, LOCK, U
281e0 4e 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c 4f 43 4b  NLOCK, CKRESLOCK
281f0 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20  ..**.**   *  An 
28200 49 2f 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65  I/O method finde
28210 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  r function calle
28220 64 20 46 49 4e 44 45 52 20 74 68 61 74 20 72 65  d FINDER that re
28230 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a  turns a pointer.
28240 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 4d  **      to the M
28250 45 54 48 4f 44 20 6f 62 6a 65 63 74 20 69 6e 20  ETHOD object in 
28260 74 68 65 20 70 72 65 76 69 6f 75 73 20 62 75 6c  the previous bul
28270 6c 65 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  let..*/.#define 
28280 49 4f 4d 45 54 48 4f 44 53 28 46 49 4e 44 45 52  IOMETHODS(FINDER
28290 2c 4d 45 54 48 4f 44 2c 56 45 52 53 49 4f 4e 2c  ,METHOD,VERSION,
282a0 43 4c 4f 53 45 2c 4c 4f 43 4b 2c 55 4e 4c 4f 43  CLOSE,LOCK,UNLOC
282b0 4b 2c 43 4b 4c 4f 43 4b 2c 53 48 4d 4d 41 50 29  K,CKLOCK,SHMMAP)
282c0 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f       \.static co
282d0 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
282e0 65 74 68 6f 64 73 20 4d 45 54 48 4f 44 20 3d 20  ethods METHOD = 
282f0 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
28300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28310 20 20 20 20 5c 0a 20 20 20 56 45 52 53 49 4f 4e      \.   VERSION
28320 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28330 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
28340 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
28350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28360 20 20 20 5c 0a 20 20 20 43 4c 4f 53 45 2c 20 20     \.   CLOSE,  
28370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28380 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f      /* xClose */
28390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283b0 20 20 5c 0a 20 20 20 75 6e 69 78 52 65 61 64 2c    \.   unixRead,
283c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283d0 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 20 20     /* xRead */  
283e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28400 20 5c 0a 20 20 20 75 6e 69 78 57 72 69 74 65 2c   \.   unixWrite,
28410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28420 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 20 20    /* xWrite */  
28430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28450 5c 0a 20 20 20 75 6e 69 78 54 72 75 6e 63 61 74  \.   unixTruncat
28460 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
28470 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f   /* xTruncate */
28480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
284a0 0a 20 20 20 75 6e 69 78 53 79 6e 63 2c 20 20 20  .   unixSync,   
284b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284c0 2f 2a 20 78 53 79 6e 63 20 2a 2f 20 20 20 20 20  /* xSync */     
284d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
284f0 20 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c     unixFileSize,
28500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28510 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 20 20  * xFileSize */  
28520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28530 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
28540 20 20 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20    LOCK,         
28550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28560 20 78 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20   xLock */       
28570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28580 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
28590 20 55 4e 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20   UNLOCK,        
285a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
285b0 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20 20 20  xUnlock */      
285c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285d0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
285e0 43 4b 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20  CKLOCK,         
285f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
28600 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
28610 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  k */            
28620 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
28630 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20  nixFileControl, 
28640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
28650 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20 20  ileControl */   
28660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28670 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
28680 69 78 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20  ixSectorSize,   
28690 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65            /* xSe
286a0 63 74 6f 72 53 69 7a 65 20 2a 2f 20 20 20 20 20  ctorSize */     
286b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286c0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
286d0 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  xDeviceCharacter
286e0 69 73 74 69 63 73 2c 20 20 2f 2a 20 78 44 65 76  istics,  /* xDev
286f0 69 63 65 43 61 70 61 62 69 6c 69 74 69 65 73 20  iceCapabilities 
28700 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
28710 20 20 20 20 20 20 20 5c 0a 20 20 20 53 48 4d 4d         \.   SHMM
28720 41 50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  AP,             
28730 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
28740 61 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ap */           
28750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28760 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
28770 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  hmLock,         
28780 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f         /* xShmLo
28790 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ck */           
287a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287b0 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68       \.   unixSh
287c0 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20 20 20  mBarrier,       
287d0 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72        /* xShmBar
287e0 72 69 65 72 20 2a 2f 20 20 20 20 20 20 20 20 20  rier */         
287f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28800 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d      \.   unixShm
28810 55 6e 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20  Unmap,          
28820 20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61       /* xShmUnma
28830 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  p */            
28840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28850 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 65 74 63     \.   unixFetc
28860 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
28870 20 20 20 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f      /* xFetch */
28880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288a0 20 20 5c 0a 20 20 20 75 6e 69 78 55 6e 66 65 74    \.   unixUnfet
288b0 63 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ch,             
288c0 20 20 20 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a     /* xUnfetch *
288d0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
288e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288f0 20 5c 0a 7d 3b 20 20 20 20 20 20 20 20 20 20 20   \.};           
28900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28940 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  \.static const s
28950 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
28960 73 20 2a 46 49 4e 44 45 52 23 23 49 6d 70 6c 28  s *FINDER##Impl(
28970 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 75  const char *z, u
28980 6e 69 78 46 69 6c 65 20 2a 70 29 7b 20 20 20 5c  nixFile *p){   \
28990 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
289a0 54 45 52 28 7a 29 3b 20 55 4e 55 53 45 44 5f 50  TER(z); UNUSED_P
289b0 41 52 41 4d 45 54 45 52 28 70 29 3b 20 20 20 20  ARAMETER(p);    
289c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
289e0 20 20 72 65 74 75 72 6e 20 26 4d 45 54 48 4f 44    return &METHOD
289f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a10 20 20 20 20 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 5c 0a 7d               \.}
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 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a70 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74              \.st
28a80 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
28a90 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28  e3_io_methods *(
28aa0 2a 63 6f 6e 73 74 20 46 49 4e 44 45 52 29 28 63  *const FINDER)(c
28ab0 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46  onst char*,unixF
28ac0 69 6c 65 20 2a 70 29 20 20 20 20 5c 0a 20 20 20  ile *p)    \.   
28ad0 20 3d 20 46 49 4e 44 45 52 23 23 49 6d 70 6c 3b   = FINDER##Impl;
28ae0 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 61 72 65  ../*.** Here are
28af0 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 71 6c 69   all of the sqli
28b00 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
28b10 62 6a 65 63 74 73 20 66 6f 72 20 65 61 63 68 20  bjects for each 
28b20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e  of the.** lockin
28b30 67 20 73 74 72 61 74 65 67 69 65 73 2e 20 20 46  g strategies.  F
28b40 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 72 65  unctions that re
28b50 74 75 72 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f  turn pointers to
28b60 20 74 68 65 73 65 20 6d 65 74 68 6f 64 73 0a 2a   these methods.*
28b70 2a 20 61 72 65 20 61 6c 73 6f 20 63 72 65 61 74  * are also creat
28b80 65 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53  ed..*/.IOMETHODS
28b90 28 0a 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65  (.  posixIoFinde
28ba0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
28bb0 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
28bc0 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f 73 69 78   name */.  posix
28bd0 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
28be0 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
28bf0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
28c00 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 33 2c 20 20  t name */.  3,  
28c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
28c30 6d 65 6d 6f 72 79 20 61 6e 64 20 6d 6d 61 70 20  memory and mmap 
28c40 61 72 65 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  are enabled */. 
28c50 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20   unixClose,     
28c60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
28c70 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
28c80 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20   unixLock,      
28c90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
28ca0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
28cb0 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  unixUnlock,     
28cc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
28cd0 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
28ce0 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76   unixCheckReserv
28cf0 65 64 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20 78 43  edLock,    /* xC
28d00 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
28d10 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69   method */.  uni
28d20 78 53 68 6d 4d 61 70 20 20 20 20 20 20 20 20 20  xShmMap         
28d30 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61         /* xShmMa
28d40 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f  p method */.).IO
28d50 4d 45 54 48 4f 44 53 28 0a 20 20 6e 6f 6c 6f 63  METHODS(.  noloc
28d60 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  kIoFinder,      
28d70 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
28d80 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
28d90 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64    nolockIoMethod
28da0 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  s,          /* s
28db0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
28dc0 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
28dd0 0a 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20  .  3,           
28de0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28df0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
28e00 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 6e   disabled */.  n
28e10 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20  olockClose,     
28e20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
28e30 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e  se method */.  n
28e40 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20  olockLock,      
28e50 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
28e60 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f  k method */.  no
28e70 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  lockUnlock,     
28e80 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
28e90 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e  ck method */.  n
28ea0 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  olockCheckReserv
28eb0 65 64 4c 6f 63 6b 2c 20 20 2f 2a 20 78 43 68 65  edLock,  /* xChe
28ec0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
28ed0 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20  ethod */.  0    
28ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ef0 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
28f00 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45  method */.).IOME
28f10 54 48 4f 44 53 28 0a 20 20 64 6f 74 6c 6f 63 6b  THODS(.  dotlock
28f20 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
28f30 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
28f40 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
28f50 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  dotlockIoMethods
28f60 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c  ,         /* sql
28f70 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
28f80 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
28f90 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
28fa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
28fb0 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
28fc0 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 64 6f 74  isabled */.  dot
28fd0 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20  lockClose,      
28fe0 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
28ff0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74   method */.  dot
29000 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20  lockLock,       
29010 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
29020 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c  method */.  dotl
29030 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  ockUnlock,      
29040 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
29050 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74   method */.  dot
29060 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
29070 64 4c 6f 63 6b 2c 20 2f 2a 20 78 43 68 65 63 6b  dLock, /* xCheck
29080 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
29090 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20  hod */.  0      
290a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290b0 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65     /* xShmMap me
290c0 74 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66 20 53  thod */.)..#if S
290d0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
290e0 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54  KING_STYLE.IOMET
290f0 48 4f 44 53 28 0a 20 20 66 6c 6f 63 6b 49 6f 46  HODS(.  flockIoF
29100 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
29110 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
29120 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 66  tion name */.  f
29130 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20  lockIoMethods,  
29140 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
29150 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
29160 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
29170 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
29180 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
29190 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69  red memory is di
291a0 73 61 62 6c 65 64 20 2a 2f 0a 20 20 66 6c 6f 63  sabled */.  floc
291b0 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  kClose,         
291c0 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
291d0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63  method */.  floc
291e0 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  kLock,          
291f0 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
29200 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b  ethod */.  flock
29210 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
29220 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
29230 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63  method */.  floc
29240 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
29250 63 6b 2c 20 20 20 2f 2a 20 78 43 68 65 63 6b 52  ck,   /* xCheckR
29260 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
29270 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20  od */.  0       
29280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29290 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74    /* xShmMap met
292a0 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
292b0 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
292c0 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 73 65 6d  IOMETHODS(.  sem
292d0 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
292e0 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
292f0 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
29300 2f 0a 20 20 73 65 6d 49 6f 4d 65 74 68 6f 64 73  /.  semIoMethods
29310 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
29320 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
29330 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
29340 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
29350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29360 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
29370 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
29380 20 73 65 6d 58 43 6c 6f 73 65 2c 20 20 20 20 20   semXClose,     
29390 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
293a0 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
293b0 20 73 65 6d 58 4c 6f 63 6b 2c 20 20 20 20 20 20   semXLock,      
293c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
293d0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
293e0 73 65 6d 58 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  semXUnlock,     
293f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
29400 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
29410 20 73 65 6d 58 43 68 65 63 6b 52 65 73 65 72 76   semXCheckReserv
29420 65 64 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20 78 43  edLock,    /* xC
29430 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
29440 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20   method */.  0  
29450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29460 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61         /* xShmMa
29470 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65  p method */.).#e
29480 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65  ndif..#if define
29490 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
294a0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
294b0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45  CKING_STYLE.IOME
294c0 54 48 4f 44 53 28 0a 20 20 61 66 70 49 6f 46 69  THODS(.  afpIoFi
294d0 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
294e0 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
294f0 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
29500 61 66 70 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  afpIoMethods,   
29510 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
29520 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
29530 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
29540 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
29550 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
29560 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
29570 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 66 70  isabled */.  afp
29580 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
29590 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
295a0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70   method */.  afp
295b0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
295c0 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
295d0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 55  method */.  afpU
295e0 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
295f0 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
29600 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70   method */.  afp
29610 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
29620 6b 2c 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  k,     /* xCheck
29630 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
29640 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20  hod */.  0      
29650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29660 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65     /* xShmMap me
29670 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66  thod */.).#endif
29680 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78  ../*.** The prox
29690 79 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  y locking method
296a0 20 69 73 20 61 20 22 73 75 70 65 72 2d 6d 65 74   is a "super-met
296b0 68 6f 64 22 20 69 6e 20 74 68 65 20 73 65 6e 73  hod" in the sens
296c0 65 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 70 65  e that it.** ope
296d0 6e 73 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c  ns secondary fil
296e0 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f  e descriptors fo
296f0 72 20 74 68 65 20 63 6f 6e 63 68 20 61 6e 64 20  r the conch and 
29700 6c 6f 63 6b 20 66 69 6c 65 73 20 61 6e 64 0a 2a  lock files and.*
29710 2a 20 69 74 20 75 73 65 73 20 70 72 6f 78 79 2c  * it uses proxy,
29720 20 64 6f 74 2d 66 69 6c 65 2c 20 41 46 50 2c 20   dot-file, AFP, 
29730 61 6e 64 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b  and flock() lock
29740 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74  ing methods on t
29750 68 6f 73 65 0a 2a 2a 20 73 65 63 6f 6e 64 61 72  hose.** secondar
29760 79 20 66 69 6c 65 73 2e 20 20 46 6f 72 20 74 68  y files.  For th
29770 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64  is reason, the d
29780 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70  ivision that imp
29790 6c 65 6d 65 6e 74 73 0a 2a 2a 20 70 72 6f 78 79  lements.** proxy
297a0 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 6f 63 61   locking is loca
297b0 74 65 64 20 6d 75 63 68 20 66 75 72 74 68 65 72  ted much further
297c0 20 64 6f 77 6e 20 69 6e 20 74 68 65 20 66 69 6c   down in the fil
297d0 65 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64 0a  e.  But we need.
297e0 2a 2a 20 74 6f 20 67 6f 20 61 68 65 61 64 20 61  ** to go ahead a
297f0 6e 64 20 64 65 66 69 6e 65 20 74 68 65 20 73 71  nd define the sq
29800 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
29810 20 61 6e 64 20 66 69 6e 64 65 72 20 66 75 6e 63   and finder func
29820 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 70 72 6f 78  tion.** for prox
29830 79 20 6c 6f 63 6b 69 6e 67 20 68 65 72 65 2e 20  y locking here. 
29840 20 53 6f 20 77 65 20 66 6f 72 77 61 72 64 20 64   So we forward d
29850 65 63 6c 61 72 65 20 74 68 65 20 49 2f 4f 20 6d  eclare the I/O m
29860 65 74 68 6f 64 73 2e 0a 2a 2f 0a 23 69 66 20 64  ethods..*/.#if d
29870 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
29880 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
29890 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
298a0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
298b0 79 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  yClose(sqlite3_f
298c0 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e  ile*);.static in
298d0 74 20 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c 69  t proxyLock(sqli
298e0 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b  te3_file*, int);
298f0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
29900 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  yUnlock(sqlite3_
29910 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61  file*, int);.sta
29920 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 68 65  tic int proxyChe
29930 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
29940 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e  qlite3_file*, in
29950 74 2a 29 3b 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  t*);.IOMETHODS(.
29960 20 20 70 72 6f 78 79 49 6f 46 69 6e 64 65 72 2c    proxyIoFinder,
29970 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
29980 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
29990 61 6d 65 20 2a 2f 0a 20 20 70 72 6f 78 79 49 6f  ame */.  proxyIo
299a0 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
299b0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
299c0 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
299d0 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
299e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
299f0 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
29a00 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
29a10 20 2a 2f 0a 20 20 70 72 6f 78 79 43 6c 6f 73 65   */.  proxyClose
29a20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29a30 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
29a40 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 2c   */.  proxyLock,
29a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a60 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
29a70 2a 2f 0a 20 20 70 72 6f 78 79 55 6e 6c 6f 63 6b  */.  proxyUnlock
29a80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
29a90 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
29aa0 20 2a 2f 0a 20 20 70 72 6f 78 79 43 68 65 63 6b   */.  proxyCheck
29ab0 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20  ReservedLock,   
29ac0 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
29ad0 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
29ae0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
29af0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29b00 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f  ShmMap method */
29b10 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 6e 66  .).#endif../* nf
29b20 73 20 6c 6f 63 6b 64 20 6f 6e 20 4f 53 58 20 31  s lockd on OSX 1
29b30 30 2e 33 2b 20 64 6f 65 73 6e 27 74 20 63 6c 65  0.3+ doesn't cle
29b40 61 72 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 77  ar write locks w
29b50 68 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  hen a read lock 
29b60 69 73 20 73 65 74 20 2a 2f 0a 23 69 66 20 64 65  is set */.#if de
29b70 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
29b80 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
29b90 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
29ba0 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 66 73  IOMETHODS(.  nfs
29bb0 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
29bc0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
29bd0 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
29be0 2a 2f 0a 20 20 6e 66 73 49 6f 4d 65 74 68 6f 64  */.  nfsIoMethod
29bf0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
29c00 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
29c10 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
29c20 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
29c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c40 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
29c50 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
29c60 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20  /.  unixClose,  
29c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29c80 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
29c90 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20  */.  unixLock,  
29ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29cb0 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
29cc0 2a 2f 0a 20 20 6e 66 73 55 6e 6c 6f 63 6b 2c 20  */.  nfsUnlock, 
29cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ce0 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
29cf0 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b  d */.  unixCheck
29d00 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20  ReservedLock,   
29d10 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
29d20 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
29d30 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20  /.  0           
29d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29d50 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64  * xShmMap method
29d60 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69   */.).#endif..#i
29d70 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
29d80 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
29d90 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
29da0 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  YLE./* .** This 
29db0 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f  "finder" functio
29dc0 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65  n attempts to de
29dd0 74 65 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74  termine the best
29de0 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67   locking strateg
29df0 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 61  y .** for the da
29e00 74 61 62 61 73 65 20 66 69 6c 65 20 22 66 69 6c  tabase file "fil
29e10 65 50 61 74 68 22 2e 20 20 49 74 20 74 68 65 6e  ePath".  It then
29e20 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 71 6c   returns the sql
29e30 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a  ite3_io_methods.
29e40 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69  ** object that i
29e50 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 73  mplements that s
29e60 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54  trategy..**.** T
29e70 68 69 73 20 69 73 20 66 6f 72 20 4d 61 63 4f 53  his is for MacOS
29e80 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  X only..*/.stati
29e90 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
29ea0 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f  io_methods *auto
29eb0 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c  lockIoFinderImpl
29ec0 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
29ed0 66 69 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a 20  filePath,    /* 
29ee0 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
29ef0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75  base file */.  u
29f00 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 20 20  nixFile *pNew   
29f10 20 20 20 20 20 20 20 20 2f 2a 20 6f 70 65 6e 20          /* open 
29f20 66 69 6c 65 20 6f 62 6a 65 63 74 20 66 6f 72 20  file object for 
29f30 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
29f40 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69 63  e */.){.  static
29f50 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 4d 61   const struct Ma
29f60 70 70 69 6e 67 20 7b 0a 20 20 20 20 63 6f 6e 73  pping {.    cons
29f70 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 73 79 73  t char *zFilesys
29f80 74 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  tem;            
29f90 20 20 2f 2a 20 46 69 6c 65 73 79 73 74 65 6d 20    /* Filesystem 
29fa0 74 79 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  type name */.   
29fb0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
29fc0 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74 68  o_methods *pMeth
29fd0 6f 64 73 3b 20 20 20 2f 2a 20 41 70 70 72 6f 70  ods;   /* Approp
29fe0 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 65  riate locking me
29ff0 74 68 6f 64 20 2a 2f 0a 20 20 7d 20 61 4d 61 70  thod */.  } aMap
2a000 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 68 66  [] = {.    { "hf
2a010 73 22 2c 20 20 20 20 26 70 6f 73 69 78 49 6f 4d  s",    &posixIoM
2a020 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20  ethods },.    { 
2a030 22 75 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78  "ufs",    &posix
2a040 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20  IoMethods },.   
2a050 20 7b 20 22 61 66 70 66 73 22 2c 20 20 26 61 66   { "afpfs",  &af
2a060 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20  pIoMethods },.  
2a070 20 20 7b 20 22 73 6d 62 66 73 22 2c 20 20 26 61    { "smbfs",  &a
2a080 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20  fpIoMethods },. 
2a090 20 20 20 7b 20 22 77 65 62 64 61 76 22 2c 20 26     { "webdav", &
2a0a0 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20  nolockIoMethods 
2a0b0 7d 2c 0a 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a  },.    { 0, 0 }.
2a0c0 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20    };.  int i;.  
2a0d0 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73  struct statfs fs
2a0e0 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 66  Info;.  struct f
2a0f0 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a  lock lockInfo;..
2a100 20 20 69 66 28 20 21 66 69 6c 65 50 61 74 68 20    if( !filePath 
2a110 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66 69 6c  ){.    /* If fil
2a120 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74  ePath==NULL that
2a130 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64 65   means we are de
2a140 61 6c 69 6e 67 20 77 69 74 68 20 61 20 74 72 61  aling with a tra
2a150 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20 20 20 20  nsient file.    
2a160 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ** that does not
2a170 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b   need to be lock
2a180 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ed. */.    retur
2a190 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  n &nolockIoMetho
2a1a0 64 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74  ds;.  }.  if( st
2a1b0 61 74 66 73 28 66 69 6c 65 50 61 74 68 2c 20 26  atfs(filePath, &
2a1c0 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31 20 29 7b  fsInfo) != -1 ){
2a1d0 0a 20 20 20 20 69 66 28 20 66 73 49 6e 66 6f 2e  .    if( fsInfo.
2a1e0 66 5f 66 6c 61 67 73 20 26 20 4d 4e 54 5f 52 44  f_flags & MNT_RD
2a1f0 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 72 65  ONLY ){.      re
2a200 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65  turn &nolockIoMe
2a210 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20 20  thods;.    }.   
2a220 20 66 6f 72 28 69 3d 30 3b 20 61 4d 61 70 5b 69   for(i=0; aMap[i
2a230 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 69  ].zFilesystem; i
2a240 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
2a250 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66  trcmp(fsInfo.f_f
2a260 73 74 79 70 65 6e 61 6d 65 2c 20 61 4d 61 70 5b  stypename, aMap[
2a270 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d 29 3d  i].zFilesystem)=
2a280 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
2a290 74 75 72 6e 20 61 4d 61 70 5b 69 5d 2e 70 4d 65  turn aMap[i].pMe
2a2a0 74 68 6f 64 73 3b 0a 20 20 20 20 20 20 7d 0a 20  thods;.      }. 
2a2b0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44     }.  }..  /* D
2a2c0 65 66 61 75 6c 74 20 63 61 73 65 2e 20 48 61 6e  efault case. Han
2a2d0 64 6c 65 73 2c 20 61 6d 6f 6e 67 73 74 20 6f 74  dles, amongst ot
2a2e0 68 65 72 73 2c 20 22 6e 66 73 22 2e 0a 20 20 2a  hers, "nfs"..  *
2a2f0 2a 20 54 65 73 74 20 62 79 74 65 2d 72 61 6e 67  * Test byte-rang
2a300 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 66 63 6e  e lock using fcn
2a310 74 6c 28 29 2e 20 49 66 20 74 68 65 20 63 61 6c  tl(). If the cal
2a320 6c 20 73 75 63 63 65 65 64 73 2c 20 0a 20 20 2a  l succeeds, .  *
2a330 2a 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  * assume that th
2a340 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75  e file-system su
2a350 70 70 6f 72 74 73 20 50 4f 53 49 58 20 73 74 79  pports POSIX sty
2a360 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20 20 2a 2f 0a  le locks. .  */.
2a370 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e    lockInfo.l_len
2a380 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f   = 1;.  lockInfo
2a390 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20  .l_start = 0;.  
2a3a0 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63  lockInfo.l_whenc
2a3b0 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
2a3c0 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20  lockInfo.l_type 
2a3d0 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28  = F_RDLCK;.  if(
2a3e0 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68   osFcntl(pNew->h
2a3f0 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_GETLK, &lock
2a400 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20  Info)!=-1 ) {.  
2a410 20 20 69 66 28 20 73 74 72 63 6d 70 28 66 73 49    if( strcmp(fsI
2a420 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65  nfo.f_fstypename
2a430 2c 20 22 6e 66 73 22 29 3d 3d 30 20 29 7b 0a 20  , "nfs")==0 ){. 
2a440 20 20 20 20 20 72 65 74 75 72 6e 20 26 6e 66 73       return &nfs
2a450 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d  IoMethods;.    }
2a460 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 65   else {.      re
2a470 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74  turn &posixIoMet
2a480 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  hods;.    }.  }e
2a490 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
2a4a0 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64  &dotlockIoMethod
2a4b0 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  s;.  }.}.static 
2a4c0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
2a4d0 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63  _methods .  *(*c
2a4e0 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f 46  onst autolockIoF
2a4f0 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63 68 61  inder)(const cha
2a500 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20  r*,unixFile*) = 
2a510 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
2a520 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a  Impl;..#endif /*
2a530 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
2a540 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
2a550 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2a560 4c 45 20 2a 2f 0a 0a 23 69 66 20 4f 53 5f 56 58  LE */..#if OS_VX
2a570 57 4f 52 4b 53 0a 2f 2a 0a 2a 2a 20 54 68 69 73  WORKS./*.** This
2a580 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69   "finder" functi
2a590 6f 6e 20 66 6f 72 20 56 78 57 6f 72 6b 73 20 63  on for VxWorks c
2a5a0 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  hecks to see if 
2a5b0 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 0a 2a  posix advisory.*
2a5c0 2a 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 2e  * locking works.
2a5d0 20 20 49 66 20 69 74 20 64 6f 65 73 2c 20 74 68    If it does, th
2a5e0 65 6e 20 74 68 61 74 20 69 73 20 77 68 61 74 20  en that is what 
2a5f0 69 73 20 75 73 65 64 2e 20 20 49 66 20 69 74 20  is used.  If it 
2a600 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 77 6f 72 6b  does not.** work
2a610 2c 20 74 68 65 6e 20 66 61 6c 6c 62 61 63 6b 20  , then fallback 
2a620 74 6f 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f  to named semapho
2a630 72 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  re locking..*/.s
2a640 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
2a650 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
2a660 76 78 77 6f 72 6b 73 49 6f 46 69 6e 64 65 72 49  vxworksIoFinderI
2a670 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  mpl(.  const cha
2a680 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20 20  r *filePath,    
2a690 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* name of the d
2a6a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2a6b0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77    unixFile *pNew
2a6c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68             /* th
2a6d0 65 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65  e open file obje
2a6e0 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  ct */.){.  struc
2a6f0 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f  t flock lockInfo
2a700 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61  ;..  if( !filePa
2a710 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  th ){.    /* If 
2a720 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74  filePath==NULL t
2a730 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65  hat means we are
2a740 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
2a750 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20  transient file. 
2a760 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20     ** that does 
2a770 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c  not need to be l
2a780 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65  ocked. */.    re
2a790 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65  turn &nolockIoMe
2a7a0 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  thods;.  }..  /*
2a7b0 20 54 65 73 74 20 69 66 20 66 63 6e 74 6c 28 29   Test if fcntl()
2a7c0 20 69 73 20 73 75 70 70 6f 72 74 65 64 20 61 6e   is supported an
2a7d0 64 20 75 73 65 20 50 4f 53 49 58 20 73 74 79 6c  d use POSIX styl
2a7e0 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 20 4f 74  e locks..  ** Ot
2a7f0 68 65 72 77 69 73 65 20 66 61 6c 6c 20 62 61 63  herwise fall bac
2a800 6b 20 74 6f 20 74 68 65 20 6e 61 6d 65 64 20 73  k to the named s
2a810 65 6d 61 70 68 6f 72 65 20 6d 65 74 68 6f 64 2e  emaphore method.
2a820 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f  .  */.  lockInfo
2a830 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f  .l_len = 1;.  lo
2a840 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d  ckInfo.l_start =
2a850 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   0;.  lockInfo.l
2a860 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
2a870 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c  ET;.  lockInfo.l
2a880 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b  _type = F_RDLCK;
2a890 0a 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70  .  if( osFcntl(p
2a8a0 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c  New->h, F_GETLK,
2a8b0 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20   &lockInfo)!=-1 
2a8c0 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26  ) {.    return &
2a8d0 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a  posixIoMethods;.
2a8e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
2a8f0 75 72 6e 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64  urn &semIoMethod
2a900 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  s;.  }.}.static 
2a910 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
2a920 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63  _methods .  *(*c
2a930 6f 6e 73 74 20 76 78 77 6f 72 6b 73 49 6f 46 69  onst vxworksIoFi
2a940 6e 64 65 72 29 28 63 6f 6e 73 74 20 63 68 61 72  nder)(const char
2a950 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20 76  *,unixFile*) = v
2a960 78 77 6f 72 6b 73 49 6f 46 69 6e 64 65 72 49 6d  xworksIoFinderIm
2a970 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f  pl;..#endif /* O
2a980 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 0a 2f 2a  S_VXWORKS */../*
2a990 0a 2a 2a 20 41 6e 20 61 62 73 74 72 61 63 74 20  .** An abstract 
2a9a0 74 79 70 65 20 66 6f 72 20 61 20 70 6f 69 6e 74  type for a point
2a9b0 65 72 20 74 6f 20 61 6e 20 49 4f 20 6d 65 74 68  er to an IO meth
2a9c0 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69  od finder functi
2a9d0 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64 65 66 20 63  on:.*/.typedef c
2a9e0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
2a9f0 6d 65 74 68 6f 64 73 20 2a 28 2a 66 69 6e 64 65  methods *(*finde
2aa00 72 5f 74 79 70 65 29 28 63 6f 6e 73 74 20 63 68  r_type)(const ch
2aa10 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 3b 0a  ar*,unixFile*);.
2aa20 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
2aa30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aa40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aa50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aa60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
2aa70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aa80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c  ************ sql
2aa90 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73  ite3_vfs methods
2aaa0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
2aab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
2aac0 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f  .** This divisio
2aad0 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69  n contains the i
2aae0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
2aaf0 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a   methods on the.
2ab00 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f  ** sqlite3_vfs o
2ab10 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  bject..*/../*.**
2ab20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
2ab30 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2ab40 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
2ab50 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  re pointed to by
2ab60 20 70 49 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   pId..*/.static 
2ab70 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69  int fillInUnixFi
2ab80 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  le(.  sqlite3_vf
2ab90 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a  s *pVfs,      /*
2aba0 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20   Pointer to vfs 
2abb0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
2abc0 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
2abd0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65      /* Open file
2abe0 20 64 65 73 63 72 69 70 74 6f 72 20 6f 66 20 66   descriptor of f
2abf0 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  ile being opened
2ac00 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
2ac10 6c 65 20 2a 70 49 64 2c 20 20 20 20 20 20 2f 2a  le *pId,      /*
2ac20 20 57 72 69 74 65 20 74 6f 20 74 68 65 20 75 6e   Write to the un
2ac30 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65  ixFile structure
2ac40 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   here */.  const
2ac50 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
2ac60 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ,  /* Name of th
2ac70 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65  e file being ope
2ac80 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63 74 72  ned */.  int ctr
2ac90 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  lFlags          
2aca0 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65   /* Zero or more
2acb0 20 55 4e 49 58 46 49 4c 45 5f 2a 20 76 61 6c 75   UNIXFILE_* valu
2acc0 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  es */.){.  const
2acd0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2ace0 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e 67 53 74 79  ods *pLockingSty
2acf0 6c 65 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  le;.  unixFile *
2ad00 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65  pNew = (unixFile
2ad10 20 2a 29 70 49 64 3b 0a 20 20 69 6e 74 20 72 63   *)pId;.  int rc
2ad20 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
2ad30 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70   assert( pNew->p
2ad40 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a  Inode==NULL );..
2ad50 20 20 2f 2a 20 55 73 75 61 6c 6c 79 20 74 68 65    /* Usually the
2ad60 20 70 61 74 68 20 7a 46 69 6c 65 6e 61 6d 65 20   path zFilename 
2ad70 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 20  should not be a 
2ad80 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d  relative pathnam
2ad90 65 2e 20 54 68 65 0a 20 20 2a 2a 20 65 78 63 65  e. The.  ** exce
2ada0 70 74 69 6f 6e 20 69 73 20 77 68 65 6e 20 6f 70  ption is when op
2adb0 65 6e 69 6e 67 20 74 68 65 20 70 72 6f 78 79 20  ening the proxy 
2adc0 22 63 6f 6e 63 68 22 20 66 69 6c 65 20 69 6e 20  "conch" file in 
2add0 62 75 69 6c 64 73 20 74 68 61 74 0a 20 20 2a 2a  builds that.  **
2ade0 20 69 6e 63 6c 75 64 65 20 74 68 65 20 73 70 65   include the spe
2adf0 63 69 61 6c 20 41 70 70 6c 65 20 6c 6f 63 6b 69  cial Apple locki
2ae00 6e 67 20 73 74 79 6c 65 73 2e 0a 20 20 2a 2f 0a  ng styles..  */.
2ae10 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
2ae20 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
2ae30 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2ae40 53 54 59 4c 45 0a 20 20 61 73 73 65 72 74 28 20  STYLE.  assert( 
2ae50 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20  zFilename==0 || 
2ae60 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f  zFilename[0]=='/
2ae70 27 20 0a 20 20 20 20 7c 7c 20 70 56 66 73 2d 3e  ' .    || pVfs->
2ae80 70 41 70 70 44 61 74 61 3d 3d 28 76 6f 69 64 2a  pAppData==(void*
2ae90 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  )&autolockIoFind
2aea0 65 72 20 29 3b 0a 23 65 6c 73 65 0a 20 20 61 73  er );.#else.  as
2aeb0 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d  sert( zFilename=
2aec0 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b  =0 || zFilename[
2aed0 30 5d 3d 3d 27 2f 27 20 29 3b 0a 23 65 6e 64 69  0]=='/' );.#endi
2aee0 66 0a 0a 20 20 2f 2a 20 4e 6f 20 6c 6f 63 6b 69  f..  /* No locki
2aef0 6e 67 20 6f 63 63 75 72 73 20 69 6e 20 74 65 6d  ng occurs in tem
2af00 70 6f 72 61 72 79 20 66 69 6c 65 73 20 2a 2f 0a  porary files */.
2af10 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e    assert( zFilen
2af20 61 6d 65 21 3d 30 20 7c 7c 20 28 63 74 72 6c 46  ame!=0 || (ctrlF
2af30 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
2af40 4e 4f 4c 4f 43 4b 29 21 3d 30 20 29 3b 0a 0a 20  NOLOCK)!=0 );.. 
2af50 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20   OSTRACE(("OPEN 
2af60 20 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68     %-3d %s\n", h
2af70 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20  , zFilename));. 
2af80 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20   pNew->h = h;.  
2af90 70 4e 65 77 2d 3e 70 56 66 73 20 3d 20 70 56 66  pNew->pVfs = pVf
2afa0 73 3b 0a 20 20 70 4e 65 77 2d 3e 7a 50 61 74 68  s;.  pNew->zPath
2afb0 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20   = zFilename;.  
2afc0 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20  pNew->ctrlFlags 
2afd0 3d 20 28 75 38 29 63 74 72 6c 46 6c 61 67 73 3b  = (u8)ctrlFlags;
2afe0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
2aff0 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 70 4e  MMAP_SIZE>0.  pN
2b000 65 77 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20  ew->mmapSizeMax 
2b010 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
2b020 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 23 65  onfig.szMmap;.#e
2b030 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74  ndif.  if( sqlit
2b040 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 28  e3_uri_boolean((
2b050 28 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  (ctrlFlags & UNI
2b060 58 46 49 4c 45 5f 55 52 49 29 20 3f 20 7a 46 69  XFILE_URI) ? zFi
2b070 6c 65 6e 61 6d 65 20 3a 20 30 29 2c 0a 20 20 20  lename : 0),.   
2b080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b090 20 20 20 20 20 20 20 20 22 70 73 6f 77 22 2c 20          "psow", 
2b0a0 53 51 4c 49 54 45 5f 50 4f 57 45 52 53 41 46 45  SQLITE_POWERSAFE
2b0b0 5f 4f 56 45 52 57 52 49 54 45 29 20 29 7b 0a 20  _OVERWRITE) ){. 
2b0c0 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61     pNew->ctrlFla
2b0d0 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 50  gs |= UNIXFILE_P
2b0e0 53 4f 57 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  SOW;.  }.  if( s
2b0f0 74 72 63 6d 70 28 70 56 66 73 2d 3e 7a 4e 61 6d  trcmp(pVfs->zNam
2b100 65 2c 22 75 6e 69 78 2d 65 78 63 6c 22 29 3d 3d  e,"unix-excl")==
2b110 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63  0 ){.    pNew->c
2b120 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
2b130 46 49 4c 45 5f 45 58 43 4c 3b 0a 20 20 7d 0a 0a  FILE_EXCL;.  }..
2b140 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
2b150 20 70 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78 77   pNew->pId = vxw
2b160 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 7a  orksFindFileId(z
2b170 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
2b180 20 70 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29 7b   pNew->pId==0 ){
2b190 0a 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c  .    ctrlFlags |
2b1a0 3d 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43  = UNIXFILE_NOLOC
2b1b0 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  K;.    rc = SQLI
2b1c0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65  TE_NOMEM;.  }.#e
2b1d0 6e 64 69 66 0a 0a 20 20 69 66 28 20 63 74 72 6c  ndif..  if( ctrl
2b1e0 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
2b1f0 5f 4e 4f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  _NOLOCK ){.    p
2b200 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 26  LockingStyle = &
2b210 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b  nolockIoMethods;
2b220 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c  .  }else{.    pL
2b230 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 28 2a  ockingStyle = (*
2b240 2a 28 66 69 6e 64 65 72 5f 74 79 70 65 2a 29 70  *(finder_type*)p
2b250 56 66 73 2d 3e 70 41 70 70 44 61 74 61 29 28 7a  Vfs->pAppData)(z
2b260 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 29 3b  Filename, pNew);
2b270 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
2b280 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2b290 0a 20 20 20 20 2f 2a 20 43 61 63 68 65 20 7a 46  .    /* Cache zF
2b2a0 69 6c 65 6e 61 6d 65 20 69 6e 20 74 68 65 20 6c  ilename in the l
2b2b0 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 28  ocking context (
2b2c0 41 46 50 20 61 6e 64 20 64 6f 74 6c 6f 63 6b 20  AFP and dotlock 
2b2d0 6f 76 65 72 72 69 64 65 29 20 66 6f 72 0a 20 20  override) for.  
2b2e0 20 20 2a 2a 20 70 72 6f 78 79 4c 6f 63 6b 20 61    ** proxyLock a
2b2f0 63 74 69 76 61 74 69 6f 6e 20 69 73 20 70 6f 73  ctivation is pos
2b300 73 69 62 6c 65 20 28 72 65 6d 6f 74 65 20 70 72  sible (remote pr
2b310 6f 78 79 20 69 73 20 62 61 73 65 64 20 6f 6e 20  oxy is based on 
2b320 64 62 20 6e 61 6d 65 29 0a 20 20 20 20 2a 2a 20  db name).    ** 
2b330 7a 46 69 6c 65 6e 61 6d 65 20 72 65 6d 61 69 6e  zFilename remain
2b340 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 66 69  s valid until fi
2b350 6c 65 20 69 73 20 63 6c 6f 73 65 64 2c 20 74 6f  le is closed, to
2b360 20 73 75 70 70 6f 72 74 20 2a 2f 0a 20 20 20 20   support */.    
2b370 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  pNew->lockingCon
2b380 74 65 78 74 20 3d 20 28 76 6f 69 64 2a 29 7a 46  text = (void*)zF
2b390 69 6c 65 6e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a  ilename;.#endif.
2b3a0 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c 6f 63 6b    }..  if( pLock
2b3b0 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 70 6f 73  ingStyle == &pos
2b3c0 69 78 49 6f 4d 65 74 68 6f 64 73 0a 23 69 66 20  ixIoMethods.#if 
2b3d0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
2b3e0 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
2b3f0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2b400 45 0a 20 20 20 20 7c 7c 20 70 4c 6f 63 6b 69 6e  E.    || pLockin
2b410 67 53 74 79 6c 65 20 3d 3d 20 26 6e 66 73 49 6f  gStyle == &nfsIo
2b420 4d 65 74 68 6f 64 73 0a 23 65 6e 64 69 66 0a 20  Methods.#endif. 
2b430 20 29 7b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65   ){.    unixEnte
2b440 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63  rMutex();.    rc
2b450 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f   = findInodeInfo
2b460 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49  (pNew, &pNew->pI
2b470 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72  node);.    if( r
2b480 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2b490 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 65        /* If an e
2b4a0 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 69 6e  rror occurred in
2b4b0 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29   findInodeInfo()
2b4c0 2c 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  , close the file
2b4d0 20 64 65 73 63 72 69 70 74 6f 72 0a 20 20 20 20   descriptor.    
2b4e0 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79    ** immediately
2b4f0 2c 20 62 65 66 6f 72 65 20 72 65 6c 65 61 73 69  , before releasi
2b500 6e 67 20 74 68 65 20 6d 75 74 65 78 2e 20 66 69  ng the mutex. fi
2b510 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 6d 61  ndInodeInfo() ma
2b520 79 20 66 61 69 6c 0a 20 20 20 20 20 20 2a 2a 20  y fail.      ** 
2b530 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  in two scenarios
2b540 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
2b550 20 2a 2a 20 20 20 28 61 29 20 41 20 63 61 6c 6c   **   (a) A call
2b560 20 74 6f 20 66 73 74 61 74 28 29 20 66 61 69 6c   to fstat() fail
2b570 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20 28  ed..      **   (
2b580 62 29 20 41 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  b) A malloc fail
2b590 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ed..      **.   
2b5a0 20 20 20 2a 2a 20 53 63 65 6e 61 72 69 6f 20 28     ** Scenario (
2b5b0 62 29 20 6d 61 79 20 6f 6e 6c 79 20 6f 63 63 75  b) may only occu
2b5c0 72 20 69 66 20 74 68 65 20 70 72 6f 63 65 73 73  r if the process
2b5d0 20 69 73 20 68 6f 6c 64 69 6e 67 20 6e 6f 20 6f   is holding no o
2b5e0 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 66 69  ther.      ** fi
2b5f0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f  le descriptors o
2b600 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  pen on the same 
2b610 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 77  file. If there w
2b620 65 72 65 20 6f 74 68 65 72 20 66 69 6c 65 0a 20  ere other file. 
2b630 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74       ** descript
2b640 6f 72 73 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  ors on this file
2b650 2c 20 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f 63  , then no malloc
2b660 20 77 6f 75 6c 64 20 62 65 20 72 65 71 75 69 72   would be requir
2b670 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 66  ed by.      ** f
2b680 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 20  indInodeInfo(). 
2b690 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
2b6a0 61 73 65 2c 20 69 74 20 69 73 20 71 75 69 74 65  ase, it is quite
2b6b0 20 73 61 66 65 20 74 6f 20 63 6c 6f 73 65 0a 20   safe to close. 
2b6c0 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20 68       ** handle h
2b6d0 20 2d 20 61 73 20 69 74 20 69 73 20 67 75 61 72   - as it is guar
2b6e0 61 6e 74 65 65 64 20 74 68 61 74 20 6e 6f 20 70  anteed that no p
2b6f0 6f 73 69 78 20 6c 6f 63 6b 73 20 77 69 6c 6c 20  osix locks will 
2b700 62 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20  be released.    
2b710 20 20 2a 2a 20 62 79 20 64 6f 69 6e 67 20 73 6f    ** by doing so
2b720 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
2b730 20 2a 2a 20 49 66 20 73 63 65 6e 61 72 69 6f 20   ** If scenario 
2b740 28 61 29 20 63 61 75 73 65 64 20 74 68 65 20 65  (a) caused the e
2b750 72 72 6f 72 20 74 68 65 6e 20 74 68 69 6e 67 73  rror then things
2b760 20 61 72 65 20 6e 6f 74 20 73 6f 20 73 61 66 65   are not so safe
2b770 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 69  . The.      ** i
2b780 6d 70 6c 69 63 69 74 20 61 73 73 75 6d 70 74 69  mplicit assumpti
2b790 6f 6e 20 68 65 72 65 20 69 73 20 74 68 61 74 20  on here is that 
2b7a0 69 66 20 66 73 74 61 74 28 29 20 66 61 69 6c 73  if fstat() fails
2b7b0 2c 20 74 68 69 6e 67 73 20 61 72 65 20 69 6e 0a  , things are in.
2b7c0 20 20 20 20 20 20 2a 2a 20 73 75 63 68 20 62 61        ** such ba
2b7d0 64 20 73 68 61 70 65 20 74 68 61 74 20 64 72 6f  d shape that dro
2b7e0 70 70 69 6e 67 20 61 20 6c 6f 63 6b 20 6f 72 20  pping a lock or 
2b7f0 74 77 6f 20 64 6f 65 73 6e 27 74 20 6d 61 74 74  two doesn't matt
2b800 65 72 20 6d 75 63 68 2e 0a 20 20 20 20 20 20 2a  er much..      *
2b810 2f 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63  /.      robust_c
2b820 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f  lose(pNew, h, __
2b830 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 68  LINE__);.      h
2b840 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20   = -1;.    }.   
2b850 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
2b860 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49  );.  }..#if SQLI
2b870 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2b880 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
2b890 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
2b8a0 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e  else if( pLockin
2b8b0 67 53 74 79 6c 65 20 3d 3d 20 26 61 66 70 49 6f  gStyle == &afpIo
2b8c0 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
2b8d0 2a 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20 75 73  * AFP locking us
2b8e0 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68  es the file path
2b8f0 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20   so it needs to 
2b900 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20  be included in. 
2b910 20 20 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f 63     ** the afpLoc
2b920 6b 69 6e 67 43 6f 6e 74 65 78 74 2e 0a 20 20 20  kingContext..   
2b930 20 2a 2f 0a 20 20 20 20 61 66 70 4c 6f 63 6b 69   */.    afpLocki
2b940 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b  ngContext *pCtx;
2b950 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69  .    pNew->locki
2b960 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78  ngContext = pCtx
2b970 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
2b980 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 43 74  c64( sizeof(*pCt
2b990 78 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43  x) );.    if( pC
2b9a0 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  tx==0 ){.      r
2b9b0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2b9c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2b9d0 20 20 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65 6e     /* NB: zFilen
2b9e0 61 6d 65 20 65 78 69 73 74 73 20 61 6e 64 20 72  ame exists and r
2b9f0 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74  emains valid unt
2ba00 69 6c 20 74 68 65 20 66 69 6c 65 20 69 73 20 63  il the file is c
2ba10 6c 6f 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 61  losed.      ** a
2ba20 63 63 6f 72 64 69 6e 67 20 74 6f 20 72 65 71 75  ccording to requ
2ba30 69 72 65 6d 65 6e 74 20 46 31 31 31 34 31 2e 20  irement F11141. 
2ba40 20 53 6f 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65   So we do not ne
2ba50 65 64 20 74 6f 20 6d 61 6b 65 20 61 0a 20 20 20  ed to make a.   
2ba60 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68     ** copy of th
2ba70 65 20 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 20  e filename. */. 
2ba80 20 20 20 20 20 70 43 74 78 2d 3e 64 62 50 61 74       pCtx->dbPat
2ba90 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20  h = zFilename;. 
2baa0 20 20 20 20 20 70 43 74 78 2d 3e 72 65 73 65 72       pCtx->reser
2bab0 76 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  ved = 0;.      s
2bac0 72 61 6e 64 6f 6d 64 65 76 28 29 3b 0a 20 20 20  randomdev();.   
2bad0 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
2bae0 78 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  x();.      rc = 
2baf0 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e  findInodeInfo(pN
2bb00 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64  ew, &pNew->pInod
2bb10 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
2bb20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2bb30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
2bb40 72 65 65 28 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e  ree(pNew->lockin
2bb50 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  gContext);.     
2bb60 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
2bb70 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f  pNew, h, __LINE_
2bb80 5f 29 3b 0a 20 20 20 20 20 20 20 20 68 20 3d 20  _);.        h = 
2bb90 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
2bba0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
2bbb0 28 29 3b 20 20 20 20 20 20 20 20 0a 20 20 20 20  ();        .    
2bbc0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
2bbd0 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e  else if( pLockin
2bbe0 67 53 74 79 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f  gStyle == &dotlo
2bbf0 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20  ckIoMethods ){. 
2bc00 20 20 20 2f 2a 20 44 6f 74 66 69 6c 65 20 6c 6f     /* Dotfile lo
2bc10 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66  cking uses the f
2bc20 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e  ile path so it n
2bc30 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75  eeds to be inclu
2bc40 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  ded in.    ** th
2bc50 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67  e dotlockLocking
2bc60 43 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a 2f 0a  Context .    */.
2bc70 20 20 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46      char *zLockF
2bc80 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69  ile;.    int nFi
2bc90 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 61 73 73 65  lename;.    asse
2bca0 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30  rt( zFilename!=0
2bcb0 20 29 3b 0a 20 20 20 20 6e 46 69 6c 65 6e 61 6d   );.    nFilenam
2bcc0 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  e = (int)strlen(
2bcd0 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36 3b 0a  zFilename) + 6;.
2bce0 20 20 20 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20      zLockFile = 
2bcf0 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
2bd00 6d 61 6c 6c 6f 63 36 34 28 6e 46 69 6c 65 6e 61  malloc64(nFilena
2bd10 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c 6f  me);.    if( zLo
2bd20 63 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  ckFile==0 ){.   
2bd30 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
2bd40 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
2bd50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
2bd60 6e 70 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d  nprintf(nFilenam
2bd70 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22 25  e, zLockFile, "%
2bd80 73 22 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49  s" DOTLOCK_SUFFI
2bd90 58 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  X, zFilename);. 
2bda0 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6c     }.    pNew->l
2bdb0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20  ockingContext = 
2bdc0 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a  zLockFile;.  }..
2bdd0 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
2bde0 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69   else if( pLocki
2bdf0 6e 67 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d 49  ngStyle == &semI
2be00 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  oMethods ){.    
2be10 2f 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f  /* Named semapho
2be20 72 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20  re locking uses 
2be30 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f  the file path so
2be40 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 0a   it needs to be.
2be50 20 20 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64 20      ** included 
2be60 69 6e 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69 6e  in the semLockin
2be70 67 43 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f 0a  gContext.    */.
2be80 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
2be90 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66  ex();.    rc = f
2bea0 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65  indInodeInfo(pNe
2beb0 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  w, &pNew->pInode
2bec0 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d  );.    if( (rc==
2bed0 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28 70  SQLITE_OK) && (p
2bee0 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  New->pInode->pSe
2bef0 6d 3d 3d 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20  m==NULL) ){.    
2bf00 20 20 63 68 61 72 20 2a 7a 53 65 6d 4e 61 6d 65    char *zSemName
2bf10 20 3d 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d   = pNew->pInode-
2bf20 3e 61 53 65 6d 4e 61 6d 65 3b 0a 20 20 20 20 20  >aSemName;.     
2bf30 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 73 71   int n;.      sq
2bf40 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
2bf50 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 53 65  AX_PATHNAME, zSe
2bf60 6d 4e 61 6d 65 2c 20 22 2f 25 73 2e 73 65 6d 22  mName, "/%s.sem"
2bf70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2bf80 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70           pNew->p
2bf90 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  Id->zCanonicalNa
2bfa0 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 20  me);.      for( 
2bfb0 6e 3d 31 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d  n=1; zSemName[n]
2bfc0 3b 20 6e 2b 2b 20 29 0a 20 20 20 20 20 20 20 20  ; n++ ).        
2bfd0 69 66 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d  if( zSemName[n]=
2bfe0 3d 27 2f 27 20 29 20 7a 53 65 6d 4e 61 6d 65 5b  ='/' ) zSemName[
2bff0 6e 5d 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20  n] = '_';.      
2c000 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  pNew->pInode->pS
2c010 65 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a 53  em = sem_open(zS
2c020 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45 41 54 2c  emName, O_CREAT,
2c030 20 30 36 36 36 2c 20 31 29 3b 0a 20 20 20 20 20   0666, 1);.     
2c040 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64   if( pNew->pInod
2c050 65 2d 3e 70 53 65 6d 20 3d 3d 20 53 45 4d 5f 46  e->pSem == SEM_F
2c060 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20  AILED ){.       
2c070 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
2c080 45 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  EM;.        pNew
2c090 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61  ->pInode->aSemNa
2c0a0 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  me[0] = '\0';.  
2c0b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2c0c0 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
2c0d0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a  ;.  }.#endif.  .
2c0e0 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
2c0f0 28 70 4e 65 77 2c 20 30 29 3b 0a 23 69 66 20 4f  (pNew, 0);.#if O
2c100 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20  S_VXWORKS.  if( 
2c110 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2c120 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20  .    if( h>=0 ) 
2c130 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65  robust_close(pNe
2c140 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  w, h, __LINE__);
2c150 0a 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20  .    h = -1;.   
2c160 20 6f 73 55 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e   osUnlink(zFilen
2c170 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ame);.    pNew->
2c180 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
2c190 58 46 49 4c 45 5f 44 45 4c 45 54 45 3b 0a 20 20  XFILE_DELETE;.  
2c1a0 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72  }.#endif.  if( r
2c1b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2c1c0 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20 72      if( h>=0 ) r
2c1d0 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77  obust_close(pNew
2c1e0 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  , h, __LINE__);.
2c1f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65    }else{.    pNe
2c200 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70 4c 6f  w->pMethod = pLo
2c210 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 20 20  ckingStyle;.    
2c220 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b  OpenCounter(+1);
2c230 0a 20 20 20 20 76 65 72 69 66 79 44 62 46 69 6c  .    verifyDbFil
2c240 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 20 20 72  e(pNew);.  }.  r
2c250 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2c260 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61  ** Return the na
2c270 6d 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f 72  me of a director
2c280 79 20 69 6e 20 77 68 69 63 68 20 74 6f 20 70 75  y in which to pu
2c290 74 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  t temporary file
2c2a0 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74  s..** If no suit
2c2b0 61 62 6c 65 20 74 65 6d 70 6f 72 61 72 79 20 66  able temporary f
2c2c0 69 6c 65 20 64 69 72 65 63 74 6f 72 79 20 63 61  ile directory ca
2c2d0 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75  n be found, retu
2c2e0 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  rn NULL..*/.stat
2c2f0 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75  ic const char *u
2c300 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28 76  nixTempFileDir(v
2c310 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63  oid){.  static c
2c320 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69 72  onst char *azDir
2c330 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30 2c 0a  s[] = {.     0,.
2c340 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22 2f 76       0,.     "/v
2c350 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f  ar/tmp",.     "/
2c360 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22  usr/tmp",.     "
2c370 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2e 22 0a  /tmp",.     ".".
2c380 20 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20    };.  unsigned 
2c390 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
2c3a0 73 74 61 74 20 62 75 66 3b 0a 20 20 63 6f 6e 73  stat buf;.  cons
2c3b0 74 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 73  t char *zDir = s
2c3c0 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
2c3d0 63 74 6f 72 79 3b 0a 0a 20 20 69 66 28 20 21 61  ctory;..  if( !a
2c3e0 7a 44 69 72 73 5b 30 5d 20 29 20 61 7a 44 69 72  zDirs[0] ) azDir
2c3f0 73 5b 30 5d 20 3d 20 67 65 74 65 6e 76 28 22 53  s[0] = getenv("S
2c400 51 4c 49 54 45 5f 54 4d 50 44 49 52 22 29 3b 0a  QLITE_TMPDIR");.
2c410 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 31 5d    if( !azDirs[1]
2c420 20 29 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67   ) azDirs[1] = g
2c430 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29 3b  etenv("TMPDIR");
2c440 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
2c450 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a  zeof(azDirs)/siz
2c460 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20  eof(azDirs[0]); 
2c470 7a 44 69 72 3d 61 7a 44 69 72 73 5b 69 2b 2b 5d  zDir=azDirs[i++]
2c480 29 7b 0a 20 20 20 20 69 66 28 20 7a 44 69 72 3d  ){.    if( zDir=
2c490 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
2c4a0 20 20 20 69 66 28 20 6f 73 53 74 61 74 28 7a 44     if( osStat(zD
2c4b0 69 72 2c 20 26 62 75 66 29 20 29 20 63 6f 6e 74  ir, &buf) ) cont
2c4c0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 21 53  inue;.    if( !S
2c4d0 5f 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f  _ISDIR(buf.st_mo
2c4e0 64 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  de) ) continue;.
2c4f0 20 20 20 20 69 66 28 20 6f 73 41 63 63 65 73 73      if( osAccess
2c500 28 7a 44 69 72 2c 20 30 37 29 20 29 20 63 6f 6e  (zDir, 07) ) con
2c510 74 69 6e 75 65 3b 0a 20 20 20 20 62 72 65 61 6b  tinue;.    break
2c520 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
2c530 44 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  Dir;.}../*.** Cr
2c540 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79  eate a temporary
2c550 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42   file name in zB
2c560 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62  uf.  zBuf must b
2c570 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62  e allocated.** b
2c580 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72  y the calling pr
2c590 6f 63 65 73 73 20 61 6e 64 20 6d 75 73 74 20 62  ocess and must b
2c5a0 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  e big enough to 
2c5b0 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a 2a  hold at least.**
2c5c0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
2c5d0 65 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74  e bytes..*/.stat
2c5e0 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 54 65  ic int unixGetTe
2c5f0 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c  mpname(int nBuf,
2c600 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
2c610 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72  const char *zDir
2c620 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d  ;.  int iLimit =
2c630 20 30 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f   0;..  /* It's o
2c640 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61  dd to simulate a
2c650 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c  n io-error here,
2c660 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73   but really this
2c670 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73   is just.  ** us
2c680 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72  ing the io-error
2c690 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20   infrastructure 
2c6a0 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
2c6b0 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73  ite handles this
2c6c0 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66  .  ** function f
2c6d0 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20  ailing. .  */.  
2c6e0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
2c6f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
2c700 4f 45 52 52 20 29 3b 0a 0a 20 20 7a 44 69 72 20  OERR );..  zDir 
2c710 3d 20 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69  = unixTempFileDi
2c720 72 28 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75  r();.  do{.    u
2c730 36 34 20 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  64 r;.    sqlite
2c740 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
2c750 65 6f 66 28 72 29 2c 20 26 72 29 3b 0a 20 20 20  eof(r), &r);.   
2c760 20 61 73 73 65 72 74 28 20 6e 42 75 66 3e 32 20   assert( nBuf>2 
2c770 29 3b 0a 20 20 20 20 7a 42 75 66 5b 6e 42 75 66  );.    zBuf[nBuf
2c780 2d 32 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  -2] = 0;.    sql
2c790 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42  ite3_snprintf(nB
2c7a0 75 66 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22 53  uf, zBuf, "%s/"S
2c7b0 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f  QLITE_TEMP_FILE_
2c7c0 50 52 45 46 49 58 22 25 6c 6c 78 25 63 22 2c 0a  PREFIX"%llx%c",.
2c7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c7e0 20 20 20 20 20 7a 44 69 72 2c 20 72 2c 20 30 29       zDir, r, 0)
2c7f0 3b 0a 20 20 20 20 69 66 28 20 7a 42 75 66 5b 6e  ;.    if( zBuf[n
2c800 42 75 66 2d 32 5d 21 3d 30 20 7c 7c 20 28 69 4c  Buf-2]!=0 || (iL
2c810 69 6d 69 74 2b 2b 29 3e 31 30 20 29 20 72 65 74  imit++)>10 ) ret
2c820 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
2c830 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6f 73 41 63  ;.  }while( osAc
2c840 63 65 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20  cess(zBuf,0)==0 
2c850 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
2c860 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51  TE_OK;.}..#if SQ
2c870 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2c880 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
2c890 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
2c8a0 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 74 6f  /*.** Routine to
2c8b0 20 74 72 61 6e 73 66 6f 72 6d 20 61 20 75 6e 69   transform a uni
2c8c0 78 46 69 6c 65 20 69 6e 74 6f 20 61 20 70 72 6f  xFile into a pro
2c8d0 78 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69 78 46  xy-locking unixF
2c8e0 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ile..** Implemen
2c8f0 74 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 72  tation in the pr
2c900 6f 78 79 2d 6c 6f 63 6b 20 64 69 76 69 73 69 6f  oxy-lock divisio
2c910 6e 2c 20 62 75 74 20 75 73 65 64 20 62 79 20 75  n, but used by u
2c920 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a 20 69 66 20  nixOpen().** if 
2c930 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52  SQLITE_PREFER_PR
2c940 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 69 73 20 64  OXY_LOCKING is d
2c950 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  efined..*/.stati
2c960 63 20 69 6e 74 20 70 72 6f 78 79 54 72 61 6e 73  c int proxyTrans
2c970 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69  formUnixFile(uni
2c980 78 46 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 63 68  xFile*, const ch
2c990 61 72 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ar*);.#endif../*
2c9a0 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61  .** Search for a
2c9b0 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65  n unused file de
2c9c0 73 63 72 69 70 74 6f 72 20 74 68 61 74 20 77 61  scriptor that wa
2c9d0 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20  s opened on the 
2c9e0 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c  database .** fil
2c9f0 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c  e (not a journal
2ca00 20 6f 72 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   or master-journ
2ca10 61 6c 20 66 69 6c 65 29 20 69 64 65 6e 74 69 66  al file) identif
2ca20 69 65 64 20 62 79 20 70 61 74 68 6e 61 6d 65 0a  ied by pathname.
2ca30 2a 2a 20 7a 50 61 74 68 20 77 69 74 68 20 53 51  ** zPath with SQ
2ca40 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c  LITE_OPEN_XXX fl
2ca50 61 67 73 20 6d 61 74 63 68 69 6e 67 20 74 68 6f  ags matching tho
2ca60 73 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  se passed as the
2ca70 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d   second.** argum
2ca80 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
2ca90 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68  tion..**.** Such
2caa0 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
2cab0 6f 72 20 6d 61 79 20 65 78 69 73 74 20 69 66 20  or may exist if 
2cac0 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
2cad0 63 74 69 6f 6e 20 77 61 73 20 63 6c 6f 73 65 64  ction was closed
2cae0 0a 2a 2a 20 62 75 74 20 74 68 65 20 61 73 73 6f  .** but the asso
2caf0 63 69 61 74 65 64 20 66 69 6c 65 20 64 65 73 63  ciated file desc
2cb00 72 69 70 74 6f 72 20 63 6f 75 6c 64 20 6e 6f 74  riptor could not
2cb10 20 62 65 20 63 6c 6f 73 65 64 20 62 65 63 61 75   be closed becau
2cb20 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72  se some.** other
2cb30 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2cb40 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d   open on the sam
2cb50 65 20 66 69 6c 65 20 69 73 20 68 6f 6c 64 69 6e  e file is holdin
2cb60 67 20 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a  g a file-lock..*
2cb70 2a 20 52 65 66 65 72 20 74 6f 20 63 6f 6d 6d 65  * Refer to comme
2cb80 6e 74 73 20 69 6e 20 74 68 65 20 75 6e 69 78 43  nts in the unixC
2cb90 6c 6f 73 65 28 29 20 66 75 6e 63 74 69 6f 6e 20  lose() function 
2cba0 61 6e 64 20 74 68 65 20 6c 65 6e 67 74 68 79 20  and the lengthy 
2cbb0 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73 63 72  comment.** descr
2cbc0 69 62 69 6e 67 20 22 50 6f 73 69 78 20 41 64 76  ibing "Posix Adv
2cbd0 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 22 20 61  isory Locking" a
2cbe0 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
2cbf0 68 69 73 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a  his file for .**
2cc00 20 66 75 72 74 68 65 72 20 64 65 74 61 69 6c 73   further details
2cc10 2e 20 41 6c 73 6f 2c 20 74 69 63 6b 65 74 20 23  . Also, ticket #
2cc20 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  4018..**.** If a
2cc30 20 73 75 69 74 61 62 6c 65 20 66 69 6c 65 20 64   suitable file d
2cc40 65 73 63 72 69 70 74 6f 72 20 69 73 20 66 6f 75  escriptor is fou
2cc50 6e 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 72  nd, then it is r
2cc60 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a  eturned. If no.*
2cc70 2a 20 73 75 63 68 20 66 69 6c 65 20 64 65 73 63  * such file desc
2cc80 72 69 70 74 6f 72 20 69 73 20 6c 6f 63 61 74 65  riptor is locate
2cc90 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65  d, -1 is returne
2cca0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 55 6e 69  d..*/.static Uni
2ccb0 78 55 6e 75 73 65 64 46 64 20 2a 66 69 6e 64 52  xUnusedFd *findR
2ccc0 65 75 73 61 62 6c 65 46 64 28 63 6f 6e 73 74 20  eusableFd(const 
2ccd0 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74  char *zPath, int
2cce0 20 66 6c 61 67 73 29 7b 0a 20 20 55 6e 69 78 55   flags){.  UnixU
2ccf0 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
2cd00 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e   = 0;..  /* Do n
2cd10 6f 74 20 73 65 61 72 63 68 20 66 6f 72 20 61 6e  ot search for an
2cd20 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73   unused file des
2cd30 63 72 69 70 74 6f 72 20 6f 6e 20 76 78 77 6f 72  criptor on vxwor
2cd40 6b 73 2e 20 4e 6f 74 20 62 65 63 61 75 73 65 0a  ks. Not because.
2cd50 20 20 2a 2a 20 76 78 77 6f 72 6b 73 20 77 6f 75    ** vxworks wou
2cd60 6c 64 20 6e 6f 74 20 62 65 6e 65 66 69 74 20 66  ld not benefit f
2cd70 72 6f 6d 20 74 68 65 20 63 68 61 6e 67 65 20 28  rom the change (
2cd80 69 74 20 6d 69 67 68 74 2c 20 77 65 27 72 65 20  it might, we're 
2cd90 6e 6f 74 20 73 75 72 65 29 2c 0a 20 20 2a 2a 20  not sure),.  ** 
2cda0 62 75 74 20 62 65 63 61 75 73 65 20 6e 6f 20 77  but because no w
2cdb0 61 79 20 74 6f 20 74 65 73 74 20 69 74 20 69 73  ay to test it is
2cdc0 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c   currently avail
2cdd0 61 62 6c 65 2e 20 49 74 20 69 73 20 62 65 74 74  able. It is bett
2cde0 65 72 20 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20  er .  ** not to 
2cdf0 72 69 73 6b 20 62 72 65 61 6b 69 6e 67 20 76 78  risk breaking vx
2ce00 77 6f 72 6b 73 20 73 75 70 70 6f 72 74 20 66 6f  works support fo
2ce10 72 20 74 68 65 20 73 61 6b 65 20 6f 66 20 73 75  r the sake of su
2ce20 63 68 20 61 6e 20 6f 62 73 63 75 72 65 20 0a 20  ch an obscure . 
2ce30 20 2a 2a 20 66 65 61 74 75 72 65 2e 20 20 2a 2f   ** feature.  */
2ce40 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53  .#if !OS_VXWORKS
2ce50 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73  .  struct stat s
2ce60 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stat;           
2ce70 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
2ce80 74 73 20 6f 66 20 73 74 61 74 28 29 20 63 61 6c  ts of stat() cal
2ce90 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 20 73 74 61  l */..  /* A sta
2cea0 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 66 61 69  t() call may fai
2ceb0 6c 20 66 6f 72 20 76 61 72 69 6f 75 73 20 72 65  l for various re
2cec0 61 73 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 68  asons. If this h
2ced0 61 70 70 65 6e 73 2c 20 69 74 20 69 73 0a 20 20  appens, it is.  
2cee0 2a 2a 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69  ** almost certai
2cef0 6e 20 74 68 61 74 20 61 6e 20 6f 70 65 6e 28 29  n that an open()
2cf00 20 63 61 6c 6c 20 6f 6e 20 74 68 65 20 73 61 6d   call on the sam
2cf10 65 20 70 61 74 68 20 77 69 6c 6c 20 61 6c 73 6f  e path will also
2cf20 20 66 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72 20   fail..  ** For 
2cf30 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 69 66 20  this reason, if 
2cf40 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
2cf50 69 6e 20 74 68 65 20 73 74 61 74 28 29 20 63 61  in the stat() ca
2cf60 6c 6c 20 68 65 72 65 2c 20 69 74 20 69 73 0a 20  ll here, it is. 
2cf70 20 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64 20   ** ignored and 
2cf80 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  -1 is returned. 
2cf90 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
2cfa0 74 72 79 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65  try to open a ne
2cfb0 77 20 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73 63  w file.  ** desc
2cfc0 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 73 61  riptor on the sa
2cfd0 6d 65 20 70 61 74 68 2c 20 66 61 69 6c 2c 20 61  me path, fail, a
2cfe0 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  nd return an err
2cff0 6f 72 20 74 6f 20 53 51 4c 69 74 65 2e 0a 20 20  or to SQLite..  
2d000 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e 20 69 66 20  **.  ** Even if 
2d010 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 70 65  a subsequent ope
2d020 6e 28 29 20 63 61 6c 6c 20 64 6f 65 73 20 73 75  n() call does su
2d030 63 63 65 65 64 2c 20 74 68 65 20 63 6f 6e 73 65  cceed, the conse
2d040 71 75 65 6e 63 65 73 20 6f 66 0a 20 20 2a 2a 20  quences of.  ** 
2d050 6e 6f 74 20 73 65 61 72 63 68 69 6e 67 20 66 6f  not searching fo
2d060 72 20 61 20 72 65 75 73 61 62 6c 65 20 66 69 6c  r a reusable fil
2d070 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 72 65  e descriptor are
2d080 20 6e 6f 74 20 64 69 72 65 2e 20 20 2a 2f 0a 20   not dire.  */. 
2d090 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a   if( 0==osStat(z
2d0a0 50 61 74 68 2c 20 26 73 53 74 61 74 29 20 29 7b  Path, &sStat) ){
2d0b0 0a 20 20 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  .    unixInodeIn
2d0c0 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 0a 20 20 20  fo *pInode;..   
2d0d0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
2d0e0 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20  );.    pInode = 
2d0f0 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 77  inodeList;.    w
2d100 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20  hile( pInode && 
2d110 28 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e  (pInode->fileId.
2d120 64 65 76 21 3d 73 53 74 61 74 2e 73 74 5f 64 65  dev!=sStat.st_de
2d130 76 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v.              
2d140 20 20 20 20 20 20 20 7c 7c 20 70 49 6e 6f 64 65         || pInode
2d150 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 21 3d 73 53  ->fileId.ino!=sS
2d160 74 61 74 2e 73 74 5f 69 6e 6f 29 20 29 7b 0a 20  tat.st_ino) ){. 
2d170 20 20 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70        pInode = p
2d180 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20  Inode->pNext;.  
2d190 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 6e 6f    }.    if( pIno
2d1a0 64 65 20 29 7b 0a 20 20 20 20 20 20 55 6e 69 78  de ){.      Unix
2d1b0 55 6e 75 73 65 64 46 64 20 2a 2a 70 70 3b 0a 20  UnusedFd **pp;. 
2d1c0 20 20 20 20 20 66 6f 72 28 70 70 3d 26 70 49 6e       for(pp=&pIn
2d1d0 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 2a 70  ode->pUnused; *p
2d1e0 70 20 26 26 20 28 2a 70 70 29 2d 3e 66 6c 61 67  p && (*pp)->flag
2d1f0 73 21 3d 66 6c 61 67 73 3b 20 70 70 3d 26 28 28  s!=flags; pp=&((
2d200 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b 0a 20  *pp)->pNext));. 
2d210 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 2a       pUnused = *
2d220 70 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 55  pp;.      if( pU
2d230 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20  nused ){.       
2d240 20 2a 70 70 20 3d 20 70 55 6e 75 73 65 64 2d 3e   *pp = pUnused->
2d250 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
2d260 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61     }.    unixLea
2d270 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23  veMutex();.  }.#
2d280 65 6e 64 69 66 20 20 20 20 2f 2a 20 69 66 20 21  endif    /* if !
2d290 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 20 20  OS_VXWORKS */.  
2d2a0 72 65 74 75 72 6e 20 70 55 6e 75 73 65 64 3b 0a  return pUnused;.
2d2b0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
2d2c0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2d2d0 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 20 74   by unixOpen() t
2d2e0 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
2d2f0 75 6e 69 78 20 70 65 72 6d 69 73 73 69 6f 6e 73  unix permissions
2d300 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65 20 6e 65  .** to create ne
2d310 77 20 66 69 6c 65 73 20 77 69 74 68 2e 20 49 66  w files with. If
2d320 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
2d330 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b  , then SQLITE_OK
2d340 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
2d350 61 6e 64 20 61 20 76 61 6c 75 65 20 73 75 69 74  and a value suit
2d360 61 62 6c 65 20 66 6f 72 20 70 61 73 73 69 6e 67  able for passing
2d370 20 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72   as the third ar
2d380 67 75 6d 65 6e 74 20 74 6f 20 6f 70 65 6e 28 32  gument to open(2
2d390 29 20 69 73 0a 2a 2a 20 77 72 69 74 74 65 6e 20  ) is.** written 
2d3a0 74 6f 20 2a 70 4d 6f 64 65 2e 20 49 66 20 61 6e  to *pMode. If an
2d3b0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
2d3c0 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
2d3d0 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65  r code is .** re
2d3e0 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76  turned and the v
2d3f0 61 6c 75 65 20 6f 66 20 2a 70 4d 6f 64 65 20 69  alue of *pMode i
2d400 73 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64 2e 0a  s not modified..
2d410 2a 2a 0a 2a 2a 20 49 6e 20 6d 6f 73 74 20 63 61  **.** In most ca
2d420 73 65 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ses, this routin
2d430 65 20 73 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f  e sets *pMode to
2d440 20 30 2c 20 77 68 69 63 68 20 77 69 6c 6c 20 62   0, which will b
2d450 65 63 6f 6d 65 0a 2a 2a 20 61 6e 20 69 6e 64 69  ecome.** an indi
2d460 63 61 74 69 6f 6e 20 74 6f 20 72 6f 62 75 73 74  cation to robust
2d470 5f 6f 70 65 6e 28 29 20 74 6f 20 63 72 65 61 74  _open() to creat
2d480 65 20 74 68 65 20 66 69 6c 65 20 75 73 69 6e 67  e the file using
2d490 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55  .** SQLITE_DEFAU
2d4a0 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
2d4b0 4f 4e 53 20 61 64 6a 75 73 74 65 64 20 62 79 20  ONS adjusted by 
2d4c0 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a 20 42 75  the umask..** Bu
2d4d0 74 20 69 66 20 74 68 65 20 66 69 6c 65 20 62 65  t if the file be
2d4e0 69 6e 67 20 6f 70 65 6e 65 64 20 69 73 20 61 20  ing opened is a 
2d4f0 57 41 4c 20 6f 72 20 72 65 67 75 6c 61 72 20 6a  WAL or regular j
2d500 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
2d510 6e 20 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  n .** this funct
2d520 69 6f 6e 20 71 75 65 72 69 65 73 20 74 68 65 20  ion queries the 
2d530 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20  file-system for 
2d540 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  the permissions 
2d550 6f 6e 20 74 68 65 20 0a 2a 2a 20 63 6f 72 72 65  on the .** corre
2d560 73 70 6f 6e 64 69 6e 67 20 64 61 74 61 62 61 73  sponding databas
2d570 65 20 66 69 6c 65 20 61 6e 64 20 73 65 74 73 20  e file and sets 
2d580 2a 70 4d 6f 64 65 20 74 6f 20 74 68 69 73 20 76  *pMode to this v
2d590 61 6c 75 65 2e 20 57 68 65 6e 65 76 65 72 20 0a  alue. Whenever .
2d5a0 2a 2a 20 70 6f 73 73 69 62 6c 65 2c 20 57 41 4c  ** possible, WAL
2d5b0 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   and journal fil
2d5c0 65 73 20 61 72 65 20 63 72 65 61 74 65 64 20 75  es are created u
2d5d0 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 70 65  sing the same pe
2d5e0 72 6d 69 73 73 69 6f 6e 73 20 0a 2a 2a 20 61 73  rmissions .** as
2d5f0 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
2d600 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2d610 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 51 4c 49  *.** If the SQLI
2d620 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41  TE_ENABLE_8_3_NA
2d630 4d 45 53 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e  MES option is en
2d640 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 0a  abled, then the.
2d650 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65  ** original file
2d660 6e 61 6d 65 20 69 73 20 75 6e 61 76 61 69 6c 61  name is unavaila
2d670 62 6c 65 2e 20 20 42 75 74 20 38 5f 33 5f 4e 41  ble.  But 8_3_NA
2d680 4d 45 53 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  MES is only used
2d690 20 66 6f 72 0a 2a 2a 20 46 41 54 20 66 69 6c 65   for.** FAT file
2d6a0 73 79 73 74 65 6d 73 20 61 6e 64 20 70 65 72 6d  systems and perm
2d6b0 69 73 73 69 6f 6e 73 20 64 6f 20 6e 6f 74 20 6d  issions do not m
2d6c0 61 74 74 65 72 20 74 68 65 72 65 2c 20 73 6f 20  atter there, so 
2d6d0 6a 75 73 74 20 75 73 65 0a 2a 2a 20 74 68 65 20  just use.** the 
2d6e0 64 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69  default permissi
2d6f0 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ons..*/.static i
2d700 6e 74 20 66 69 6e 64 43 72 65 61 74 65 46 69 6c  nt findCreateFil
2d710 65 4d 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20 63  eMode(.  const c
2d720 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
2d730 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68           /* Path
2d740 20 6f 66 20 66 69 6c 65 20 28 70 6f 73 73 69 62   of file (possib
2d750 6c 79 29 20 62 65 69 6e 67 20 63 72 65 61 74 65  ly) being create
2d760 64 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  d */.  int flags
2d770 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2d780 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
2d790 70 61 73 73 65 64 20 61 73 20 34 74 68 20 61 72  passed as 4th ar
2d7a0 67 75 6d 65 6e 74 20 74 6f 20 78 4f 70 65 6e 28  gument to xOpen(
2d7b0 29 20 2a 2f 0a 20 20 6d 6f 64 65 5f 74 20 2a 70  ) */.  mode_t *p
2d7c0 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20  Mode,           
2d7d0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50         /* OUT: P
2d7e0 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 6f 70  ermissions to op
2d7f0 65 6e 20 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a  en file with */.
2d800 20 20 75 69 64 5f 74 20 2a 70 55 69 64 2c 20 20    uid_t *pUid,  
2d810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d820 20 20 2f 2a 20 4f 55 54 3a 20 75 69 64 20 74 6f    /* OUT: uid to
2d830 20 73 65 74 20 6f 6e 20 74 68 65 20 66 69 6c 65   set on the file
2d840 20 2a 2f 0a 20 20 67 69 64 5f 74 20 2a 70 47 69   */.  gid_t *pGi
2d850 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
2d860 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 67 69        /* OUT: gi
2d870 64 20 74 6f 20 73 65 74 20 6f 6e 20 74 68 65 20  d to set on the 
2d880 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  file */.){.  int
2d890 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2d8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d8b0 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
2d8c0 20 2a 70 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 2a   *pMode = 0;.  *
2d8d0 70 55 69 64 20 3d 20 30 3b 0a 20 20 2a 70 47 69  pUid = 0;.  *pGi
2d8e0 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 66 6c 61  d = 0;.  if( fla
2d8f0 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs & (SQLITE_OPE
2d900 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45  N_WAL|SQLITE_OPE
2d910 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20  N_MAIN_JOURNAL) 
2d920 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 44 62 5b  ){.    char zDb[
2d930 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b  MAX_PATHNAME+1];
2d940 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
2d950 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20   file path */.  
2d960 20 20 69 6e 74 20 6e 44 62 3b 20 20 20 20 20 20    int nDb;      
2d970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d980 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c  /* Number of val
2d990 69 64 20 62 79 74 65 73 20 69 6e 20 7a 44 62 20  id bytes in zDb 
2d9a0 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  */.    struct st
2d9b0 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20  at sStat;       
2d9c0 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 6f       /* Output o
2d9d0 66 20 73 74 61 74 28 29 20 6f 6e 20 64 61 74 61  f stat() on data
2d9e0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
2d9f0 20 20 2f 2a 20 7a 50 61 74 68 20 69 73 20 61 20    /* zPath is a 
2da00 70 61 74 68 20 74 6f 20 61 20 57 41 4c 20 6f 72  path to a WAL or
2da10 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
2da20 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
2da30 63 6b 20 64 65 72 69 76 65 73 0a 20 20 20 20 2a  ck derives.    *
2da40 2a 20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68  * the path to th
2da50 65 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74  e associated dat
2da60 61 62 61 73 65 20 66 69 6c 65 20 66 72 6f 6d 20  abase file from 
2da70 7a 50 61 74 68 2e 20 54 68 69 73 20 62 6c 6f 63  zPath. This bloc
2da80 6b 20 68 61 6e 64 6c 65 73 0a 20 20 20 20 2a 2a  k handles.    **
2da90 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e   the following n
2daa0 61 6d 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e  aming convention
2dab0 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
2dac0 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e     "<path to db>
2dad0 2d 6a 6f 75 72 6e 61 6c 22 0a 20 20 20 20 2a 2a  -journal".    **
2dae0 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e     "<path to db>
2daf0 2d 77 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22  -wal".    **   "
2db00 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75  <path to db>-jou
2db10 72 6e 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 20 20  rnalNN".    **  
2db20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 77   "<path to db>-w
2db30 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 0a 20 20 20  alNN".    **.   
2db40 20 2a 2a 20 77 68 65 72 65 20 4e 4e 20 69 73 20   ** where NN is 
2db50 61 20 64 65 63 69 6d 61 6c 20 6e 75 6d 62 65 72  a decimal number
2db60 2e 20 54 68 65 20 4e 4e 20 6e 61 6d 69 6e 67 20  . The NN naming 
2db70 73 63 68 65 6d 65 73 20 61 72 65 20 0a 20 20 20  schemes are .   
2db80 20 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65 20   ** used by the 
2db90 74 65 73 74 5f 6d 75 6c 74 69 70 6c 65 78 2e 63  test_multiplex.c
2dba0 20 6d 6f 64 75 6c 65 2e 0a 20 20 20 20 2a 2f 0a   module..    */.
2dbb0 20 20 20 20 6e 44 62 20 3d 20 73 71 6c 69 74 65      nDb = sqlite
2dbc0 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 29  3Strlen30(zPath)
2dbd0 20 2d 20 31 3b 20 0a 23 69 66 64 65 66 20 53 51   - 1; .#ifdef SQ
2dbe0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f  LITE_ENABLE_8_3_
2dbf0 4e 41 4d 45 53 0a 20 20 20 20 77 68 69 6c 65 28  NAMES.    while(
2dc00 20 6e 44 62 3e 30 20 26 26 20 73 71 6c 69 74 65   nDb>0 && sqlite
2dc10 33 49 73 61 6c 6e 75 6d 28 7a 50 61 74 68 5b 6e  3Isalnum(zPath[n
2dc20 44 62 5d 29 20 29 20 6e 44 62 2d 2d 3b 0a 20 20  Db]) ) nDb--;.  
2dc30 20 20 69 66 28 20 6e 44 62 3d 3d 30 20 7c 7c 20    if( nDb==0 || 
2dc40 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 2d 27 20  zPath[nDb]!='-' 
2dc50 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2dc60 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 20 20 77 68  OK;.#else.    wh
2dc70 69 6c 65 28 20 7a 50 61 74 68 5b 6e 44 62 5d 21  ile( zPath[nDb]!
2dc80 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 61 73  ='-' ){.      as
2dc90 73 65 72 74 28 20 6e 44 62 3e 30 20 29 3b 0a 20  sert( nDb>0 );. 
2dca0 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 50 61       assert( zPa
2dcb0 74 68 5b 6e 44 62 5d 21 3d 27 5c 6e 27 20 29 3b  th[nDb]!='\n' );
2dcc0 0a 20 20 20 20 20 20 6e 44 62 2d 2d 3b 0a 20 20  .      nDb--;.  
2dcd0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 6d    }.#endif.    m
2dce0 65 6d 63 70 79 28 7a 44 62 2c 20 7a 50 61 74 68  emcpy(zDb, zPath
2dcf0 2c 20 6e 44 62 29 3b 0a 20 20 20 20 7a 44 62 5b  , nDb);.    zDb[
2dd00 6e 44 62 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20  nDb] = '\0';..  
2dd10 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74 28    if( 0==osStat(
2dd20 7a 44 62 2c 20 26 73 53 74 61 74 29 20 29 7b 0a  zDb, &sStat) ){.
2dd30 20 20 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20 73        *pMode = s
2dd40 53 74 61 74 2e 73 74 5f 6d 6f 64 65 20 26 20 30  Stat.st_mode & 0
2dd50 37 37 37 3b 0a 20 20 20 20 20 20 2a 70 55 69 64  777;.      *pUid
2dd60 20 3d 20 73 53 74 61 74 2e 73 74 5f 75 69 64 3b   = sStat.st_uid;
2dd70 0a 20 20 20 20 20 20 2a 70 47 69 64 20 3d 20 73  .      *pGid = s
2dd80 53 74 61 74 2e 73 74 5f 67 69 64 3b 0a 20 20 20  Stat.st_gid;.   
2dd90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
2dda0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
2ddb0 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  FSTAT;.    }.  }
2ddc0 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
2ddd0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
2dde0 45 54 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a 20 20  ETEONCLOSE ){.  
2ddf0 20 20 2a 70 4d 6f 64 65 20 3d 20 30 36 30 30 3b    *pMode = 0600;
2de00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2de10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
2de20 74 68 65 20 66 69 6c 65 20 7a 50 61 74 68 2e 0a  the file zPath..
2de30 2a 2a 20 0a 2a 2a 20 50 72 65 76 69 6f 75 73 6c  ** .** Previousl
2de40 79 2c 20 74 68 65 20 53 51 4c 69 74 65 20 4f 53  y, the SQLite OS
2de50 20 6c 61 79 65 72 20 75 73 65 64 20 74 68 72 65   layer used thre
2de60 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 70  e functions in p
2de70 6c 61 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20  lace of this.** 
2de80 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73  one:.**.**     s
2de90 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
2dea0 57 72 69 74 65 28 29 3b 0a 2a 2a 20 20 20 20 20  Write();.**     
2deb0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
2dec0 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20 20 20  dOnly();.**     
2ded0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63  sqlite3OsOpenExc
2dee0 6c 75 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20  lusive();.**.** 
2def0 54 68 65 73 65 20 63 61 6c 6c 73 20 63 6f 72 72  These calls corr
2df00 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 66 6f  espond to the fo
2df10 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74  llowing combinat
2df20 69 6f 6e 73 20 6f 66 20 66 6c 61 67 73 3a 0a 2a  ions of flags:.*
2df30 2a 0a 2a 2a 20 20 20 20 20 52 65 61 64 57 72 69  *.**     ReadWri
2df40 74 65 28 29 20 2d 3e 20 20 20 20 20 28 52 45 41  te() ->     (REA
2df50 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 29  DWRITE | CREATE)
2df60 0a 2a 2a 20 20 20 20 20 52 65 61 64 4f 6e 6c 79  .**     ReadOnly
2df70 28 29 20 20 2d 3e 20 20 20 20 20 28 52 45 41 44  ()  ->     (READ
2df80 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20 20 20 4f 70  ONLY) .**     Op
2df90 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20 2d 3e  enExclusive() ->
2dfa0 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 52   (READWRITE | CR
2dfb0 45 41 54 45 20 7c 20 45 58 43 4c 55 53 49 56 45  EATE | EXCLUSIVE
2dfc0 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64 20  ).**.** The old 
2dfd0 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20  OpenExclusive() 
2dfe0 61 63 63 65 70 74 65 64 20 61 20 62 6f 6f 6c 65  accepted a boole
2dff0 61 6e 20 61 72 67 75 6d 65 6e 74 20 2d 20 22 64  an argument - "d
2e000 65 6c 46 6c 61 67 22 2e 20 49 66 0a 2a 2a 20 74  elFlag". If.** t
2e010 72 75 65 2c 20 74 68 65 20 66 69 6c 65 20 77 61  rue, the file wa
2e020 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20  s configured to 
2e030 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
2e040 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68   deleted when th
2e050 65 0a 2a 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65  e.** file handle
2e060 20 63 6c 6f 73 65 64 2e 20 54 6f 20 61 63 68 69   closed. To achi
2e070 65 76 65 20 74 68 65 20 73 61 6d 65 20 65 66 66  eve the same eff
2e080 65 63 74 20 75 73 69 6e 67 20 74 68 69 73 20 6e  ect using this n
2e090 65 77 20 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65  ew .** interface
2e0a0 2c 20 61 64 64 20 74 68 65 20 44 45 4c 45 54 45  , add the DELETE
2e0b0 4f 4e 43 4c 4f 53 45 20 66 6c 61 67 20 74 6f 20  ONCLOSE flag to 
2e0c0 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 20  those specified 
2e0d0 61 62 6f 76 65 20 66 6f 72 20 0a 2a 2a 20 4f 70  above for .** Op
2e0e0 65 6e 45 78 63 6c 75 73 69 76 65 28 29 2e 0a 2a  enExclusive()..*
2e0f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
2e100 78 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  xOpen(.  sqlite3
2e110 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
2e120 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53        /* The VFS
2e130 20 66 6f 72 20 77 68 69 63 68 20 74 68 69 73 20   for which this 
2e140 69 73 20 74 68 65 20 78 4f 70 65 6e 20 6d 65 74  is the xOpen met
2e150 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  hod */.  const c
2e160 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
2e170 20 20 20 20 20 20 2f 2a 20 50 61 74 68 6e 61 6d        /* Pathnam
2e180 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20  e of file to be 
2e190 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69  opened */.  sqli
2e1a0 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
2e1b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2e1c0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2e1d0 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 69 6e 20  to be filled in 
2e1e0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
2e1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e200 20 20 2f 2a 20 49 6e 70 75 74 20 66 6c 61 67 73    /* Input flags
2e210 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20   to control the 
2e220 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  opening */.  int
2e230 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20   *pOutFlags     
2e240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
2e250 70 75 74 20 66 6c 61 67 73 20 72 65 74 75 72 6e  put flags return
2e260 65 64 20 74 6f 20 53 51 4c 69 74 65 20 63 6f 72  ed to SQLite cor
2e270 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69  e */.){.  unixFi
2e280 6c 65 20 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c  le *p = (unixFil
2e290 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74  e *)pFile;.  int
2e2a0 20 66 64 20 3d 20 2d 31 3b 20 20 20 20 20 20 20   fd = -1;       
2e2b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2e2c0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 72  ile descriptor r
2e2d0 65 74 75 72 6e 65 64 20 62 79 20 6f 70 65 6e 28  eturned by open(
2e2e0 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 65 6e 46  ) */.  int openF
2e2f0 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20  lags = 0;       
2e300 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74        /* Flags t
2e310 6f 20 70 61 73 73 20 74 6f 20 6f 70 65 6e 28 29  o pass to open()
2e320 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20   */.  int eType 
2e330 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46 46 46  = flags&0xFFFFFF
2e340 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20  00;  /* Type of 
2e350 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
2e360 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20    int noLock;   
2e370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e380 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74   /* True to omit
2e390 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69   locking primiti
2e3a0 76 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ves */.  int rc 
2e3b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2e3c0 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74          /* Funct
2e3d0 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20  ion Return Code 
2e3e0 2a 2f 0a 20 20 69 6e 74 20 63 74 72 6c 46 6c 61  */.  int ctrlFla
2e3f0 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  gs = 0;         
2e400 20 20 20 20 2f 2a 20 55 4e 49 58 46 49 4c 45 5f      /* UNIXFILE_
2e410 2a 20 66 6c 61 67 73 20 2a 2f 0a 0a 20 20 69 6e  * flags */..  in
2e420 74 20 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d  t isExclusive  =
2e430 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
2e440 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29  _OPEN_EXCLUSIVE)
2e450 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65  ;.  int isDelete
2e460 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20       = (flags & 
2e470 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
2e480 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e  TEONCLOSE);.  in
2e490 74 20 69 73 43 72 65 61 74 65 20 20 20 20 20 3d  t isCreate     =
2e4a0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
2e4b0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20  _OPEN_CREATE);. 
2e4c0 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20   int isReadonly 
2e4d0 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
2e4e0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
2e4f0 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64  Y);.  int isRead
2e500 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20  Write  = (flags 
2e510 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  & SQLITE_OPEN_RE
2e520 41 44 57 52 49 54 45 29 3b 0a 23 69 66 20 53 51  ADWRITE);.#if SQ
2e530 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2e540 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20  ING_STYLE.  int 
2e550 69 73 41 75 74 6f 50 72 6f 78 79 20 20 3d 20 28  isAutoProxy  = (
2e560 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
2e570 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 29 3b 0a  PEN_AUTOPROXY);.
2e580 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
2e590 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c  ed(__APPLE__) ||
2e5a0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2e5b0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 73  OCKING_STYLE.  s
2e5c0 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49  truct statfs fsI
2e5d0 6e 66 6f 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  nfo;.#endif..  /
2e5e0 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20  * If creating a 
2e5f0 6d 61 73 74 65 72 20 6f 72 20 6d 61 69 6e 2d 66  master or main-f
2e600 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 69  ile journal, thi
2e610 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  s function will 
2e620 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 66 69 6c 65  open.  ** a file
2e630 2d 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74  -descriptor on t
2e640 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f 6f  he directory too
2e650 2e 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65  . The first time
2e660 20 75 6e 69 78 53 79 6e 63 28 29 0a 20 20 2a 2a   unixSync().  **
2e670 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 64   is called the d
2e680 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65  irectory file de
2e690 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65  scriptor will be
2e6a0 20 66 73 79 6e 63 28 29 65 64 20 61 6e 64 20 63   fsync()ed and c
2e6b0 6c 6f 73 65 28 29 64 2e 0a 20 20 2a 2f 0a 20 20  lose()d..  */.  
2e6c0 69 6e 74 20 73 79 6e 63 44 69 72 20 3d 20 28 69  int syncDir = (i
2e6d0 73 43 72 65 61 74 65 20 26 26 20 28 0a 20 20 20  sCreate && (.   
2e6e0 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51 4c 49       eType==SQLI
2e6f0 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
2e700 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20  OURNAL .     || 
2e710 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2e720 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
2e730 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  .     || eType==
2e740 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a  SQLITE_OPEN_WAL.
2e750 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61    ));..  /* If a
2e760 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69 73  rgument zPath is
2e770 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c   a NULL pointer,
2e780 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2e790 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f 70  s required to op
2e7a0 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72  en.  ** a tempor
2e7b0 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74 68  ary file. Use th
2e7c0 69 73 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f  is buffer to sto
2e7d0 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65  re the file name
2e7e0 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72   in..  */.  char
2e7f0 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50 41   zTmpname[MAX_PA
2e800 54 48 4e 41 4d 45 2b 32 5d 3b 0a 20 20 63 6f 6e  THNAME+2];.  con
2e810 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  st char *zName =
2e820 20 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a 20 43 68   zPath;..  /* Ch
2e830 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  eck the followin
2e840 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  g statements are
2e850 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a   true: .  **.  *
2e860 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c 79 20  *   (a) Exactly 
2e870 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41 44 57  one of the READW
2e880 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c  RITE and READONL
2e890 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20  Y flags must be 
2e8a0 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20  set, and .  **  
2e8b0 20 28 62 29 20 69 66 20 43 52 45 41 54 45 20 69   (b) if CREATE i
2e8c0 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45 41 44  s set, then READ
2e8d0 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  WRITE must also 
2e8e0 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a  be set, and.  **
2e8f0 20 20 20 28 63 29 20 69 66 20 45 58 43 4c 55 53     (c) if EXCLUS
2e900 49 56 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  IVE is set, then
2e910 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73   CREATE must als
2e920 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20  o be set..  **  
2e930 20 28 64 29 20 69 66 20 44 45 4c 45 54 45 4f 4e   (d) if DELETEON
2e940 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20 74 68  CLOSE is set, th
2e950 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61  en CREATE must a
2e960 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f  lso be set..  */
2e970 0a 20 20 61 73 73 65 72 74 28 28 69 73 52 65 61  .  assert((isRea
2e980 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65  donly==0 || isRe
2e990 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26 20 28  adWrite==0) && (
2e9a0 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c 20 69  isReadWrite || i
2e9b0 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61  sReadonly));.  a
2e9c0 73 73 65 72 74 28 69 73 43 72 65 61 74 65 3d 3d  ssert(isCreate==
2e9d0 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65  0 || isReadWrite
2e9e0 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 45 78  );.  assert(isEx
2e9f0 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73  clusive==0 || is
2ea00 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72  Create);.  asser
2ea10 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c  t(isDelete==0 ||
2ea20 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f   isCreate);..  /
2ea30 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d  * The main DB, m
2ea40 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c  ain journal, WAL
2ea50 20 66 69 6c 65 20 61 6e 64 20 6d 61 73 74 65 72   file and master
2ea60 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65 76   journal are nev
2ea70 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74  er .  ** automat
2ea80 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20  ically deleted. 
2ea90 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65 76 65  Nor are they eve
2eaa0 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
2eab0 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s.  */.  assert(
2eac0 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
2ead0 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
2eae0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2eaf0 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _DB );.  assert(
2eb00 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
2eb10 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
2eb20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2eb30 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73  _JOURNAL );.  as
2eb40 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
2eb50 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
2eb60 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
2eb70 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
2eb80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  );.  assert( (!i
2eb90 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
2eba0 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
2ebb0 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a  TE_OPEN_WAL );..
2ebc0 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
2ebd0 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72   the upper layer
2ebe0 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f 66 20   has set one of 
2ebf0 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65 22 20  the "file-type" 
2ec00 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65  flags. */.  asse
2ec10 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54  rt( eType==SQLIT
2ec20 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20  E_OPEN_MAIN_DB  
2ec30 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
2ec40 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44  LITE_OPEN_TEMP_D
2ec50 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  B .       || eTy
2ec60 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
2ec70 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20  MAIN_JOURNAL || 
2ec80 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2ec90 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20  EN_TEMP_JOURNAL 
2eca0 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  .       || eType
2ecb0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55  ==SQLITE_OPEN_SU
2ecc0 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54  BJOURNAL   || eT
2ecd0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
2ece0 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
2ecf0 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  .       || eType
2ed00 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52  ==SQLITE_OPEN_TR
2ed10 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54  ANSIENT_DB || eT
2ed20 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
2ed30 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  _WAL.  );..  /* 
2ed40 44 65 74 65 63 74 20 61 20 70 69 64 20 63 68 61  Detect a pid cha
2ed50 6e 67 65 20 61 6e 64 20 72 65 73 65 74 20 74 68  nge and reset th
2ed60 65 20 50 52 4e 47 2e 20 20 54 68 65 72 65 20 69  e PRNG.  There i
2ed70 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69  s a race conditi
2ed80 6f 6e 0a 20 20 2a 2a 20 68 65 72 65 20 73 75 63  on.  ** here suc
2ed90 68 20 74 68 61 74 20 74 77 6f 20 6f 72 20 6d 6f  h that two or mo
2eda0 72 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20 74  re threads all t
2edb0 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e 20 64 61  rying to open da
2edc0 74 61 62 61 73 65 73 20 61 74 0a 20 20 2a 2a 20  tabases at.  ** 
2edd0 74 68 65 20 73 61 6d 65 20 69 6e 73 74 61 6e 74  the same instant
2ede0 20 6d 69 67 68 74 20 61 6c 6c 20 72 65 73 65 74   might all reset
2edf0 20 74 68 65 20 50 52 4e 47 2e 20 20 42 75 74 20   the PRNG.  But 
2ee00 6d 75 6c 74 69 70 6c 65 20 72 65 73 65 74 73 0a  multiple resets.
2ee10 20 20 2a 2a 20 61 72 65 20 68 61 72 6d 6c 65 73    ** are harmles
2ee20 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 61  s..  */.  if( ra
2ee30 6e 64 6f 6d 6e 65 73 73 50 69 64 21 3d 6f 73 47  ndomnessPid!=osG
2ee40 65 74 70 69 64 28 30 29 20 29 7b 0a 20 20 20 20  etpid(0) ){.    
2ee50 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 20 3d 20  randomnessPid = 
2ee60 6f 73 47 65 74 70 69 64 28 30 29 3b 0a 20 20 20  osGetpid(0);.   
2ee70 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
2ee80 65 73 73 28 30 2c 30 29 3b 0a 20 20 7d 0a 0a 20  ess(0,0);.  }.. 
2ee90 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69   memset(p, 0, si
2eea0 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b  zeof(unixFile));
2eeb0 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53  ..  if( eType==S
2eec0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
2eed0 44 42 20 29 7b 0a 20 20 20 20 55 6e 69 78 55 6e  DB ){.    UnixUn
2eee0 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b  usedFd *pUnused;
2eef0 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 66  .    pUnused = f
2ef00 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 7a 4e  indReusableFd(zN
2ef10 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20  ame, flags);.   
2ef20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a   if( pUnused ){.
2ef30 20 20 20 20 20 20 66 64 20 3d 20 70 55 6e 75 73        fd = pUnus
2ef40 65 64 2d 3e 66 64 3b 0a 20 20 20 20 7d 65 6c 73  ed->fd;.    }els
2ef50 65 7b 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64  e{.      pUnused
2ef60 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
2ef70 63 36 34 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75  c64(sizeof(*pUnu
2ef80 73 65 64 29 29 3b 0a 20 20 20 20 20 20 69 66 28  sed));.      if(
2ef90 20 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20   !pUnused ){.   
2efa0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2efb0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
2efc0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70  }.    }.    p->p
2efd0 55 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64  Unused = pUnused
2efe0 3b 0a 0a 20 20 20 20 2f 2a 20 44 61 74 61 62 61  ;..    /* Databa
2eff0 73 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65  se filenames are
2f000 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72   double-zero ter
2f010 6d 69 6e 61 74 65 64 20 69 66 20 74 68 65 79 20  minated if they 
2f020 61 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 55  are not.    ** U
2f030 52 49 73 20 77 69 74 68 20 70 61 72 61 6d 65 74  RIs with paramet
2f040 65 72 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65  ers.  Hence, the
2f050 79 20 63 61 6e 20 61 6c 77 61 79 73 20 62 65 20  y can always be 
2f060 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20 20 20  passed into.    
2f070 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70  ** sqlite3_uri_p
2f080 61 72 61 6d 65 74 65 72 28 29 2e 20 2a 2f 0a 20  arameter(). */. 
2f090 20 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67     assert( (flag
2f0a0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
2f0b0 55 52 49 29 20 7c 7c 20 7a 4e 61 6d 65 5b 73 74  URI) || zName[st
2f0c0 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d 3d  rlen(zName)+1]==
2f0d0 30 20 29 3b 0a 0a 20 20 7d 65 6c 73 65 20 69 66  0 );..  }else if
2f0e0 28 20 21 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  ( !zName ){.    
2f0f0 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 4e  /* If zName is N
2f100 55 4c 4c 2c 20 74 68 65 20 75 70 70 65 72 20 6c  ULL, the upper l
2f110 61 79 65 72 20 69 73 20 72 65 71 75 65 73 74 69  ayer is requesti
2f120 6e 67 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20  ng a temp file. 
2f130 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 69 73  */.    assert(is
2f140 44 65 6c 65 74 65 20 26 26 20 21 73 79 6e 63 44  Delete && !syncD
2f150 69 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 75 6e  ir);.    rc = un
2f160 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 56  ixGetTempname(pV
2f170 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20  fs->mxPathname, 
2f180 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69  zTmpname);.    i
2f190 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2f1a0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2f1b0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a   rc;.    }.    z
2f1c0 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b  Name = zTmpname;
2f1d0 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74  ..    /* Generat
2f1e0 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ed temporary fil
2f1f0 65 6e 61 6d 65 73 20 61 72 65 20 61 6c 77 61 79  enames are alway
2f200 73 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65  s double-zero te
2f210 72 6d 69 6e 61 74 65 64 0a 20 20 20 20 2a 2a 20  rminated.    ** 
2f220 66 6f 72 20 75 73 65 20 62 79 20 73 71 6c 69 74  for use by sqlit
2f230 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72  e3_uri_parameter
2f240 28 29 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  (). */.    asser
2f250 74 28 20 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e 28  t( zName[strlen(
2f260 7a 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a  zName)+1]==0 );.
2f270 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d    }..  /* Determ
2f280 69 6e 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ine the value of
2f290 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
2f2a0 65 74 65 72 20 70 61 73 73 65 64 20 74 6f 20 50  eter passed to P
2f2b0 4f 53 49 58 20 66 75 6e 63 74 69 6f 6e 0a 20 20  OSIX function.  
2f2c0 2a 2a 20 6f 70 65 6e 28 29 2e 20 54 68 65 73 65  ** open(). These
2f2d0 20 6d 75 73 74 20 62 65 20 63 61 6c 63 75 6c 61   must be calcula
2f2e0 74 65 64 20 65 76 65 6e 20 69 66 20 6f 70 65 6e  ted even if open
2f2f0 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  () is not called
2f300 2c 20 61 73 0a 20 20 2a 2a 20 74 68 65 79 20 6d  , as.  ** they m
2f310 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20  ay be stored as 
2f320 70 61 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65  part of the file
2f330 20 68 61 6e 64 6c 65 20 61 6e 64 20 75 73 65 64   handle and used
2f340 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 27 63   by the .  ** 'c
2f350 6f 6e 63 68 20 66 69 6c 65 27 20 6c 6f 63 6b 69  onch file' locki
2f360 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20 6c 61 74  ng functions lat
2f370 65 72 20 6f 6e 2e 20 20 2a 2f 0a 20 20 69 66 28  er on.  */.  if(
2f380 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 20 20 6f   isReadonly )  o
2f390 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44  penFlags |= O_RD
2f3a0 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 69 73 52 65  ONLY;.  if( isRe
2f3b0 61 64 57 72 69 74 65 20 29 20 6f 70 65 6e 46 6c  adWrite ) openFl
2f3c0 61 67 73 20 7c 3d 20 4f 5f 52 44 57 52 3b 0a 20  ags |= O_RDWR;. 
2f3d0 20 69 66 28 20 69 73 43 72 65 61 74 65 20 29 20   if( isCreate ) 
2f3e0 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20     openFlags |= 
2f3f0 4f 5f 43 52 45 41 54 3b 0a 20 20 69 66 28 20 69  O_CREAT;.  if( i
2f400 73 45 78 63 6c 75 73 69 76 65 20 29 20 6f 70 65  sExclusive ) ope
2f410 6e 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 45 58 43  nFlags |= (O_EXC
2f420 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57 29 3b 0a 20  L|O_NOFOLLOW);. 
2f430 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f   openFlags |= (O
2f440 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e  _LARGEFILE|O_BIN
2f450 41 52 59 29 3b 0a 0a 20 20 69 66 28 20 66 64 3c  ARY);..  if( fd<
2f460 30 20 29 7b 0a 20 20 20 20 6d 6f 64 65 5f 74 20  0 ){.    mode_t 
2f470 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20 20 20 20  openMode;       
2f480 20 20 20 20 20 20 20 2f 2a 20 50 65 72 6d 69 73         /* Permis
2f490 73 69 6f 6e 73 20 74 6f 20 63 72 65 61 74 65 20  sions to create 
2f4a0 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20 20  file with */.   
2f4b0 20 75 69 64 5f 74 20 75 69 64 3b 20 20 20 20 20   uid_t uid;     
2f4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f4d0 2a 20 55 73 65 72 69 64 20 66 6f 72 20 74 68 65  * Userid for the
2f4e0 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 67 69 64   file */.    gid
2f4f0 5f 74 20 67 69 64 3b 20 20 20 20 20 20 20 20 20  _t gid;         
2f500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 72             /* Gr
2f510 6f 75 70 69 64 20 66 6f 72 20 74 68 65 20 66 69  oupid for the fi
2f520 6c 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66  le */.    rc = f
2f530 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64  indCreateFileMod
2f540 65 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 2c 20  e(zName, flags, 
2f550 26 6f 70 65 6e 4d 6f 64 65 2c 20 26 75 69 64 2c  &openMode, &uid,
2f560 20 26 67 69 64 29 3b 0a 20 20 20 20 69 66 28 20   &gid);.    if( 
2f570 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2f580 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
2f590 70 2d 3e 70 55 6e 75 73 65 64 20 29 3b 0a 20 20  p->pUnused );.  
2f5a0 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70      assert( eTyp
2f5b0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  e==SQLITE_OPEN_W
2f5c0 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c  AL || eType==SQL
2f5d0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
2f5e0 55 52 4e 41 4c 20 29 3b 0a 20 20 20 20 20 20 72  URNAL );.      r
2f5f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
2f600 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f      fd = robust_
2f610 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e  open(zName, open
2f620 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29  Flags, openMode)
2f630 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
2f640 4f 50 45 4e 58 20 20 20 25 2d 33 64 20 25 73 20  OPENX   %-3d %s 
2f650 30 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d  0%o\n", fd, zNam
2f660 65 2c 20 6f 70 65 6e 46 6c 61 67 73 29 29 3b 0a  e, openFlags));.
2f670 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 45      assert( !isE
2f680 78 63 6c 75 73 69 76 65 20 7c 7c 20 28 6f 70 65  xclusive || (ope
2f690 6e 46 6c 61 67 73 20 26 20 4f 5f 43 52 45 41 54  nFlags & O_CREAT
2f6a0 29 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  )!=0 );.    if( 
2f6b0 66 64 3c 30 20 26 26 20 65 72 72 6e 6f 21 3d 45  fd<0 && errno!=E
2f6c0 49 53 44 49 52 20 26 26 20 69 73 52 65 61 64 57  ISDIR && isReadW
2f6d0 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  rite ){.      /*
2f6e0 20 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20   Failed to open 
2f6f0 74 68 65 20 66 69 6c 65 20 66 6f 72 20 72 65 61  the file for rea
2f700 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20  d/write access. 
2f710 54 72 79 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 2a  Try read-only. *
2f720 2f 0a 20 20 20 20 20 20 66 6c 61 67 73 20 26 3d  /.      flags &=
2f730 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   ~(SQLITE_OPEN_R
2f740 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
2f750 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20  OPEN_CREATE);.  
2f760 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 26 3d      openFlags &=
2f770 20 7e 28 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41   ~(O_RDWR|O_CREA
2f780 54 29 3b 0a 20 20 20 20 20 20 66 6c 61 67 73 20  T);.      flags 
2f790 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  |= SQLITE_OPEN_R
2f7a0 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 6f  EADONLY;.      o
2f7b0 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44  penFlags |= O_RD
2f7c0 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 69 73 52 65  ONLY;.      isRe
2f7d0 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20  adonly = 1;.    
2f7e0 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
2f7f0 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c  en(zName, openFl
2f800 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a  ags, openMode);.
2f810 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 64      }.    if( fd
2f820 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  <0 ){.      rc =
2f830 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
2f840 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
2f850 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 4e 61 6d  PT, "open", zNam
2f860 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f  e);.      goto o
2f870 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20  pen_finished;.  
2f880 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
2f890 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 72  his process is r
2f8a0 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74 20 61  unning as root a
2f8b0 6e 64 20 69 66 20 63 72 65 61 74 69 6e 67 20 61  nd if creating a
2f8c0 20 6e 65 77 20 72 6f 6c 6c 62 61 63 6b 0a 20 20   new rollback.  
2f8d0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6f 72 20    ** journal or 
2f8e0 57 41 4c 20 66 69 6c 65 2c 20 73 65 74 20 74 68  WAL file, set th
2f8f0 65 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74  e ownership of t
2f900 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 57 41  he journal or WA
2f910 4c 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 74  L to be.    ** t
2f920 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 6f  he same as the o
2f930 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
2f940 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2f950 20 66 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45   flags & (SQLITE
2f960 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45  _OPEN_WAL|SQLITE
2f970 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
2f980 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 72 6f 62  AL) ){.      rob
2f990 75 73 74 46 63 68 6f 77 6e 28 66 64 2c 20 75 69  ustFchown(fd, ui
2f9a0 64 2c 20 67 69 64 29 3b 0a 20 20 20 20 7d 0a 20  d, gid);.    }. 
2f9b0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 66 64 3e   }.  assert( fd>
2f9c0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4f 75 74  =0 );.  if( pOut
2f9d0 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 2a 70 4f  Flags ){.    *pO
2f9e0 75 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  utFlags = flags;
2f9f0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 70  .  }..  if( p->p
2fa00 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 70 2d  Unused ){.    p-
2fa10 3e 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66  >pUnused->fd = f
2fa20 64 3b 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65  d;.    p->pUnuse
2fa30 64 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73  d->flags = flags
2fa40 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 44  ;.  }..  if( isD
2fa50 65 6c 65 74 65 20 29 7b 0a 23 69 66 20 4f 53 5f  elete ){.#if OS_
2fa60 56 58 57 4f 52 4b 53 0a 20 20 20 20 7a 50 61 74  VXWORKS.    zPat
2fa70 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 65 6c 69 66  h = zName;.#elif
2fa80 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2fa90 55 4e 4c 49 4e 4b 5f 41 46 54 45 52 5f 43 4c 4f  UNLINK_AFTER_CLO
2faa0 53 45 29 0a 20 20 20 20 7a 50 61 74 68 20 3d 20  SE).    zPath = 
2fab0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
2fac0 22 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  "%s", zName);.  
2fad0 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29    if( zPath==0 )
2fae0 7b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63  {.      robust_c
2faf0 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49  lose(p, fd, __LI
2fb00 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 72 65 74  NE__);.      ret
2fb10 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2fb20 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  ;.    }.#else.  
2fb30 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 4e 61 6d 65    osUnlink(zName
2fb40 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69  );.#endif.  }.#i
2fb50 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2fb60 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
2fb70 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6f 70 65  else{.    p->ope
2fb80 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61  nFlags = openFla
2fb90 67 73 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  gs;.  }.#endif..
2fba0 20 20 6e 6f 4c 6f 63 6b 20 3d 20 65 54 79 70 65    noLock = eType
2fbb0 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
2fbc0 49 4e 5f 44 42 3b 0a 0a 20 20 0a 23 69 66 20 64  IN_DB;..  .#if d
2fbd0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
2fbe0 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) || SQLITE_ENAB
2fbf0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2fc00 0a 20 20 69 66 28 20 66 73 74 61 74 66 73 28 66  .  if( fstatfs(f
2fc10 64 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d  d, &fsInfo) == -
2fc20 31 20 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61  1 ){.    storeLa
2fc30 73 74 45 72 72 6e 6f 28 70 2c 20 65 72 72 6e 6f  stErrno(p, errno
2fc40 29 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  );.    robust_cl
2fc50 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e  ose(p, fd, __LIN
2fc60 45 5f 5f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  E__);.    return
2fc70 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43   SQLITE_IOERR_AC
2fc80 43 45 53 53 3b 0a 20 20 7d 0a 20 20 69 66 20 28  CESS;.  }.  if (
2fc90 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28 22 6d 73  0 == strncmp("ms
2fca0 64 6f 73 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66  dos", fsInfo.f_f
2fcb0 73 74 79 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b  stypename, 5)) {
2fcc0 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a  .    ((unixFile*
2fcd0 29 70 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67 73  )pFile)->fsFlags
2fce0 20 7c 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c 41   |= SQLITE_FSFLA
2fcf0 47 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d  GS_IS_MSDOS;.  }
2fd00 0a 20 20 69 66 20 28 30 20 3d 3d 20 73 74 72 6e  .  if (0 == strn
2fd10 63 6d 70 28 22 65 78 66 61 74 22 2c 20 66 73 49  cmp("exfat", fsI
2fd20 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65  nfo.f_fstypename
2fd30 2c 20 35 29 29 20 7b 0a 20 20 20 20 28 28 75 6e  , 5)) {.    ((un
2fd40 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e  ixFile*)pFile)->
2fd50 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  fsFlags |= SQLIT
2fd60 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44  E_FSFLAGS_IS_MSD
2fd70 4f 53 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  OS;.  }.#endif..
2fd80 20 20 2f 2a 20 53 65 74 20 75 70 20 61 70 70 72    /* Set up appr
2fd90 6f 70 72 69 61 74 65 20 63 74 72 6c 46 6c 61 67  opriate ctrlFlag
2fda0 73 20 2a 2f 0a 20 20 69 66 28 20 69 73 44 65 6c  s */.  if( isDel
2fdb0 65 74 65 20 29 20 20 20 20 20 20 20 20 20 20 20  ete )           
2fdc0 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c       ctrlFlags |
2fdd0 3d 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54  = UNIXFILE_DELET
2fde0 45 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f  E;.  if( isReado
2fdf0 6e 6c 79 20 29 20 20 20 20 20 20 20 20 20 20 20  nly )           
2fe00 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20     ctrlFlags |= 
2fe10 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b  UNIXFILE_RDONLY;
2fe20 0a 20 20 69 66 28 20 6e 6f 4c 6f 63 6b 20 29 20  .  if( noLock ) 
2fe30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe40 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e   ctrlFlags |= UN
2fe50 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20  IXFILE_NOLOCK;. 
2fe60 20 69 66 28 20 73 79 6e 63 44 69 72 20 29 20 20   if( syncDir )  
2fe70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
2fe80 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
2fe90 46 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0a 20 20  FILE_DIRSYNC;.  
2fea0 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
2feb0 54 45 5f 4f 50 45 4e 5f 55 52 49 20 29 20 63 74  TE_OPEN_URI ) ct
2fec0 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
2fed0 49 4c 45 5f 55 52 49 3b 0a 0a 23 69 66 20 53 51  ILE_URI;..#if SQ
2fee0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2fef0 49 4e 47 5f 53 54 59 4c 45 0a 23 69 66 20 53 51  ING_STYLE.#if SQ
2ff00 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58  LITE_PREFER_PROX
2ff10 59 5f 4c 4f 43 4b 49 4e 47 0a 20 20 69 73 41 75  Y_LOCKING.  isAu
2ff20 74 6f 50 72 6f 78 79 20 3d 20 31 3b 0a 23 65 6e  toProxy = 1;.#en
2ff30 64 69 66 0a 20 20 69 66 28 20 69 73 41 75 74 6f  dif.  if( isAuto
2ff40 50 72 6f 78 79 20 26 26 20 28 7a 50 61 74 68 21  Proxy && (zPath!
2ff50 3d 4e 55 4c 4c 29 20 26 26 20 28 21 6e 6f 4c 6f  =NULL) && (!noLo
2ff60 63 6b 29 20 26 26 20 70 56 66 73 2d 3e 78 4f 70  ck) && pVfs->xOp
2ff70 65 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  en ){.    char *
2ff80 65 6e 76 66 6f 72 63 65 20 3d 20 67 65 74 65 6e  envforce = geten
2ff90 76 28 22 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f  v("SQLITE_FORCE_
2ffa0 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22 29 3b  PROXY_LOCKING");
2ffb0 0a 20 20 20 20 69 6e 74 20 75 73 65 50 72 6f 78  .    int useProx
2ffc0 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53  y = 0;..    /* S
2ffd0 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58  QLITE_FORCE_PROX
2ffe0 59 5f 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d 65 61  Y_LOCKING==1 mea
2fff0 6e 73 20 66 6f 72 63 65 20 61 6c 77 61 79 73 20  ns force always 
30000 75 73 65 20 70 72 6f 78 79 2c 20 30 20 6d 65 61  use proxy, 0 mea
30010 6e 73 20 0a 20 20 20 20 2a 2a 20 6e 65 76 65 72  ns .    ** never
30020 20 75 73 65 20 70 72 6f 78 79 2c 20 4e 55 4c 4c   use proxy, NULL
30030 20 6d 65 61 6e 73 20 75 73 65 20 70 72 6f 78 79   means use proxy
30040 20 66 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66   for non-local f
30050 69 6c 65 73 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 20  iles only.  */. 
30060 20 20 20 69 66 28 20 65 6e 76 66 6f 72 63 65 21     if( envforce!
30070 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 75  =NULL ){.      u
30080 73 65 50 72 6f 78 79 20 3d 20 61 74 6f 69 28 65  seProxy = atoi(e
30090 6e 76 66 6f 72 63 65 29 3e 30 3b 0a 20 20 20 20  nvforce)>0;.    
300a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 73 65  }else{.      use
300b0 50 72 6f 78 79 20 3d 20 21 28 66 73 49 6e 66 6f  Proxy = !(fsInfo
300c0 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 4c 4f 43  .f_flags&MNT_LOC
300d0 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  AL);.    }.    i
300e0 66 28 20 75 73 65 50 72 6f 78 79 20 29 7b 0a 20  f( useProxy ){. 
300f0 20 20 20 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e       rc = fillIn
30100 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66  UnixFile(pVfs, f
30110 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c  d, pFile, zPath,
30120 20 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20   ctrlFlags);.   
30130 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
30140 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
30150 72 63 20 3d 20 70 72 6f 78 79 54 72 61 6e 73 66  rc = proxyTransf
30160 6f 72 6d 55 6e 69 78 46 69 6c 65 28 28 75 6e 69  ormUnixFile((uni
30170 78 46 69 6c 65 2a 29 70 46 69 6c 65 2c 20 22 3a  xFile*)pFile, ":
30180 61 75 74 6f 3a 22 29 3b 0a 20 20 20 20 20 20 20  auto:");.       
30190 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
301a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
301b0 2f 2a 20 55 73 65 20 75 6e 69 78 43 6c 6f 73 65  /* Use unixClose
301c0 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 74 68 65   to clean up the
301d0 20 72 65 73 6f 75 72 63 65 73 20 61 64 64 65 64   resources added
301e0 20 69 6e 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69   in fillInUnixFi
301f0 6c 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  le .          **
30200 20 61 6e 64 20 63 6c 65 61 72 20 61 6c 6c 20 74   and clear all t
30210 68 65 20 73 74 72 75 63 74 75 72 65 27 73 20 72  he structure's r
30220 65 66 65 72 65 6e 63 65 73 2e 20 20 53 70 65 63  eferences.  Spec
30230 69 66 69 63 61 6c 6c 79 2c 20 0a 20 20 20 20 20  ifically, .     
30240 20 20 20 20 20 2a 2a 20 70 46 69 6c 65 2d 3e 70       ** pFile->p
30250 4d 65 74 68 6f 64 73 20 77 69 6c 6c 20 62 65 20  Methods will be 
30260 4e 55 4c 4c 20 73 6f 20 73 71 6c 69 74 65 33 4f  NULL so sqlite3O
30270 73 43 6c 6f 73 65 20 77 69 6c 6c 20 62 65 20 61  sClose will be a
30280 20 6e 6f 2d 6f 70 20 0a 20 20 20 20 20 20 20 20   no-op .        
30290 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75    */.          u
302a0 6e 69 78 43 6c 6f 73 65 28 70 46 69 6c 65 29 3b  nixClose(pFile);
302b0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
302c0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
302d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
302e0 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64  to open_finished
302f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
30300 69 66 0a 20 20 0a 20 20 72 63 20 3d 20 66 69 6c  if.  .  rc = fil
30310 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73  lInUnixFile(pVfs
30320 2c 20 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61  , fd, pFile, zPa
30330 74 68 2c 20 63 74 72 6c 46 6c 61 67 73 29 3b 0a  th, ctrlFlags);.
30340 0a 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3a 0a  .open_finished:.
30350 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
30360 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
30370 65 33 5f 66 72 65 65 28 70 2d 3e 70 55 6e 75 73  e3_free(p->pUnus
30380 65 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ed);.  }.  retur
30390 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
303a0 44 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 20  Delete the file 
303b0 61 74 20 7a 50 61 74 68 2e 20 49 66 20 74 68 65  at zPath. If the
303c0 20 64 69 72 53 79 6e 63 20 61 72 67 75 6d 65 6e   dirSync argumen
303d0 74 20 69 73 20 74 72 75 65 2c 20 66 73 79 6e 63  t is true, fsync
303e0 28 29 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74  ().** the direct
303f0 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65 74 69  ory after deleti
30400 6e 67 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a  ng the file..*/.
30410 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44  static int unixD
30420 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74 65 33  elete(.  sqlite3
30430 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20  _vfs *NotUsed,  
30440 20 20 20 2f 2a 20 56 46 53 20 63 6f 6e 74 61 69     /* VFS contai
30450 6e 69 6e 67 20 74 68 69 73 20 61 73 20 74 68 65  ning this as the
30460 20 78 44 65 6c 65 74 65 20 6d 65 74 68 6f 64 20   xDelete method 
30470 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
30480 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 2f  *zPath,        /
30490 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74  * Name of file t
304a0 6f 20 62 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a  o be deleted */.
304b0 20 20 69 6e 74 20 64 69 72 53 79 6e 63 20 20 20    int dirSync   
304c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
304d0 66 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29 20  f true, fsync() 
304e0 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72 20  directory after 
304f0 64 65 6c 65 74 69 6e 67 20 66 69 6c 65 20 2a 2f  deleting file */
30500 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
30510 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55 53  QLITE_OK;.  UNUS
30520 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
30530 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74  Used);.  Simulat
30540 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
30550 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
30560 45 54 45 29 3b 0a 20 20 69 66 28 20 6f 73 55 6e  ETE);.  if( osUn
30570 6c 69 6e 6b 28 7a 50 61 74 68 29 3d 3d 28 2d 31  link(zPath)==(-1
30580 29 20 29 7b 0a 20 20 20 20 69 66 28 20 65 72 72  ) ){.    if( err
30590 6e 6f 3d 3d 45 4e 4f 45 4e 54 0a 23 69 66 20 4f  no==ENOENT.#if O
305a0 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 20 20  S_VXWORKS.      
305b0 20 20 7c 7c 20 6f 73 41 63 63 65 73 73 28 7a 50    || osAccess(zP
305c0 61 74 68 2c 30 29 21 3d 30 0a 23 65 6e 64 69 66  ath,0)!=0.#endif
305d0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63  .    ){.      rc
305e0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
305f0 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 0a 20 20  DELETE_NOENT;.  
30600 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
30610 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  c = unixLogError
30620 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45  (SQLITE_IOERR_DE
30630 4c 45 54 45 2c 20 22 75 6e 6c 69 6e 6b 22 2c 20  LETE, "unlink", 
30640 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20  zPath);.    }.  
30650 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
30660 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
30670 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a  DISABLE_DIRSYNC.
30680 20 20 69 66 28 20 28 64 69 72 53 79 6e 63 20 26    if( (dirSync &
30690 20 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e   1)!=0 ){.    in
306a0 74 20 66 64 3b 0a 20 20 20 20 72 63 20 3d 20 6f  t fd;.    rc = o
306b0 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 7a  sOpenDirectory(z
306c0 50 61 74 68 2c 20 26 66 64 29 3b 0a 20 20 20 20  Path, &fd);.    
306d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
306e0 4b 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  K ){.#if OS_VXWO
306f0 52 4b 53 0a 20 20 20 20 20 20 69 66 28 20 66 73  RKS.      if( fs
30700 79 6e 63 28 66 64 29 3d 3d 2d 31 20 29 0a 23 65  ync(fd)==-1 ).#e
30710 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 66 73  lse.      if( fs
30720 79 6e 63 28 66 64 29 20 29 0a 23 65 6e 64 69 66  ync(fd) ).#endif
30730 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
30740 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
30750 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
30760 44 49 52 5f 46 53 59 4e 43 2c 20 22 66 73 79 6e  DIR_FSYNC, "fsyn
30770 63 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20  c", zPath);.    
30780 20 20 7d 0a 20 20 20 20 20 20 72 6f 62 75 73 74    }.      robust
30790 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f  _close(0, fd, __
307a0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c  LINE__);.    }el
307b0 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
307c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e  ( rc==SQLITE_CAN
307d0 54 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20 20 72  TOPEN );.      r
307e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
307f0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
30800 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
30810 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 65  /*.** Test the e
30820 78 69 73 74 65 6e 63 65 20 6f 66 20 6f 72 20 61  xistence of or a
30830 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e  ccess permission
30840 73 20 6f 66 20 66 69 6c 65 20 7a 50 61 74 68 2e  s of file zPath.
30850 20 54 68 65 0a 2a 2a 20 74 65 73 74 20 70 65 72   The.** test per
30860 66 6f 72 6d 65 64 20 64 65 70 65 6e 64 73 20 6f  formed depends o
30870 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 66  n the value of f
30880 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lags:.**.**     
30890 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
308a0 49 53 54 53 3a 20 52 65 74 75 72 6e 20 31 20 69  ISTS: Return 1 i
308b0 66 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74  f the file exist
308c0 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  s.**     SQLITE_
308d0 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45  ACCESS_READWRITE
308e0 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  : Return 1 if th
308f0 65 20 66 69 6c 65 20 69 73 20 72 65 61 64 20 61  e file is read a
30900 6e 64 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2a 20  nd writable..** 
30910 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53      SQLITE_ACCES
30920 53 5f 52 45 41 44 4f 4e 4c 59 3a 20 52 65 74 75  S_READONLY: Retu
30930 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65  rn 1 if the file
30940 20 69 73 20 72 65 61 64 61 62 6c 65 2e 0a 2a 2a   is readable..**
30950 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 72 65  .** Otherwise re
30960 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  turn 0..*/.stati
30970 63 20 69 6e 74 20 75 6e 69 78 41 63 63 65 73 73  c int unixAccess
30980 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
30990 2a 4e 6f 74 55 73 65 64 2c 20 20 20 2f 2a 20 54  *NotUsed,   /* T
309a0 68 65 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e  he VFS containin
309b0 67 20 74 68 69 73 20 78 41 63 63 65 73 73 20 6d  g this xAccess m
309c0 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ethod */.  const
309d0 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
309e0 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 74 68     /* Path of th
309f0 65 20 66 69 6c 65 20 74 6f 20 65 78 61 6d 69 6e  e file to examin
30a00 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
30a10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
30a20 2a 20 57 68 61 74 20 64 6f 20 77 65 20 77 61 6e  * What do we wan
30a30 74 20 74 6f 20 6c 65 61 72 6e 20 61 62 6f 75 74  t to learn about
30a40 20 74 68 65 20 7a 50 61 74 68 20 66 69 6c 65 3f   the zPath file?
30a50 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f   */.  int *pResO
30a60 75 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ut            /*
30a70 20 57 72 69 74 65 20 72 65 73 75 6c 74 20 62 6f   Write result bo
30a80 6f 6c 65 61 6e 20 68 65 72 65 20 2a 2f 0a 29 7b  olean here */.){
30a90 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
30aa0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
30ab0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
30ac0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
30ad0 4f 45 52 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a  OERR_ACCESS; );.
30ae0 20 20 61 73 73 65 72 74 28 20 70 52 65 73 4f 75    assert( pResOu
30af0 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  t!=0 );..  /* Th
30b00 65 20 73 70 65 63 20 73 61 79 73 20 74 68 65 72  e spec says ther
30b10 65 20 61 72 65 20 74 68 72 65 65 20 70 6f 73 73  e are three poss
30b20 69 62 6c 65 20 76 61 6c 75 65 73 20 66 6f 72 20  ible values for 
30b30 66 6c 61 67 73 2e 20 20 42 75 74 20 6f 6e 6c 79  flags.  But only
30b40 0a 20 20 2a 2a 20 74 77 6f 20 6f 66 20 74 68 65  .  ** two of the
30b50 6d 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 75  m are actually u
30b60 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  sed */.  assert(
30b70 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41   flags==SQLITE_A
30b80 43 43 45 53 53 5f 45 58 49 53 54 53 20 7c 7c 20  CCESS_EXISTS || 
30b90 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43  flags==SQLITE_AC
30ba0 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 20 29  CESS_READWRITE )
30bb0 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 3d 3d  ;..  if( flags==
30bc0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
30bd0 49 53 54 53 20 29 7b 0a 20 20 20 20 73 74 72 75  ISTS ){.    stru
30be0 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20  ct stat buf;.   
30bf0 20 2a 70 52 65 73 4f 75 74 20 3d 20 28 30 3d 3d   *pResOut = (0==
30c00 6f 73 53 74 61 74 28 7a 50 61 74 68 2c 20 26 62  osStat(zPath, &b
30c10 75 66 29 20 26 26 20 62 75 66 2e 73 74 5f 73 69  uf) && buf.st_si
30c20 7a 65 3e 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ze>0);.  }else{.
30c30 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 6f      *pResOut = o
30c40 73 41 63 63 65 73 73 28 7a 50 61 74 68 2c 20 57  sAccess(zPath, W
30c50 5f 4f 4b 7c 52 5f 4f 4b 29 3d 3d 30 3b 0a 20 20  _OK|R_OK)==0;.  
30c60 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
30c70 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
30c80 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20  Turn a relative 
30c90 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20  pathname into a 
30ca0 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 54  full pathname. T
30cb0 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68  he relative path
30cc0 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 61 73  .** is stored as
30cd0 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65   a nul-terminate
30ce0 64 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20  d string in the 
30cf0 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74  buffer pointed t
30d00 6f 20 62 79 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a  o by.** zPath. .
30d10 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e 74  **.** zOut point
30d20 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66  s to a buffer of
30d30 20 61 74 20 6c 65 61 73 74 20 73 71 6c 69 74 65   at least sqlite
30d40 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65  3_vfs.mxPathname
30d50 20 62 79 74 65 73 20 0a 2a 2a 20 28 69 6e 20 74   bytes .** (in t
30d60 68 69 73 20 63 61 73 65 2c 20 4d 41 58 5f 50 41  his case, MAX_PA
30d70 54 48 4e 41 4d 45 20 62 79 74 65 73 29 2e 20 54  THNAME bytes). T
30d80 68 65 20 66 75 6c 6c 2d 70 61 74 68 20 69 73 20  he full-path is 
30d90 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 74 68  written to.** th
30da0 69 73 20 62 75 66 66 65 72 20 62 65 66 6f 72 65  is buffer before
30db0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
30dc0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 75  tatic int unixFu
30dd0 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71  llPathname(.  sq
30de0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
30df0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
30e00 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62  ointer to vfs ob
30e10 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ject */.  const 
30e20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
30e30 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69          /* Possi
30e40 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69 6e 70  bly relative inp
30e50 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74  ut path */.  int
30e60 20 6e 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20   nOut,          
30e70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
30e80 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62 75 66  ze of output buf
30e90 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  fer in bytes */.
30ea0 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 20 20 20    char *zOut    
30eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30ec0 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65 72  /* Output buffer
30ed0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79   */.){.  int nBy
30ee0 74 65 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f  te;..  /* It's o
30ef0 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61  dd to simulate a
30f00 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c  n io-error here,
30f10 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73   but really this
30f20 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73   is just.  ** us
30f30 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72  ing the io-error
30f40 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20   infrastructure 
30f50 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
30f60 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73  ite handles this
30f70 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66  .  ** function f
30f80 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e  ailing. This fun
30f90 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c  ction could fail
30fa0 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65   if, for example
30fb0 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65  , the.  ** curre
30fc0 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63  nt working direc
30fd0 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e  tory has been un
30fe0 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53  linked..  */.  S
30ff0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
31000 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
31010 52 4f 52 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  ROR );..  assert
31020 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ( pVfs->mxPathna
31030 6d 65 3d 3d 4d 41 58 5f 50 41 54 48 4e 41 4d 45  me==MAX_PATHNAME
31040 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
31050 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20  AMETER(pVfs);.. 
31060 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 72   /* Attempt to r
31070 65 73 6f 6c 76 65 20 74 68 65 20 70 61 74 68 20  esolve the path 
31080 61 73 20 69 66 20 69 74 20 77 65 72 65 20 61 20  as if it were a 
31090 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 2e 20 49  symbolic link. I
310a0 66 20 69 74 20 69 73 0a 20 20 2a 2a 20 61 20 73  f it is.  ** a s
310b0 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 2c 20 74 68  ymbolic link, th
310c0 65 20 72 65 73 6f 6c 76 65 64 20 70 61 74 68 20  e resolved path 
310d0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 62 75 66  is stored in buf
310e0 66 65 72 20 7a 4f 75 74 5b 5d 2e 20 4f 72 2c 20  fer zOut[]. Or, 
310f0 69 66 0a 20 20 2a 2a 20 74 68 65 20 69 64 65 6e  if.  ** the iden
31100 74 69 66 69 65 64 20 66 69 6c 65 20 69 73 20 6e  tified file is n
31110 6f 74 20 61 20 73 79 6d 62 6f 6c 69 63 20 6c 69  ot a symbolic li
31120 6e 6b 20 6f 72 20 64 6f 65 73 20 6e 6f 74 20 65  nk or does not e
31130 78 69 73 74 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  xist, then.  ** 
31140 7a 50 61 74 68 20 69 73 20 63 6f 70 69 65 64 20  zPath is copied 
31150 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 7a 4f  directly into zO
31160 75 74 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20  ut. Either way, 
31170 6e 42 79 74 65 20 69 73 20 6c 65 66 74 20 73 65  nByte is left se
31180 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 73 69  t to.  ** the si
31190 7a 65 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67  ze of the string
311a0 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 7a 4f 75   copied into zOu
311b0 74 5b 5d 20 69 6e 20 62 79 74 65 73 2e 20 20 2a  t[] in bytes.  *
311c0 2f 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 52 65  /.  nByte = osRe
311d0 61 64 6c 69 6e 6b 28 7a 50 61 74 68 2c 20 7a 4f  adlink(zPath, zO
311e0 75 74 2c 20 6e 4f 75 74 2d 31 29 3b 0a 20 20 69  ut, nOut-1);.  i
311f0 66 28 20 6e 42 79 74 65 3c 30 20 29 7b 0a 20 20  f( nByte<0 ){.  
31200 20 20 69 66 28 20 65 72 72 6e 6f 21 3d 45 49 4e    if( errno!=EIN
31210 56 41 4c 20 26 26 20 65 72 72 6e 6f 21 3d 45 4e  VAL && errno!=EN
31220 4f 45 4e 54 20 29 7b 0a 20 20 20 20 20 20 72 65  OENT ){.      re
31230 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f  turn unixLogErro
31240 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
31250 4e 5f 42 4b 50 54 2c 20 22 72 65 61 64 6c 69 6e  N_BKPT, "readlin
31260 6b 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20  k", zPath);.    
31270 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  }.    sqlite3_sn
31280 70 72 69 6e 74 66 28 6e 4f 75 74 2c 20 7a 4f 75  printf(nOut, zOu
31290 74 2c 20 22 25 73 22 2c 20 7a 50 61 74 68 29 3b  t, "%s", zPath);
312a0 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73 71 6c  .    nByte = sql
312b0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 75  ite3Strlen30(zOu
312c0 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
312d0 20 7a 4f 75 74 5b 6e 42 79 74 65 5d 20 3d 20 27   zOut[nByte] = '
312e0 5c 30 27 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  \0';.  }..  /* I
312f0 66 20 62 75 66 66 65 72 20 7a 4f 75 74 5b 5d 20  f buffer zOut[] 
31300 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  now contains an 
31310 61 62 73 6f 6c 75 74 65 20 70 61 74 68 20 74 68  absolute path th
31320 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 6d  ere is nothing m
31330 6f 72 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 2e 20  ore.  ** to do. 
31340 49 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 61  If it contains a
31350 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 2c 20   relative path, 
31360 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  do the following
31370 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20  :.  **.  **   * 
31380 6d 6f 76 65 20 74 68 65 20 72 65 6c 61 74 69 76  move the relativ
31390 65 20 70 61 74 68 20 73 74 72 69 6e 67 20 73 6f  e path string so
313a0 20 74 68 61 74 20 69 74 20 69 73 20 61 74 20 74   that it is at t
313b0 68 65 20 65 6e 64 20 6f 66 20 74 68 0a 20 20 2a  he end of th.  *
313c0 2a 20 20 20 20 20 7a 4f 75 74 5b 5d 20 62 75 66  *     zOut[] buf
313d0 66 65 72 2e 0a 20 20 2a 2a 20 20 20 2a 20 43 61  fer..  **   * Ca
313e0 6c 6c 20 67 65 74 63 77 64 28 29 20 74 6f 20 72  ll getcwd() to r
313f0 65 61 64 20 74 68 65 20 70 61 74 68 20 6f 66 20  ead the path of 
31400 74 68 65 20 63 75 72 72 65 6e 74 20 77 6f 72 6b  the current work
31410 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 0a 20  ing directory . 
31420 20 2a 2a 20 20 20 20 20 69 6e 74 6f 20 74 68 65   **     into the
31430 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 7a 4f   start of the zO
31440 75 74 5b 5d 20 62 75 66 66 65 72 2e 0a 20 20 2a  ut[] buffer..  *
31450 2a 20 20 20 2a 20 41 70 70 65 6e 64 20 61 20 27  *   * Append a '
31460 2f 27 20 63 68 61 72 61 63 74 65 72 20 74 6f 20  /' character to 
31470 74 68 65 20 63 77 64 20 73 74 72 69 6e 67 20 61  the cwd string a
31480 6e 64 20 6d 6f 76 65 20 74 68 65 20 0a 20 20 2a  nd move the .  *
31490 2a 20 20 20 20 20 72 65 6c 61 74 69 76 65 20 70  *     relative p
314a0 61 74 68 20 62 61 63 6b 20 77 69 74 68 69 6e 20  ath back within 
314b0 74 68 65 20 62 75 66 66 65 72 20 73 6f 20 74 68  the buffer so th
314c0 61 74 20 69 74 20 69 6d 6d 65 64 69 61 74 65 6c  at it immediatel
314d0 79 20 0a 20 20 2a 2a 20 20 20 20 20 66 6f 6c 6c  y .  **     foll
314e0 6f 77 73 20 74 68 65 20 27 2f 27 2e 0a 20 20 2a  ows the '/'..  *
314f0 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65  *.  ** This code
31500 20 69 73 20 77 72 69 74 74 65 6e 20 73 6f 20 74   is written so t
31510 68 61 74 20 69 66 20 74 68 65 20 63 6f 6d 62 69  hat if the combi
31520 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 43 57  nation of the CW
31530 44 20 61 6e 64 20 72 65 6c 61 74 69 76 65 0a 20  D and relative. 
31540 20 2a 2a 20 70 61 74 68 20 61 72 65 20 6c 61 72   ** path are lar
31550 67 65 72 20 74 68 61 6e 20 74 68 65 20 61 6c 6c  ger than the all
31560 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 7a  ocated size of z
31570 4f 75 74 5b 5d 20 74 68 65 20 43 57 44 20 69 73  Out[] the CWD is
31580 20 73 69 6c 65 6e 74 6c 79 0a 20 20 2a 2a 20 74   silently.  ** t
31590 72 75 6e 63 61 74 65 64 20 74 6f 20 6d 61 6b 65  runcated to make
315a0 20 69 74 20 66 69 74 2e 20 54 68 69 73 20 69 73   it fit. This is
315b0 20 4f 6b 2c 20 61 73 20 53 51 4c 69 74 65 20 72   Ok, as SQLite r
315c0 65 66 75 73 65 73 20 74 6f 20 6f 70 65 6e 20 61  efuses to open a
315d0 6e 79 0a 20 20 2a 2a 20 66 69 6c 65 20 66 6f 72  ny.  ** file for
315e0 20 77 68 69 63 68 20 74 68 69 73 20 66 75 6e 63   which this func
315f0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 66  tion returns a f
31600 75 6c 6c 20 70 61 74 68 20 6c 61 72 67 65 72 20  ull path larger 
31610 74 68 61 6e 20 28 6e 4f 75 74 2d 38 29 0a 20 20  than (nOut-8).  
31620 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
31630 2e 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  .  */.  testcase
31640 28 20 6e 42 79 74 65 3d 3d 6e 4f 75 74 2d 35 20  ( nByte==nOut-5 
31650 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
31660 42 79 74 65 3d 3d 6e 4f 75 74 2d 34 20 29 3b 0a  Byte==nOut-4 );.
31670 20 20 69 66 28 20 7a 4f 75 74 5b 30 5d 21 3d 27    if( zOut[0]!='
31680 2f 27 20 26 26 20 6e 42 79 74 65 3c 6e 4f 75 74  /' && nByte<nOut
31690 2d 34 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 43  -4 ){.    int nC
316a0 77 64 3b 0a 20 20 20 20 69 6e 74 20 6e 52 65 6d  wd;.    int nRem
316b0 20 3d 20 6e 4f 75 74 2d 6e 42 79 74 65 2d 31 3b   = nOut-nByte-1;
316c0 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 7a 4f  .    memmove(&zO
316d0 75 74 5b 6e 52 65 6d 5d 2c 20 7a 4f 75 74 2c 20  ut[nRem], zOut, 
316e0 6e 42 79 74 65 2b 31 29 3b 0a 20 20 20 20 7a 4f  nByte+1);.    zO
316f0 75 74 5b 6e 52 65 6d 2d 31 5d 20 3d 20 27 5c 30  ut[nRem-1] = '\0
31700 27 3b 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74  ';.    if( osGet
31710 63 77 64 28 7a 4f 75 74 2c 20 6e 52 65 6d 2d 31  cwd(zOut, nRem-1
31720 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )==0 ){.      re
31730 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f  turn unixLogErro
31740 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
31750 4e 5f 42 4b 50 54 2c 20 22 67 65 74 63 77 64 22  N_BKPT, "getcwd"
31760 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  , zPath);.    }.
31770 20 20 20 20 6e 43 77 64 20 3d 20 73 71 6c 69 74      nCwd = sqlit
31780 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 75 74 29  e3Strlen30(zOut)
31790 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 43  ;.    assert( nC
317a0 77 64 3c 3d 6e 52 65 6d 2d 31 20 29 3b 0a 20 20  wd<=nRem-1 );.  
317b0 20 20 7a 4f 75 74 5b 6e 43 77 64 5d 20 3d 20 27    zOut[nCwd] = '
317c0 2f 27 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28  /';.    memmove(
317d0 26 7a 4f 75 74 5b 6e 43 77 64 2b 31 5d 2c 20 26  &zOut[nCwd+1], &
317e0 7a 4f 75 74 5b 6e 52 65 6d 5d 2c 20 6e 42 79 74  zOut[nRem], nByt
317f0 65 2b 31 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  e+1);.  }..  ret
31800 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
31810 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
31820 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
31830 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  NSION./*.** Inte
31840 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69  rfaces for openi
31850 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72  ng a shared libr
31860 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74  ary, finding ent
31870 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74  ry points.** wit
31880 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c  hin the shared l
31890 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73  ibrary, and clos
318a0 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c  ing the shared l
318b0 69 62 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c  ibrary..*/.#incl
318c0 75 64 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a 73 74  ude <dlfcn.h>.st
318d0 61 74 69 63 20 76 6f 69 64 20 2a 75 6e 69 78 44  atic void *unixD
318e0 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66  lOpen(sqlite3_vf
318f0 73 20 2a 4e 6f 74 55 73 65 64 2c 20 63 6f 6e 73  s *NotUsed, cons
31900 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
31910 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  e){.  UNUSED_PAR
31920 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
31930 0a 20 20 72 65 74 75 72 6e 20 64 6c 6f 70 65 6e  .  return dlopen
31940 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 52 54 4c 44  (zFilename, RTLD
31950 5f 4e 4f 57 20 7c 20 52 54 4c 44 5f 47 4c 4f 42  _NOW | RTLD_GLOB
31960 41 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51  AL);.}../*.** SQ
31970 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20  Lite calls this 
31980 66 75 6e 63 74 69 6f 6e 20 69 6d 6d 65 64 69 61  function immedia
31990 74 65 6c 79 20 61 66 74 65 72 20 61 20 63 61 6c  tely after a cal
319a0 6c 20 74 6f 20 75 6e 69 78 44 6c 53 79 6d 28 29  l to unixDlSym()
319b0 20 6f 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f 70 65   or.** unixDlOpe
319c0 6e 28 29 20 66 61 69 6c 73 20 28 72 65 74 75 72  n() fails (retur
319d0 6e 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65  ns a null pointe
319e0 72 29 2e 20 49 66 20 61 20 6d 6f 72 65 20 64 65  r). If a more de
319f0 74 61 69 6c 65 64 20 65 72 72 6f 72 0a 2a 2a 20  tailed error.** 
31a00 6d 65 73 73 61 67 65 20 69 73 20 61 76 61 69 6c  message is avail
31a10 61 62 6c 65 2c 20 69 74 20 69 73 20 77 72 69 74  able, it is writ
31a20 74 65 6e 20 74 6f 20 7a 42 75 66 4f 75 74 2e 20  ten to zBufOut. 
31a30 49 66 20 6e 6f 20 65 72 72 6f 72 20 6d 65 73 73  If no error mess
31a40 61 67 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61  age.** is availa
31a50 62 6c 65 2c 20 7a 42 75 66 4f 75 74 20 69 73 20  ble, zBufOut is 
31a60 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 20  left unmodified 
31a70 61 6e 64 20 53 51 4c 69 74 65 20 75 73 65 73 20  and SQLite uses 
31a80 61 20 64 65 66 61 75 6c 74 0a 2a 2a 20 65 72 72  a default.** err
31a90 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 73  or message..*/.s
31aa0 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44  tatic void unixD
31ab0 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  lError(sqlite3_v
31ac0 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  fs *NotUsed, int
31ad0 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
31ae0 66 4f 75 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63  fOut){.  const c
31af0 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 55 4e 55  har *zErr;.  UNU
31b00 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
31b10 74 55 73 65 64 29 3b 0a 20 20 75 6e 69 78 45 6e  tUsed);.  unixEn
31b20 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 7a 45  terMutex();.  zE
31b30 72 72 20 3d 20 64 6c 65 72 72 6f 72 28 29 3b 0a  rr = dlerror();.
31b40 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20    if( zErr ){.  
31b50 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
31b60 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74  tf(nBuf, zBufOut
31b70 2c 20 22 25 73 22 2c 20 7a 45 72 72 29 3b 0a 20  , "%s", zErr);. 
31b80 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75   }.  unixLeaveMu
31b90 74 65 78 28 29 3b 0a 7d 0a 73 74 61 74 69 63 20  tex();.}.static 
31ba0 76 6f 69 64 20 28 2a 75 6e 69 78 44 6c 53 79 6d  void (*unixDlSym
31bb0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
31bc0 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 2c 20  tUsed, void *p, 
31bd0 63 6f 6e 73 74 20 63 68 61 72 2a 7a 53 79 6d 29  const char*zSym)
31be0 29 28 76 6f 69 64 29 7b 0a 20 20 2f 2a 20 0a 20  )(void){.  /* . 
31bf0 20 2a 2a 20 47 43 43 20 77 69 74 68 20 2d 70 65   ** GCC with -pe
31c00 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 20 73 61  dantic-errors sa
31c10 79 73 20 74 68 61 74 20 43 39 30 20 64 6f 65 73  ys that C90 does
31c20 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 76 6f 69   not allow a voi
31c30 64 2a 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 61  d* to be.  ** ca
31c40 73 74 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65  st into a pointe
31c50 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e  r to a function.
31c60 20 20 41 6e 64 20 79 65 74 20 74 68 65 20 6c 69    And yet the li
31c70 62 72 61 72 79 20 64 6c 73 79 6d 28 29 20 72 6f  brary dlsym() ro
31c80 75 74 69 6e 65 0a 20 20 2a 2a 20 72 65 74 75 72  utine.  ** retur
31c90 6e 73 20 61 20 76 6f 69 64 2a 20 77 68 69 63 68  ns a void* which
31ca0 20 69 73 20 72 65 61 6c 6c 79 20 61 20 70 6f 69   is really a poi
31cb0 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
31cc0 6f 6e 2e 20 20 53 6f 20 68 6f 77 20 64 6f 20 77  on.  So how do w
31cd0 65 0a 20 20 2a 2a 20 75 73 65 20 64 6c 73 79 6d  e.  ** use dlsym
31ce0 28 29 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69  () with -pedanti
31cf0 63 2d 65 72 72 6f 72 73 3f 0a 20 20 2a 2a 0a 20  c-errors?.  **. 
31d00 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 78 20 62   ** Variable x b
31d10 65 6c 6f 77 20 69 73 20 64 65 66 69 6e 65 64 20  elow is defined 
31d20 74 6f 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20  to be a pointer 
31d30 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 61  to a function ta
31d40 6b 69 6e 67 0a 20 20 2a 2a 20 70 61 72 61 6d 65  king.  ** parame
31d50 74 65 72 73 20 76 6f 69 64 2a 20 61 6e 64 20 63  ters void* and c
31d60 6f 6e 73 74 20 63 68 61 72 2a 20 61 6e 64 20 72  onst char* and r
31d70 65 74 75 72 6e 69 6e 67 20 61 20 70 6f 69 6e 74  eturning a point
31d80 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
31d90 2e 0a 20 20 2a 2a 20 57 65 20 69 6e 69 74 69 61  ..  ** We initia
31da0 6c 69 7a 65 20 78 20 62 79 20 61 73 73 69 67 6e  lize x by assign
31db0 69 6e 67 20 69 74 20 61 20 70 6f 69 6e 74 65 72  ing it a pointer
31dc0 20 74 6f 20 74 68 65 20 64 6c 73 79 6d 28 29 20   to the dlsym() 
31dd0 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 28  function..  ** (
31de0 54 68 61 74 20 61 73 73 69 67 6e 6d 65 6e 74 20  That assignment 
31df0 72 65 71 75 69 72 65 73 20 61 20 63 61 73 74 2e  requires a cast.
31e00 29 20 20 54 68 65 6e 20 77 65 20 63 61 6c 6c 20  )  Then we call 
31e10 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  the function tha
31e20 74 0a 20 20 2a 2a 20 78 20 70 6f 69 6e 74 73 20  t.  ** x points 
31e30 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  to.  .  **.  ** 
31e40 54 68 69 73 20 77 6f 72 6b 2d 61 72 6f 75 6e 64  This work-around
31e50 20 69 73 20 75 6e 6c 69 6b 65 6c 79 20 74 6f 20   is unlikely to 
31e60 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 20 6f  work correctly o
31e70 6e 20 61 6e 79 20 73 79 73 74 65 6d 20 77 68 65  n any system whe
31e80 72 65 0a 20 20 2a 2a 20 79 6f 75 20 72 65 61 6c  re.  ** you real
31e90 6c 79 20 63 61 6e 6e 6f 74 20 63 61 73 74 20 61  ly cannot cast a
31ea0 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
31eb0 72 20 69 6e 74 6f 20 76 6f 69 64 2a 2e 20 20 42  r into void*.  B
31ec0 75 74 20 74 68 65 6e 2c 20 6f 6e 20 74 68 65 0a  ut then, on the.
31ed0 20 20 2a 2a 20 6f 74 68 65 72 20 68 61 6e 64 2c    ** other hand,
31ee0 20 64 6c 73 79 6d 28 29 20 77 69 6c 6c 20 6e 6f   dlsym() will no
31ef0 74 20 77 6f 72 6b 20 6f 6e 20 73 75 63 68 20 61  t work on such a
31f00 20 73 79 73 74 65 6d 20 65 69 74 68 65 72 2c 20   system either, 
31f10 73 6f 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20  so we have.  ** 
31f20 6e 6f 74 20 72 65 61 6c 6c 79 20 6c 6f 73 74 20  not really lost 
31f30 61 6e 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20  anything..  */. 
31f40 20 76 6f 69 64 20 28 2a 28 2a 78 29 28 76 6f 69   void (*(*x)(voi
31f50 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29  d*,const char*))
31f60 28 76 6f 69 64 29 3b 0a 20 20 55 4e 55 53 45 44  (void);.  UNUSED
31f70 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
31f80 65 64 29 3b 0a 20 20 78 20 3d 20 28 76 6f 69 64  ed);.  x = (void
31f90 28 2a 28 2a 29 28 76 6f 69 64 2a 2c 63 6f 6e 73  (*(*)(void*,cons
31fa0 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29 29  t char*))(void))
31fb0 64 6c 73 79 6d 3b 0a 20 20 72 65 74 75 72 6e 20  dlsym;.  return 
31fc0 28 2a 78 29 28 70 2c 20 7a 53 79 6d 29 3b 0a 7d  (*x)(p, zSym);.}
31fd0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
31fe0 78 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  xDlClose(sqlite3
31ff0 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76  _vfs *NotUsed, v
32000 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20  oid *pHandle){. 
32010 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
32020 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 64 6c  R(NotUsed);.  dl
32030 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29 3b 0a  close(pHandle);.
32040 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51  }.#else /* if SQ
32050 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
32060 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69  XTENSION is defi
32070 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e  ned: */.  #defin
32080 65 20 75 6e 69 78 44 6c 4f 70 65 6e 20 20 30 0a  e unixDlOpen  0.
32090 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c    #define unixDl
320a0 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e  Error 0.  #defin
320b0 65 20 75 6e 69 78 44 6c 53 79 6d 20 20 20 30 0a  e unixDlSym   0.
320c0 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c    #define unixDl
320d0 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a  Close 0.#endif..
320e0 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e 42 75 66  /*.** Write nBuf
320f0 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d   bytes of random
32100 20 64 61 74 61 20 74 6f 20 74 68 65 20 73 75 70   data to the sup
32110 70 6c 69 65 64 20 62 75 66 66 65 72 20 7a 42 75  plied buffer zBu
32120 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  f..*/.static int
32130 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 28   unixRandomness(
32140 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
32150 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20  Used, int nBuf, 
32160 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55  char *zBuf){.  U
32170 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
32180 4e 6f 74 55 73 65 64 29 3b 0a 20 20 61 73 73 65  NotUsed);.  asse
32190 72 74 28 28 73 69 7a 65 5f 74 29 6e 42 75 66 3e  rt((size_t)nBuf>
321a0 3d 28 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74 29  =(sizeof(time_t)
321b0 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29 29 3b 0a  +sizeof(int)));.
321c0 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 74 6f  .  /* We have to
321d0 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75 66   initialize zBuf
321e0 20 74 6f 20 70 72 65 76 65 6e 74 20 76 61 6c 67   to prevent valg
321f0 72 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72 74  rind from report
32200 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e  ing.  ** errors.
32210 20 20 54 68 65 20 72 65 70 6f 72 74 73 20 69 73    The reports is
32220 73 75 65 64 20 62 79 20 76 61 6c 67 72 69 6e 64  sued by valgrind
32230 20 61 72 65 20 69 6e 63 6f 72 72 65 63 74 20 2d   are incorrect -
32240 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70   we would.  ** p
32250 72 65 66 65 72 20 74 68 61 74 20 74 68 65 20 72  refer that the r
32260 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63  andomness be inc
32270 72 65 61 73 65 64 20 62 79 20 6d 61 6b 69 6e 67  reased by making
32280 20 75 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a   use of the.  **
32290 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73   uninitialized s
322a0 70 61 63 65 20 69 6e 20 7a 42 75 66 20 2d 20 62  pace in zBuf - b
322b0 75 74 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f  ut valgrind erro
322c0 72 73 20 74 65 6e 64 20 74 6f 20 77 6f 72 72 79  rs tend to worry
322d0 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73  .  ** some users
322e0 2e 20 20 52 61 74 68 65 72 20 74 68 61 6e 20 61  .  Rather than a
322f0 72 67 75 65 2c 20 69 74 20 73 65 65 6d 73 20 65  rgue, it seems e
32300 61 73 69 65 72 20 6a 75 73 74 20 74 6f 20 69 6e  asier just to in
32310 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68  itialize.  ** th
32320 65 20 77 68 6f 6c 65 20 61 72 72 61 79 20 61 6e  e whole array an
32330 64 20 73 69 6c 65 6e 63 65 20 76 61 6c 67 72 69  d silence valgri
32340 6e 64 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74  nd, even if that
32350 20 6d 65 61 6e 73 20 6c 65 73 73 20 72 61 6e 64   means less rand
32360 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74  omness.  ** in t
32370 68 65 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a  he random seed..
32380 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74    **.  ** When t
32390 65 73 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69  esting, initiali
323a0 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a  zing zBuf[] to z
323b0 65 72 6f 20 69 73 20 61 6c 6c 20 77 65 20 64 6f  ero is all we do
323c0 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 0a 20 20  .  That means.  
323d0 2a 2a 20 74 68 61 74 20 77 65 20 61 6c 77 61 79  ** that we alway
323e0 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 72  s use the same r
323f0 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71  andom number seq
32400 75 65 6e 63 65 2e 20 20 54 68 69 73 20 6d 61 6b  uence.  This mak
32410 65 73 20 74 68 65 0a 20 20 2a 2a 20 74 65 73 74  es the.  ** test
32420 73 20 72 65 70 65 61 74 61 62 6c 65 2e 0a 20 20  s repeatable..  
32430 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66  */.  memset(zBuf
32440 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 20 20 72 61  , 0, nBuf);.  ra
32450 6e 64 6f 6d 6e 65 73 73 50 69 64 20 3d 20 6f 73  ndomnessPid = os
32460 47 65 74 70 69 64 28 30 29 3b 20 20 0a 23 69 66  Getpid(0);  .#if
32470 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
32480 5f 54 45 53 54 29 20 26 26 20 21 64 65 66 69 6e  _TEST) && !defin
32490 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ed(SQLITE_OMIT_R
324a0 41 4e 44 4f 4d 4e 45 53 53 29 0a 20 20 7b 0a 20  ANDOMNESS).  {. 
324b0 20 20 20 69 6e 74 20 66 64 2c 20 67 6f 74 3b 0a     int fd, got;.
324c0 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f      fd = robust_
324d0 6f 70 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64  open("/dev/urand
324e0 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20 30  om", O_RDONLY, 0
324f0 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20  );.    if( fd<0 
32500 29 7b 0a 20 20 20 20 20 20 74 69 6d 65 5f 74 20  ){.      time_t 
32510 74 3b 0a 20 20 20 20 20 20 74 69 6d 65 28 26 74  t;.      time(&t
32520 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
32530 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f 66  zBuf, &t, sizeof
32540 28 74 29 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  (t));.      memc
32550 70 79 28 26 7a 42 75 66 5b 73 69 7a 65 6f 66 28  py(&zBuf[sizeof(
32560 74 29 5d 2c 20 26 72 61 6e 64 6f 6d 6e 65 73 73  t)], &randomness
32570 50 69 64 2c 20 73 69 7a 65 6f 66 28 72 61 6e 64  Pid, sizeof(rand
32580 6f 6d 6e 65 73 73 50 69 64 29 29 3b 0a 20 20 20  omnessPid));.   
32590 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
325a0 66 28 74 29 2b 73 69 7a 65 6f 66 28 72 61 6e 64  f(t)+sizeof(rand
325b0 6f 6d 6e 65 73 73 50 69 64 29 3c 3d 28 73 69 7a  omnessPid)<=(siz
325c0 65 5f 74 29 6e 42 75 66 20 29 3b 0a 20 20 20 20  e_t)nBuf );.    
325d0 20 20 6e 42 75 66 20 3d 20 73 69 7a 65 6f 66 28    nBuf = sizeof(
325e0 74 29 20 2b 20 73 69 7a 65 6f 66 28 72 61 6e 64  t) + sizeof(rand
325f0 6f 6d 6e 65 73 73 50 69 64 29 3b 0a 20 20 20 20  omnessPid);.    
32600 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 6f 7b  }else{.      do{
32610 20 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 66 64   got = osRead(fd
32620 2c 20 7a 42 75 66 2c 20 6e 42 75 66 29 3b 20 7d  , zBuf, nBuf); }
32630 77 68 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20  while( got<0 && 
32640 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
32650 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
32660 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45  se(0, fd, __LINE
32670 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  __);.    }.  }.#
32680 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 6e  endif.  return n
32690 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53  Buf;.}.../*.** S
326a0 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c  leep for a littl
326b0 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e  e while.  Return
326c0 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   the amount of t
326d0 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54 68  ime slept..** Th
326e0 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  e argument is th
326f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72  e number of micr
32700 6f 73 65 63 6f 6e 64 73 20 77 65 20 77 61 6e 74  oseconds we want
32710 20 74 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20 54 68   to sleep..** Th
32720 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
32730 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
32740 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 6f 66 20  microseconds of 
32750 73 6c 65 65 70 20 61 63 74 75 61 6c 6c 79 0a 2a  sleep actually.*
32760 2a 20 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d  * requested from
32770 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
32780 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
32790 2c 20 61 20 6e 75 6d 62 65 72 20 77 68 69 63 68  , a number which
327a0 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 67 72 65  .** might be gre
327b0 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
327c0 61 6c 20 74 6f 20 74 68 65 20 61 72 67 75 6d 65  al to the argume
327d0 6e 74 2c 20 62 75 74 20 6e 6f 74 20 6c 65 73 73  nt, but not less
327e0 0a 2a 2a 20 74 68 61 6e 20 74 68 65 20 61 72 67  .** than the arg
327f0 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
32800 20 69 6e 74 20 75 6e 69 78 53 6c 65 65 70 28 73   int unixSleep(s
32810 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
32820 73 65 64 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65  sed, int microse
32830 63 6f 6e 64 73 29 7b 0a 23 69 66 20 4f 53 5f 56  conds){.#if OS_V
32840 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20  XWORKS.  struct 
32850 74 69 6d 65 73 70 65 63 20 73 70 3b 0a 0a 20 20  timespec sp;..  
32860 73 70 2e 74 76 5f 73 65 63 20 3d 20 6d 69 63 72  sp.tv_sec = micr
32870 6f 73 65 63 6f 6e 64 73 20 2f 20 31 30 30 30 30  oseconds / 10000
32880 30 30 3b 0a 20 20 73 70 2e 74 76 5f 6e 73 65 63  00;.  sp.tv_nsec
32890 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73   = (microseconds
328a0 20 25 20 31 30 30 30 30 30 30 29 20 2a 20 31 30   % 1000000) * 10
328b0 30 30 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65 70 28  00;.  nanosleep(
328c0 26 73 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55 4e  &sp, NULL);.  UN
328d0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
328e0 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
328f0 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a  n microseconds;.
32900 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48 41  #elif defined(HA
32910 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48 41  VE_USLEEP) && HA
32920 56 45 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c 65  VE_USLEEP.  usle
32930 65 70 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29  ep(microseconds)
32940 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
32950 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
32960 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63   return microsec
32970 6f 6e 64 73 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  onds;.#else.  in
32980 74 20 73 65 63 6f 6e 64 73 20 3d 20 28 6d 69 63  t seconds = (mic
32990 72 6f 73 65 63 6f 6e 64 73 2b 39 39 39 39 39 39  roseconds+999999
329a0 29 2f 31 30 30 30 30 30 30 3b 0a 20 20 73 6c 65  )/1000000;.  sle
329b0 65 70 28 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55  ep(seconds);.  U
329c0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
329d0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
329e0 72 6e 20 73 65 63 6f 6e 64 73 2a 31 30 30 30 30  rn seconds*10000
329f0 30 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  00;.#endif.}../*
32a00 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
32a10 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73  g variable, if s
32a20 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  et to a non-zero
32a30 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65 72   value, is inter
32a40 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68 65  preted as.** the
32a50 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e   number of secon
32a60 64 73 20 73 69 6e 63 65 20 31 39 37 30 20 61 6e  ds since 1970 an
32a70 64 20 69 73 20 75 73 65 64 20 74 6f 20 73 65 74  d is used to set
32a80 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a   the result of.*
32a90 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65  * sqlite3OsCurre
32aa0 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20  ntTime() during 
32ab0 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64  testing..*/.#ifd
32ac0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
32ad0 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65  nt sqlite3_curre
32ae0 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a  nt_time = 0;  /*
32af0 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69 6d   Fake system tim
32b00 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e  e in seconds sin
32b10 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64  ce 1970. */.#end
32b20 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74  if../*.** Find t
32b30 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
32b40 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f  (in Universal Co
32b50 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e  ordinated Time).
32b60 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69    Write into *pi
32b70 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72 65  Now.** the curre
32b80 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  nt time and date
32b90 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79   as a Julian Day
32ba0 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38 36   number times 86
32bb0 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a  _400_000.  In.**
32bc0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 72   other words, wr
32bd0 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20  ite into *piNow 
32be0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  the number of mi
32bf0 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  lliseconds since
32c00 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65   the Julian.** e
32c10 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20  poch of noon in 
32c20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76  Greenwich on Nov
32c30 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20 42  ember 24, 4714 B
32c40 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  .C according to 
32c50 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63  the.** proleptic
32c60 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e   Gregorian calen
32c70 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75  dar..**.** On su
32c80 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 53 51  ccess, return SQ
32c90 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e  LITE_OK.  Return
32ca0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66   SQLITE_ERROR if
32cb0 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61   the time and da
32cc0 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  te .** cannot be
32cd0 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
32ce0 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e  c int unixCurren
32cf0 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74  tTimeInt64(sqlit
32d00 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
32d10 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a   sqlite3_int64 *
32d20 70 69 4e 6f 77 29 7b 0a 20 20 73 74 61 74 69 63  piNow){.  static
32d30 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
32d40 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d  nt64 unixEpoch =
32d50 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74   24405875*(sqlit
32d60 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30  e3_int64)8640000
32d70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
32d80 49 54 45 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 69  ITE_OK;.#if defi
32d90 6e 65 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a 20  ned(NO_GETTOD). 
32da0 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d   time_t t;.  tim
32db0 65 28 26 74 29 3b 0a 20 20 2a 70 69 4e 6f 77 20  e(&t);.  *piNow 
32dc0 3d 20 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  = ((sqlite3_int6
32dd0 34 29 74 29 2a 31 30 30 30 20 2b 20 75 6e 69 78  4)t)*1000 + unix
32de0 45 70 6f 63 68 3b 0a 23 65 6c 69 66 20 4f 53 5f  Epoch;.#elif OS_
32df0 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74  VXWORKS.  struct
32e00 20 74 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b 0a   timespec sNow;.
32e10 20 20 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65 28    clock_gettime(
32e20 43 4c 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c 20  CLOCK_REALTIME, 
32e30 26 73 4e 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f 77  &sNow);.  *piNow
32e40 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31   = unixEpoch + 1
32e50 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  000*(sqlite3_int
32e60 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b  64)sNow.tv_sec +
32e70 20 73 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f 31 30   sNow.tv_nsec/10
32e80 30 30 30 30 30 3b 0a 23 65 6c 73 65 0a 20 20 73  00000;.#else.  s
32e90 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73 4e  truct timeval sN
32ea0 6f 77 3b 0a 20 20 28 76 6f 69 64 29 67 65 74 74  ow;.  (void)gett
32eb0 69 6d 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20  imeofday(&sNow, 
32ec0 30 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 66  0);  /* Cannot f
32ed0 61 69 6c 20 67 69 76 65 6e 20 76 61 6c 69 64 20  ail given valid 
32ee0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 2a  arguments */.  *
32ef0 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63  piNow = unixEpoc
32f00 68 20 2b 20 31 30 30 30 2a 28 73 71 6c 69 74 65  h + 1000*(sqlite
32f10 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f  3_int64)sNow.tv_
32f20 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73  sec + sNow.tv_us
32f30 65 63 2f 31 30 30 30 3b 0a 23 65 6e 64 69 66 0a  ec/1000;.#endif.
32f40 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
32f50 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65  EST.  if( sqlite
32f60 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29  3_current_time )
32f70 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31  {.    *piNow = 1
32f80 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  000*(sqlite3_int
32f90 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65  64)sqlite3_curre
32fa0 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70  nt_time + unixEp
32fb0 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  och;.  }.#endif.
32fc0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
32fd0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
32fe0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
32ff0 20 30 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a   0 /* Not used *
33000 2f 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65  /./*.** Find the
33010 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69   current time (i
33020 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72  n Universal Coor
33030 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20  dinated Time).  
33040 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72  Write the.** cur
33050 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61  rent time and da
33060 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44  te as a Julian D
33070 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a  ay number into *
33080 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74  prNow and.** ret
33090 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31  urn 0.  Return 1
330a0 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64   if the time and
330b0 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20   date cannot be 
330c0 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
330d0 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e 74   int unixCurrent
330e0 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73  Time(sqlite3_vfs
330f0 20 2a 4e 6f 74 55 73 65 64 2c 20 64 6f 75 62 6c   *NotUsed, doubl
33100 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 73 71 6c  e *prNow){.  sql
33110 69 74 65 33 5f 69 6e 74 36 34 20 69 20 3d 20 30  ite3_int64 i = 0
33120 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 55 4e  ;.  int rc;.  UN
33130 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
33140 6f 74 55 73 65 64 29 3b 0a 20 20 72 63 20 3d 20  otUsed);.  rc = 
33150 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 49  unixCurrentTimeI
33160 6e 74 36 34 28 30 2c 20 26 69 29 3b 0a 20 20 2a  nt64(0, &i);.  *
33170 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30 30  prNow = i/864000
33180 30 30 2e 30 3b 0a 20 20 72 65 74 75 72 6e 20 72  00.0;.  return r
33190 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  c;.}.#else.# def
331a0 69 6e 65 20 75 6e 69 78 43 75 72 72 65 6e 74 54  ine unixCurrentT
331b0 69 6d 65 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69  ime 0.#endif..#i
331c0 66 20 30 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64  f 0  /* Not used
331d0 20 2a 2f 0a 2f 2a 0a 2a 2a 20 57 65 20 61 64 64   */./*.** We add
331e0 65 64 20 74 68 65 20 78 47 65 74 4c 61 73 74 45  ed the xGetLastE
331f0 72 72 6f 72 28 29 20 6d 65 74 68 6f 64 20 77 69  rror() method wi
33200 74 68 20 74 68 65 20 69 6e 74 65 6e 74 69 6f 6e  th the intention
33210 20 6f 66 20 70 72 6f 76 69 64 69 6e 67 0a 2a 2a   of providing.**
33220 20 62 65 74 74 65 72 20 6c 6f 77 2d 6c 65 76 65   better low-leve
33230 6c 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  l error messages
33240 20 77 68 65 6e 20 6f 70 65 72 61 74 69 6e 67 2d   when operating-
33250 73 79 73 74 65 6d 20 70 72 6f 62 6c 65 6d 73 20  system problems 
33260 63 6f 6d 65 20 75 70 0a 2a 2a 20 64 75 72 69 6e  come up.** durin
33270 67 20 53 51 4c 69 74 65 20 6f 70 65 72 61 74 69  g SQLite operati
33280 6f 6e 2e 20 20 42 75 74 20 73 6f 20 66 61 72 2c  on.  But so far,
33290 20 6e 6f 6e 65 20 6f 66 20 74 68 61 74 20 68 61   none of that ha
332a0 73 20 62 65 65 6e 20 69 6d 70 6c 65 6d 65 6e 74  s been implement
332b0 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72  ed.** in the cor
332c0 65 2e 20 20 53 6f 20 74 68 69 73 20 72 6f 75 74  e.  So this rout
332d0 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c  ine is never cal
332e0 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 69  led.  For now, i
332f0 74 20 69 73 20 6d 65 72 65 6c 79 0a 2a 2a 20 61  t is merely.** a
33300 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72 2e 0a 2a   place-holder..*
33310 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
33320 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71  xGetLastError(sq
33330 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
33340 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32  ed, int NotUsed2
33350 2c 20 63 68 61 72 20 2a 4e 6f 74 55 73 65 64 33  , char *NotUsed3
33360 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
33370 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
33380 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
33390 45 52 28 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20  ER(NotUsed2);.  
333a0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
333b0 28 4e 6f 74 55 73 65 64 33 29 3b 0a 20 20 72 65  (NotUsed3);.  re
333c0 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a  turn 0;.}.#else.
333d0 23 20 64 65 66 69 6e 65 20 75 6e 69 78 47 65 74  # define unixGet
333e0 4c 61 73 74 45 72 72 6f 72 20 30 0a 23 65 6e 64  LastError 0.#end
333f0 69 66 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  if.../*.********
33400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33410 20 45 6e 64 20 6f 66 20 73 71 6c 69 74 65 33 5f   End of sqlite3_
33420 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a  vfs methods ****
33430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33440 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
33450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33490 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
334a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
334b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
334c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
334d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
334e0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
334f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33500 2a 2a 2a 20 42 65 67 69 6e 20 50 72 6f 78 79 20  *** Begin Proxy 
33510 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
33520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33530 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50  ********.**.** P
33540 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20  roxy locking is 
33550 61 20 22 75 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d  a "uber-locking-
33560 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 69 73 20  method" in this 
33570 73 65 6e 73 65 3a 20 20 49 74 20 75 73 65 73 20  sense:  It uses 
33580 74 68 65 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63  the.** other loc
33590 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20  king methods on 
335a0 73 65 63 6f 6e 64 61 72 79 20 6c 6f 63 6b 20 66  secondary lock f
335b0 69 6c 65 73 2e 20 20 50 72 6f 78 79 20 6c 6f 63  iles.  Proxy loc
335c0 6b 69 6e 67 20 69 73 20 61 0a 2a 2a 20 6d 65 74  king is a.** met
335d0 61 2d 6c 61 79 65 72 20 6f 76 65 72 20 74 6f 70  a-layer over top
335e0 20 6f 66 20 74 68 65 20 70 72 69 6d 69 74 69 76   of the primitiv
335f0 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d  e locking implem
33600 65 6e 74 65 64 20 61 62 6f 76 65 2e 20 20 46 6f  ented above.  Fo
33610 72 0a 2a 2a 20 74 68 69 73 20 72 65 61 73 6f 6e  r.** this reason
33620 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74  , the division t
33630 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 6f  hat implements o
33640 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  f proxy locking 
33650 69 73 20 64 65 66 65 72 72 65 64 0a 2a 2a 20 75  is deferred.** u
33660 6e 74 69 6c 20 6c 61 74 65 20 69 6e 20 74 68 65  ntil late in the
33670 20 66 69 6c 65 20 28 68 65 72 65 29 20 61 66 74   file (here) aft
33680 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 6f 74  er all of the ot
33690 68 65 72 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20  her I/O methods 
336a0 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 64 65 66  have.** been def
336b0 69 6e 65 64 20 2d 20 73 6f 20 74 68 61 74 20 74  ined - so that t
336c0 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63  he primitive loc
336d0 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 61 72 65  king methods are
336e0 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 61 73   available.** as
336f0 20 73 65 72 76 69 63 65 73 20 74 6f 20 68 65 6c   services to hel
33700 70 20 77 69 74 68 20 74 68 65 20 69 6d 70 6c 65  p with the imple
33710 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 72 6f  mentation of pro
33720 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a  xy locking..**.*
33730 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  ***.**.** The de
33740 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 20 73 63  fault locking sc
33750 68 65 6d 65 73 20 69 6e 20 53 51 4c 69 74 65 20  hemes in SQLite 
33760 75 73 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c  use byte-range l
33770 6f 63 6b 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64  ocks on the.** d
33780 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
33790 63 6f 6f 72 64 69 6e 61 74 65 20 73 61 66 65 2c  coordinate safe,
337a0 20 63 6f 6e 63 75 72 72 65 6e 74 20 61 63 63 65   concurrent acce
337b0 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 72  ss by multiple r
337c0 65 61 64 65 72 73 0a 2a 2a 20 61 6e 64 20 77 72  eaders.** and wr
337d0 69 74 65 72 73 20 5b 68 74 74 70 3a 2f 2f 73 71  iters [http://sq
337e0 6c 69 74 65 2e 6f 72 67 2f 6c 6f 63 6b 69 6e 67  lite.org/locking
337f0 76 33 2e 68 74 6d 6c 5d 2e 20 20 54 68 65 20 66  v3.html].  The f
33800 69 76 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  ive file locking
33810 0a 2a 2a 20 73 74 61 74 65 73 20 28 55 4e 4c 4f  .** states (UNLO
33820 43 4b 45 44 2c 20 50 45 4e 44 49 4e 47 2c 20 53  CKED, PENDING, S
33830 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c  HARED, RESERVED,
33840 20 45 58 43 4c 55 53 49 56 45 29 20 61 72 65 20   EXCLUSIVE) are 
33850 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 61  implemented.** a
33860 73 20 50 4f 53 49 58 20 72 65 61 64 20 26 20 77  s POSIX read & w
33870 72 69 74 65 20 6c 6f 63 6b 73 20 6f 76 65 72 20  rite locks over 
33880 66 69 78 65 64 20 73 65 74 20 6f 66 20 6c 6f 63  fixed set of loc
33890 61 74 69 6f 6e 73 20 28 76 69 61 20 66 73 63 74  ations (via fsct
338a0 6c 29 2c 0a 2a 2a 20 6f 6e 20 41 46 50 20 61 6e  l),.** on AFP an
338b0 64 20 53 4d 42 20 6f 6e 6c 79 20 65 78 63 6c 75  d SMB only exclu
338c0 73 69 76 65 20 62 79 74 65 2d 72 61 6e 67 65 20  sive byte-range 
338d0 6c 6f 63 6b 73 20 61 72 65 20 61 76 61 69 6c 61  locks are availa
338e0 62 6c 65 20 76 69 61 20 66 73 63 74 6c 0a 2a 2a  ble via fsctl.**
338f0 20 77 69 74 68 20 5f 49 4f 57 52 28 27 7a 27 2c   with _IOWR('z',
33900 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74 65   23, struct Byte
33910 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 20 74 6f  RangeLockPB2) to
33920 20 74 72 61 63 6b 20 74 68 65 20 73 61 6d 65 20   track the same 
33930 35 20 73 74 61 74 65 73 2e 0a 2a 2a 20 54 6f 20  5 states..** To 
33940 73 69 6d 75 6c 61 74 65 20 61 20 46 5f 52 44 4c  simulate a F_RDL
33950 43 4b 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64  CK on the shared
33960 20 72 61 6e 67 65 2c 20 6f 6e 20 41 46 50 20 61   range, on AFP a
33970 20 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74   randomly select
33980 65 64 0a 2a 2a 20 61 64 64 72 65 73 73 20 69 6e  ed.** address in
33990 20 74 68 65 20 73 68 61 72 65 64 20 72 61 6e 67   the shared rang
339a0 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61  e is taken for a
339b0 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
339c0 65 20 65 6e 74 69 72 65 0a 2a 2a 20 73 68 61 72  e entire.** shar
339d0 65 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65  ed range is take
339e0 6e 20 66 6f 72 20 61 6e 20 45 58 43 4c 55 53 49  n for an EXCLUSI
339f0 56 45 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20  VE lock):.**.** 
33a00 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54       PENDING_BYT
33a10 45 20 20 20 20 20 20 20 20 30 78 34 30 30 30 30  E        0x40000
33a20 30 30 30 0a 2a 2a 20 20 20 20 20 20 52 45 53 45  000.**      RESE
33a30 52 56 45 44 5f 42 59 54 45 20 20 20 20 20 20 20  RVED_BYTE       
33a40 30 78 34 30 30 30 30 30 30 31 0a 2a 2a 20 20 20  0x40000001.**   
33a50 20 20 20 53 48 41 52 45 44 5f 52 41 4e 47 45 20     SHARED_RANGE 
33a60 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30         0x4000000
33a70 32 20 2d 3e 20 30 78 34 30 30 30 30 32 30 30 0a  2 -> 0x40000200.
33a80 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73  **.** This works
33a90 20 77 65 6c 6c 20 6f 6e 20 74 68 65 20 6c 6f 63   well on the loc
33aa0 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20  al file system, 
33ab0 62 75 74 20 73 68 6f 77 73 20 61 20 6e 65 61 72  but shows a near
33ac0 6c 79 20 31 30 30 78 0a 2a 2a 20 73 6c 6f 77 64  ly 100x.** slowd
33ad0 6f 77 6e 20 69 6e 20 72 65 61 64 20 70 65 72 66  own in read perf
33ae0 6f 72 6d 61 6e 63 65 20 6f 6e 20 41 46 50 20 62  ormance on AFP b
33af0 65 63 61 75 73 65 20 74 68 65 20 41 46 50 20 63  ecause the AFP c
33b00 6c 69 65 6e 74 20 64 69 73 61 62 6c 65 73 0a 2a  lient disables.*
33b10 2a 20 74 68 65 20 72 65 61 64 20 63 61 63 68 65  * the read cache
33b20 20 77 68 65 6e 20 62 79 74 65 2d 72 61 6e 67 65   when byte-range
33b30 20 6c 6f 63 6b 73 20 61 72 65 20 70 72 65 73 65   locks are prese
33b40 6e 74 2e 20 20 45 6e 61 62 6c 69 6e 67 20 74 68  nt.  Enabling th
33b50 65 20 72 65 61 64 0a 2a 2a 20 63 61 63 68 65 20  e read.** cache 
33b60 65 78 70 6f 73 65 73 20 61 20 63 61 63 68 65 20  exposes a cache 
33b70 63 6f 68 65 72 65 6e 63 79 20 70 72 6f 62 6c 65  coherency proble
33b80 6d 20 74 68 61 74 20 69 73 20 70 72 65 73 65 6e  m that is presen
33b90 74 20 6f 6e 20 61 6c 6c 20 4f 53 20 58 0a 2a 2a  t on all OS X.**
33ba0 20 73 75 70 70 6f 72 74 65 64 20 6e 65 74 77 6f   supported netwo
33bb0 72 6b 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e  rk file systems.
33bc0 20 20 4e 46 53 20 61 6e 64 20 41 46 50 20 62 6f    NFS and AFP bo
33bd0 74 68 20 6f 62 73 65 72 76 65 20 74 68 65 0a 2a  th observe the.*
33be0 2a 20 63 6c 6f 73 65 2d 74 6f 2d 6f 70 65 6e 20  * close-to-open 
33bf0 73 65 6d 61 6e 74 69 63 73 20 66 6f 72 20 65 6e  semantics for en
33c00 73 75 72 69 6e 67 20 63 61 63 68 65 20 63 6f 68  suring cache coh
33c10 65 72 65 6e 63 79 0a 2a 2a 20 5b 68 74 74 70 3a  erency.** [http:
33c20 2f 2f 6e 66 73 2e 73 6f 75 72 63 65 66 6f 72 67  //nfs.sourceforg
33c30 65 2e 6e 65 74 2f 23 66 61 71 5f 61 38 5d 2c 20  e.net/#faq_a8], 
33c40 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 65  which does not e
33c50 66 66 65 63 74 69 76 65 6c 79 0a 2a 2a 20 61 64  ffectively.** ad
33c60 64 72 65 73 73 20 74 68 65 20 72 65 71 75 69 72  dress the requir
33c70 65 6d 65 6e 74 73 20 66 6f 72 20 63 6f 6e 63 75  ements for concu
33c80 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 61  rrent database a
33c90 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c  ccess by multipl
33ca0 65 0a 2a 2a 20 72 65 61 64 65 72 73 20 61 6e 64  e.** readers and
33cb0 20 77 72 69 74 65 72 73 0a 2a 2a 20 5b 68 74 74   writers.** [htt
33cc0 70 3a 2f 2f 77 77 77 2e 6e 61 62 62 6c 65 2e 63  p://www.nabble.c
33cd0 6f 6d 2f 53 51 4c 69 74 65 2d 6f 6e 2d 4e 46 53  om/SQLite-on-NFS
33ce0 2d 63 61 63 68 65 2d 63 6f 68 65 72 65 6e 63 79  -cache-coherency
33cf0 2d 74 64 31 35 36 35 35 37 30 31 2e 68 74 6d 6c  -td15655701.html
33d00 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 64 64 72  ]..**.** To addr
33d10 65 73 73 20 74 68 65 20 70 65 72 66 6f 72 6d 61  ess the performa
33d20 6e 63 65 20 61 6e 64 20 63 61 63 68 65 20 63 6f  nce and cache co
33d30 68 65 72 65 6e 63 79 20 69 73 73 75 65 73 2c 20  herency issues, 
33d40 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69  proxy file locki
33d50 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 68  ng.** changes th
33d60 65 20 77 61 79 20 64 61 74 61 62 61 73 65 20 61  e way database a
33d70 63 63 65 73 73 20 69 73 20 63 6f 6e 74 72 6f 6c  ccess is control
33d80 6c 65 64 20 62 79 20 6c 69 6d 69 74 69 6e 67 20  led by limiting 
33d90 61 63 63 65 73 73 20 74 6f 20 61 0a 2a 2a 20 73  access to a.** s
33da0 69 6e 67 6c 65 20 68 6f 73 74 20 61 74 20 61 20  ingle host at a 
33db0 74 69 6d 65 20 61 6e 64 20 6d 6f 76 69 6e 67 20  time and moving 
33dc0 66 69 6c 65 20 6c 6f 63 6b 73 20 6f 66 66 20 6f  file locks off o
33dd0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
33de0 69 6c 65 0a 2a 2a 20 61 6e 64 20 6f 6e 74 6f 20  ile.** and onto 
33df0 61 20 70 72 6f 78 79 20 66 69 6c 65 20 6f 6e 20  a proxy file on 
33e00 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73  the local file s
33e10 79 73 74 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a  ystem.  .**.**.*
33e20 2a 20 55 73 69 6e 67 20 70 72 6f 78 79 20 6c 6f  * Using proxy lo
33e30 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  cks.** ---------
33e40 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 43  --------.**.** C
33e50 20 41 50 49 73 0a 2a 2a 0a 2a 2a 20 20 73 71 6c   APIs.**.**  sql
33e60 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
33e70 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51  l(db, dbname, SQ
33e80 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 45 54 5f 4c  LITE_FCNTL_SET_L
33e90 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a  OCKPROXYFILE,.**
33ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33eb0 20 20 20 20 20 20 20 3c 70 72 6f 78 79 5f 70 61         <proxy_pa
33ec0 74 68 3e 20 7c 20 22 3a 61 75 74 6f 3a 22 29 3b  th> | ":auto:");
33ed0 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  .**  sqlite3_fil
33ee0 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62  e_control(db, db
33ef0 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e  name, SQLITE_FCN
33f00 54 4c 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TL_GET_LOCKPROXY
33f10 46 49 4c 45 2c 0a 2a 2a 20 20 20 20 20 20 20 20  FILE,.**        
33f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
33f30 3c 70 72 6f 78 79 5f 70 61 74 68 3e 29 3b 0a 2a  <proxy_path>);.*
33f40 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 70 72 61 67  *.**.** SQL prag
33f50 6d 61 73 0a 2a 2a 0a 2a 2a 20 20 50 52 41 47 4d  mas.**.**  PRAGM
33f60 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63  A [database.]loc
33f70 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 3c 70 72  k_proxy_file=<pr
33f80 6f 78 79 5f 70 61 74 68 3e 20 7c 20 3a 61 75 74  oxy_path> | :aut
33f90 6f 3a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64  o:.**  PRAGMA [d
33fa0 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72  atabase.]lock_pr
33fb0 6f 78 79 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 53  oxy_file.**.** S
33fc0 70 65 63 69 66 79 69 6e 67 20 22 3a 61 75 74 6f  pecifying ":auto
33fd0 3a 22 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66  :" means that if
33fe0 20 74 68 65 72 65 20 69 73 20 61 20 63 6f 6e 63   there is a conc
33ff0 68 20 66 69 6c 65 20 77 69 74 68 20 61 20 6d 61  h file with a ma
34000 74 63 68 69 6e 67 0a 2a 2a 20 68 6f 73 74 20 49  tching.** host I
34010 44 20 69 6e 20 69 74 2c 20 74 68 65 20 70 72 6f  D in it, the pro
34020 78 79 20 70 61 74 68 20 69 6e 20 74 68 65 20 63  xy path in the c
34030 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62  onch file will b
34040 65 20 75 73 65 64 2c 20 6f 74 68 65 72 77 69 73  e used, otherwis
34050 65 0a 2a 2a 20 61 20 70 72 6f 78 79 20 70 61 74  e.** a proxy pat
34060 68 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 75  h based on the u
34070 73 65 72 27 73 20 74 65 6d 70 20 64 69 72 0a 2a  ser's temp dir.*
34080 2a 20 28 76 69 61 20 63 6f 6e 66 73 74 72 28 5f  * (via confstr(_
34090 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54  CS_DARWIN_USER_T
340a0 45 4d 50 5f 44 49 52 2c 2e 2e 2e 29 29 20 77 69  EMP_DIR,...)) wi
340b0 6c 6c 20 62 65 20 75 73 65 64 20 61 6e 64 20 74  ll be used and t
340c0 68 65 0a 2a 2a 20 61 63 74 75 61 6c 20 70 72 6f  he.** actual pro
340d0 78 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  xy file name is 
340e0 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74  generated from t
340f0 68 65 20 6e 61 6d 65 20 61 6e 64 20 70 61 74 68  he name and path
34100 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
34110 61 73 65 20 66 69 6c 65 2e 20 20 46 6f 72 20 65  ase file.  For e
34120 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
34130 20 20 20 20 46 6f 72 20 64 61 74 61 62 61 73 65      For database
34140 20 70 61 74 68 20 22 2f 55 73 65 72 73 2f 6d 65   path "/Users/me
34150 2f 66 6f 6f 2e 64 62 22 20 0a 2a 2a 20 20 20 20  /foo.db" .**    
34160 20 20 20 54 68 65 20 6c 6f 63 6b 20 70 61 74 68     The lock path
34170 20 77 69 6c 6c 20 62 65 20 22 3c 74 6d 70 64 69   will be "<tmpdi
34180 72 3e 2f 73 71 6c 69 74 65 70 6c 6f 63 6b 73 2f  r>/sqliteplocks/
34190 5f 55 73 65 72 73 5f 6d 65 5f 66 6f 6f 2e 64 62  _Users_me_foo.db
341a0 3a 61 75 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f  :auto:").**.** O
341b0 6e 63 65 20 61 20 6c 6f 63 6b 20 70 72 6f 78 79  nce a lock proxy
341c0 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 66   is configured f
341d0 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  or a database co
341e0 6e 6e 65 63 74 69 6f 6e 2c 20 69 74 20 63 61 6e  nnection, it can
341f0 20 6e 6f 74 0a 2a 2a 20 62 65 20 72 65 6d 6f 76   not.** be remov
34200 65 64 2c 20 68 6f 77 65 76 65 72 20 69 74 20 6d  ed, however it m
34210 61 79 20 62 65 20 73 77 69 74 63 68 65 64 20 74  ay be switched t
34220 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 72  o a different pr
34230 6f 78 79 20 70 61 74 68 20 76 69 61 0a 2a 2a 20  oxy path via.** 
34240 74 68 65 20 61 62 6f 76 65 20 41 50 49 73 20 28  the above APIs (
34250 61 73 73 75 6d 69 6e 67 20 74 68 65 20 63 6f 6e  assuming the con
34260 63 68 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 62  ch file is not b
34270 65 69 6e 67 20 68 65 6c 64 20 62 79 20 61 6e 6f  eing held by ano
34280 74 68 65 72 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  ther.** connecti
34290 6f 6e 20 6f 72 20 70 72 6f 63 65 73 73 29 2e 20  on or process). 
342a0 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77 20 70 72  .**.**.** How pr
342b0 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b  oxy locking work
342c0 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  s.** -----------
342d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a  ------------.**.
342e0 2a 2a 20 50 72 6f 78 79 20 66 69 6c 65 20 6c 6f  ** Proxy file lo
342f0 63 6b 69 6e 67 20 72 65 6c 69 65 73 20 70 72 69  cking relies pri
34300 6d 61 72 69 6c 79 20 6f 6e 20 74 77 6f 20 6e 65  marily on two ne
34310 77 20 73 75 70 70 6f 72 74 69 6e 67 20 66 69 6c  w supporting fil
34320 65 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  es: .**.**   *  
34330 63 6f 6e 63 68 20 66 69 6c 65 20 74 6f 20 6c 69  conch file to li
34340 6d 69 74 20 61 63 63 65 73 73 20 74 6f 20 74 68  mit access to th
34350 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
34360 74 6f 20 61 20 73 69 6e 67 6c 65 20 68 6f 73 74  to a single host
34370 0a 2a 2a 20 20 20 20 20 20 61 74 20 61 20 74 69  .**      at a ti
34380 6d 65 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 70 72  me.**.**   *  pr
34390 6f 78 79 20 66 69 6c 65 20 74 6f 20 61 63 74 20  oxy file to act 
343a0 61 73 20 61 20 70 72 6f 78 79 20 66 6f 72 20 74  as a proxy for t
343b0 68 65 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  he advisory lock
343c0 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 20 20  s normally.**   
343d0 20 20 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20     taken on the 
343e0 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 54  database.**.** T
343f0 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2d 20  he conch file - 
34400 74 6f 20 75 73 65 20 61 20 70 72 6f 78 79 20 66  to use a proxy f
34410 69 6c 65 2c 20 73 71 6c 69 74 65 20 6d 75 73 74  ile, sqlite must
34420 20 66 69 72 73 74 20 22 68 6f 6c 64 20 74 68 65   first "hold the
34430 20 63 6f 6e 63 68 22 0a 2a 2a 20 62 79 20 74 61   conch".** by ta
34440 6b 69 6e 67 20 61 6e 20 73 71 6c 69 74 65 2d 73  king an sqlite-s
34450 74 79 6c 65 20 73 68 61 72 65 64 20 6c 6f 63 6b  tyle shared lock
34460 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69   on the conch fi
34470 6c 65 2c 20 72 65 61 64 69 6e 67 20 74 68 65 0a  le, reading the.
34480 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 61 6e 64 20  ** contents and 
34490 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 68 6f  comparing the ho
344a0 73 74 27 73 20 75 6e 69 71 75 65 20 68 6f 73 74  st's unique host
344b0 20 49 44 20 28 73 65 65 20 62 65 6c 6f 77 29 20   ID (see below) 
344c0 61 6e 64 20 6c 6f 63 6b 0a 2a 2a 20 70 72 6f 78  and lock.** prox
344d0 79 20 70 61 74 68 20 61 67 61 69 6e 73 74 20 74  y path against t
344e0 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64  he values stored
344f0 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 2e 20 20   in the conch.  
34500 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69  The conch file i
34510 73 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74  s.** stored in t
34520 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72  he same director
34530 79 20 61 73 20 74 68 65 20 64 61 74 61 62 61 73  y as the databas
34540 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
34550 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 69 73 20 70  ile name.** is p
34560 61 74 74 65 72 6e 65 64 20 61 66 74 65 72 20 74  atterned after t
34570 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
34580 20 6e 61 6d 65 20 61 73 20 22 2e 3c 64 61 74 61   name as ".<data
34590 62 61 73 65 6e 61 6d 65 3e 2d 63 6f 6e 63 68 22  basename>-conch"
345a0 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 63  ..** If the conc
345b0 68 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  h file does not 
345c0 65 78 69 73 74 2c 20 6f 72 20 69 74 73 20 63 6f  exist, or its co
345d0 6e 74 65 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61  ntents do not ma
345e0 74 63 68 20 74 68 65 0a 2a 2a 20 68 6f 73 74 20  tch the.** host 
345f0 49 44 20 61 6e 64 2f 6f 72 20 70 72 6f 78 79 20  ID and/or proxy 
34600 70 61 74 68 2c 20 74 68 65 6e 20 74 68 65 20 6c  path, then the l
34610 6f 63 6b 20 69 73 20 65 73 63 61 6c 61 74 65 64  ock is escalated
34620 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65   to an exclusive
34630 0a 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 74 68 65  .** lock and the
34640 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74   conch file cont
34650 65 6e 74 73 20 69 73 20 75 70 64 61 74 65 64 20  ents is updated 
34660 77 69 74 68 20 74 68 65 20 68 6f 73 74 20 49 44  with the host ID
34670 20 61 6e 64 20 70 72 6f 78 79 0a 2a 2a 20 70 61   and proxy.** pa
34680 74 68 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  th and the lock 
34690 69 73 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f  is downgraded to
346a0 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61   a shared lock a
346b0 67 61 69 6e 2e 20 20 49 66 20 74 68 65 20 63 6f  gain.  If the co
346c0 6e 63 68 0a 2a 2a 20 69 73 20 68 65 6c 64 20 62  nch.** is held b
346d0 79 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  y another proces
346e0 73 20 28 77 69 74 68 20 61 20 73 68 61 72 65 64  s (with a shared
346f0 20 6c 6f 63 6b 29 2c 20 74 68 65 20 65 78 63 6c   lock), the excl
34700 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 77 69  usive lock.** wi
34710 6c 6c 20 66 61 69 6c 20 61 6e 64 20 53 51 4c 49  ll fail and SQLI
34720 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
34730 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ned..**.** The p
34740 72 6f 78 79 20 66 69 6c 65 20 2d 20 61 20 73 69  roxy file - a si
34750 6e 67 6c 65 2d 62 79 74 65 20 66 69 6c 65 20 75  ngle-byte file u
34760 73 65 64 20 66 6f 72 20 61 6c 6c 20 61 64 76 69  sed for all advi
34770 73 6f 72 79 20 66 69 6c 65 20 6c 6f 63 6b 73 0a  sory file locks.
34780 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 74 61 6b 65  ** normally take
34790 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
347a0 65 20 66 69 6c 65 2e 20 20 20 54 68 69 73 20 61  e file.   This a
347b0 6c 6c 6f 77 73 20 66 6f 72 20 73 61 66 65 20 73  llows for safe s
347c0 68 61 72 69 6e 67 0a 2a 2a 20 6f 66 20 74 68 65  haring.** of the
347d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
347e0 6f 72 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64  or multiple read
347f0 65 72 73 20 61 6e 64 20 77 72 69 74 65 72 73 20  ers and writers 
34800 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 68  on the same.** h
34810 6f 73 74 20 28 74 68 65 20 63 6f 6e 63 68 20 65  ost (the conch e
34820 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65 79  nsures that they
34830 20 61 6c 6c 20 75 73 65 20 74 68 65 20 73 61 6d   all use the sam
34840 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c  e local lock fil
34850 65 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 71 75 65 73  e)..**.** Reques
34860 74 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 70 72  ting the lock pr
34870 6f 78 79 20 64 6f 65 73 20 6e 6f 74 20 69 6d 6d  oxy does not imm
34880 65 64 69 61 74 65 6c 79 20 74 61 6b 65 20 74 68  ediately take th
34890 65 20 63 6f 6e 63 68 2c 20 69 74 20 69 73 0a 2a  e conch, it is.*
348a0 2a 20 6f 6e 6c 79 20 74 61 6b 65 6e 20 77 68 65  * only taken whe
348b0 6e 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75  n the first requ
348c0 65 73 74 20 74 6f 20 6c 6f 63 6b 20 64 61 74 61  est to lock data
348d0 62 61 73 65 20 66 69 6c 65 20 69 73 20 6d 61 64  base file is mad
348e0 65 2e 20 20 0a 2a 2a 20 54 68 69 73 20 6d 61 74  e.  .** This mat
348f0 63 68 65 73 20 74 68 65 20 73 65 6d 61 6e 74 69  ches the semanti
34900 63 73 20 6f 66 20 74 68 65 20 74 72 61 64 69 74  cs of the tradit
34910 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 62 65  ional locking be
34920 68 61 76 69 6f 72 2c 20 77 68 65 72 65 0a 2a 2a  havior, where.**
34930 20 6f 70 65 6e 69 6e 67 20 61 20 63 6f 6e 6e 65   opening a conne
34940 63 74 69 6f 6e 20 74 6f 20 61 20 64 61 74 61 62  ction to a datab
34950 61 73 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  ase file does no
34960 74 20 74 61 6b 65 20 61 20 6c 6f 63 6b 20 6f 6e  t take a lock on
34970 20 69 74 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72   it..** The shar
34980 65 64 20 6c 6f 63 6b 20 61 6e 64 20 61 6e 20 6f  ed lock and an o
34990 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  pen file descrip
349a0 74 6f 72 20 61 72 65 20 6d 61 69 6e 74 61 69 6e  tor are maintain
349b0 65 64 20 75 6e 74 69 6c 20 0a 2a 2a 20 74 68 65  ed until .** the
349c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74   connection to t
349d0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63  he database is c
349e0 6c 6f 73 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  losed. .**.** Th
349f0 65 20 70 72 6f 78 79 20 66 69 6c 65 20 61 6e 64  e proxy file and
34a00 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61   the lock file a
34a10 72 65 20 6e 65 76 65 72 20 64 65 6c 65 74 65 64  re never deleted
34a20 20 73 6f 20 74 68 65 79 20 6f 6e 6c 79 20 6e 65   so they only ne
34a30 65 64 0a 2a 2a 20 74 6f 20 62 65 20 63 72 65 61  ed.** to be crea
34a40 74 65 64 20 74 68 65 20 66 69 72 73 74 20 74 69  ted the first ti
34a50 6d 65 20 74 68 65 79 20 61 72 65 20 75 73 65 64  me they are used
34a60 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72  ..**.** Configur
34a70 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 0a 2a 2a  ation options.**
34a80 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
34a90 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53 51  ------.**.**  SQ
34aa0 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58  LITE_PREFER_PROX
34ab0 59 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20  Y_LOCKING.**.** 
34ac0 20 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66        Database f
34ad0 69 6c 65 73 20 61 63 63 65 73 73 65 64 20 6f 6e  iles accessed on
34ae0 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 20   non-local file 
34af0 73 79 73 74 65 6d 73 20 61 72 65 0a 2a 2a 20 20  systems are.**  
34b00 20 20 20 20 20 61 75 74 6f 6d 61 74 69 63 61 6c       automatical
34b10 6c 79 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  ly configured fo
34b20 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2c  r proxy locking,
34b30 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 72 65 0a   lock files are.
34b40 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 64 20 61  **       named a
34b50 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 75 73 69  utomatically usi
34b60 6e 67 20 74 68 65 20 73 61 6d 65 20 6c 6f 67 69  ng the same logi
34b70 63 20 61 73 0a 2a 2a 20 20 20 20 20 20 20 50 52  c as.**       PR
34b80 41 47 4d 41 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f  AGMA lock_proxy_
34b90 66 69 6c 65 3d 22 3a 61 75 74 6f 3a 22 0a 2a 2a  file=":auto:".**
34ba0 20 20 20 20 0a 2a 2a 20 20 53 51 4c 49 54 45 5f      .**  SQLITE_
34bb0 50 52 4f 58 59 5f 44 45 42 55 47 0a 2a 2a 0a 2a  PROXY_DEBUG.**.*
34bc0 2a 20 20 20 20 20 20 20 45 6e 61 62 6c 65 73 20  *       Enables 
34bd0 74 68 65 20 6c 6f 67 67 69 6e 67 20 6f 66 20 65  the logging of e
34be0 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 64 75  rror messages du
34bf0 72 69 6e 67 20 68 6f 73 74 20 69 64 20 66 69 6c  ring host id fil
34c00 65 0a 2a 2a 20 20 20 20 20 20 20 72 65 74 72 69  e.**       retri
34c10 65 76 61 6c 20 61 6e 64 20 63 72 65 61 74 69 6f  eval and creatio
34c20 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b 50 52 4f  n.**.**  LOCKPRO
34c30 58 59 44 49 52 0a 2a 2a 0a 2a 2a 20 20 20 20 20  XYDIR.**.**     
34c40 20 20 4f 76 65 72 72 69 64 65 73 20 74 68 65 20    Overrides the 
34c50 64 65 66 61 75 6c 74 20 64 69 72 65 63 74 6f 72  default director
34c60 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 20  y used for lock 
34c70 70 72 6f 78 79 20 66 69 6c 65 73 20 74 68 61 74  proxy files that
34c80 0a 2a 2a 20 20 20 20 20 20 20 61 72 65 20 6e 61  .**       are na
34c90 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  med automaticall
34ca0 79 20 76 69 61 20 74 68 65 20 22 3a 61 75 74 6f  y via the ":auto
34cb0 3a 22 20 73 65 74 74 69 6e 67 0a 2a 2a 0a 2a 2a  :" setting.**.**
34cc0 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54    SQLITE_DEFAULT
34cd0 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53  _PROXYDIR_PERMIS
34ce0 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 20 20  SIONS.**.**     
34cf0 20 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f    Permissions to
34d00 20 75 73 65 20 77 68 65 6e 20 63 72 65 61 74 69   use when creati
34d10 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79 20 66  ng a directory f
34d20 6f 72 20 73 74 6f 72 69 6e 67 20 74 68 65 0a 2a  or storing the.*
34d30 2a 20 20 20 20 20 20 20 6c 6f 63 6b 20 70 72 6f  *       lock pro
34d40 78 79 20 66 69 6c 65 73 2c 20 6f 6e 6c 79 20 75  xy files, only u
34d50 73 65 64 20 77 68 65 6e 20 4c 4f 43 4b 50 52 4f  sed when LOCKPRO
34d60 58 59 44 49 52 20 69 73 20 6e 6f 74 20 73 65 74  XYDIR is not set
34d70 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 20 20 0a  ..**    .**    .
34d80 2a 2a 20 41 73 20 6d 65 6e 74 69 6f 6e 65 64 20  ** As mentioned 
34d90 61 62 6f 76 65 2c 20 77 68 65 6e 20 63 6f 6d 70  above, when comp
34da0 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54 45  iled with SQLITE
34db0 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f  _PREFER_PROXY_LO
34dc0 43 4b 49 4e 47 2c 0a 2a 2a 20 73 65 74 74 69 6e  CKING,.** settin
34dd0 67 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e  g the environmen
34de0 74 20 76 61 72 69 61 62 6c 65 20 53 51 4c 49 54  t variable SQLIT
34df0 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f  E_FORCE_PROXY_LO
34e00 43 4b 49 4e 47 20 74 6f 20 31 20 77 69 6c 6c 0a  CKING to 1 will.
34e10 2a 2a 20 66 6f 72 63 65 20 70 72 6f 78 79 20 6c  ** force proxy l
34e20 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 75 73 65  ocking to be use
34e30 64 20 66 6f 72 20 65 76 65 72 79 20 64 61 74 61  d for every data
34e40 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 65 64  base file opened
34e50 2c 20 61 6e 64 20 30 0a 2a 2a 20 77 69 6c 6c 20  , and 0.** will 
34e60 66 6f 72 63 65 20 61 75 74 6f 6d 61 74 69 63 20  force automatic 
34e70 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f  proxy locking to
34e80 20 62 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72   be disabled for
34e90 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a   all database.**
34ea0 20 66 69 6c 65 73 20 28 65 78 70 6c 69 63 69 74   files (explicit
34eb0 6c 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 53  ly calling the S
34ec0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 45 54 5f  QLITE_FCNTL_SET_
34ed0 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20 70 72  LOCKPROXYFILE pr
34ee0 61 67 6d 61 20 6f 72 0a 2a 2a 20 73 71 6c 69 74  agma or.** sqlit
34ef0 65 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 41  e_file_control A
34f00 50 49 20 69 73 20 6e 6f 74 20 61 66 66 65 63 74  PI is not affect
34f10 65 64 20 62 79 20 53 51 4c 49 54 45 5f 46 4f 52  ed by SQLITE_FOR
34f20 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  CE_PROXY_LOCKING
34f30 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f  )..*/../*.** Pro
34f40 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e  xy locking is on
34f50 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ly available on 
34f60 4d 61 63 4f 53 58 20 0a 2a 2f 0a 23 69 66 20 64  MacOSX .*/.#if d
34f70 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
34f80 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
34f90 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
34fa0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78  ../*.** The prox
34fb0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
34fc0 68 61 73 20 74 68 65 20 70 61 74 68 20 61 6e 64  has the path and
34fd0 20 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 73   file structures
34fe0 20 66 6f 72 20 74 68 65 20 72 65 6d 6f 74 65 20   for the remote 
34ff0 0a 2a 2a 20 61 6e 64 20 6c 6f 63 61 6c 20 70 72  .** and local pr
35000 6f 78 79 20 66 69 6c 65 73 20 69 6e 20 69 74 0a  oxy files in it.
35010 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
35020 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f  t proxyLockingCo
35030 6e 74 65 78 74 20 70 72 6f 78 79 4c 6f 63 6b 69  ntext proxyLocki
35040 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63  ngContext;.struc
35050 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f  t proxyLockingCo
35060 6e 74 65 78 74 20 7b 0a 20 20 75 6e 69 78 46 69  ntext {.  unixFi
35070 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 3b 20 20  le *conchFile;  
35080 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63         /* Open c
35090 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 63  onch file */.  c
350a0 68 61 72 20 2a 63 6f 6e 63 68 46 69 6c 65 50 61  har *conchFilePa
350b0 74 68 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  th;         /* N
350c0 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68  ame of the conch
350d0 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46   file */.  unixF
350e0 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79 3b 20  ile *lockProxy; 
350f0 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
35100 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20  proxy lock file 
35110 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 6f 63 6b 50  */.  char *lockP
35120 72 6f 78 79 50 61 74 68 3b 20 20 20 20 20 20 20  roxyPath;       
35130 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
35140 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65   proxy lock file
35150 20 2a 2f 0a 20 20 63 68 61 72 20 2a 64 62 50 61   */.  char *dbPa
35160 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
35170 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
35180 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 20  e open file */. 
35190 20 69 6e 74 20 63 6f 6e 63 68 48 65 6c 64 3b 20   int conchHeld; 
351a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
351b0 20 31 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20   1 if the conch 
351c0 69 73 20 68 65 6c 64 2c 20 2d 31 20 69 66 20 6c  is held, -1 if l
351d0 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 69 6e 74  ockless */.  int
351e0 20 6e 46 61 69 6c 73 3b 20 20 20 20 20 20 20 20   nFails;        
351f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
35200 62 65 72 20 6f 66 20 63 6f 6e 63 68 20 74 61 6b  ber of conch tak
35210 69 6e 67 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a  ing failures */.
35220 20 20 76 6f 69 64 20 2a 6f 6c 64 4c 6f 63 6b 69    void *oldLocki
35230 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 2f  ngContext;     /
35240 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69  * Original locki
35250 6e 67 63 6f 6e 74 65 78 74 20 74 6f 20 72 65 73  ngcontext to res
35260 74 6f 72 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f  tore on close */
35270 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  .  sqlite3_io_me
35280 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4f 6c  thods const *pOl
35290 64 4d 65 74 68 6f 64 3b 20 20 20 20 20 2f 2a 20  dMethod;     /* 
352a0 4f 72 69 67 69 6e 61 6c 20 49 2f 4f 20 6d 65 74  Original I/O met
352b0 68 6f 64 73 20 66 6f 72 20 63 6c 6f 73 65 20 2a  hods for close *
352c0 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65  /.};../* .** The
352d0 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65   proxy lock file
352e0 20 70 61 74 68 20 66 6f 72 20 74 68 65 20 64 61   path for the da
352f0 74 61 62 61 73 65 20 61 74 20 64 62 50 61 74 68  tabase at dbPath
35300 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
35310 20 6c 50 61 74 68 2c 20 0a 2a 2a 20 77 68 69 63   lPath, .** whic
35320 68 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  h must point to 
35330 76 61 6c 69 64 2c 20 77 72 69 74 61 62 6c 65 20  valid, writable 
35340 6d 65 6d 6f 72 79 20 6c 61 72 67 65 20 65 6e 6f  memory large eno
35350 75 67 68 20 66 6f 72 20 61 20 6d 61 78 4c 65 6e  ugh for a maxLen
35360 20 6c 65 6e 67 74 68 0a 2a 2a 20 66 69 6c 65 20   length.** file 
35370 70 61 74 68 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  path. .*/.static
35380 20 69 6e 74 20 70 72 6f 78 79 47 65 74 4c 6f 63   int proxyGetLoc
35390 6b 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61 72  kPath(const char
353a0 20 2a 64 62 50 61 74 68 2c 20 63 68 61 72 20 2a   *dbPath, char *
353b0 6c 50 61 74 68 2c 20 73 69 7a 65 5f 74 20 6d 61  lPath, size_t ma
353c0 78 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 6c 65 6e  xLen){.  int len
353d0 3b 0a 20 20 69 6e 74 20 64 62 4c 65 6e 3b 0a 20  ;.  int dbLen;. 
353e0 20 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66 20   int i;..#ifdef 
353f0 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a 20 20 6c  LOCKPROXYDIR.  l
35400 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50 61  en = strlcpy(lPa
35410 74 68 2c 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52  th, LOCKPROXYDIR
35420 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 65 6c 73 65  , maxLen);.#else
35430 0a 23 20 69 66 64 65 66 20 5f 43 53 5f 44 41 52  .# ifdef _CS_DAR
35440 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49  WIN_USER_TEMP_DI
35450 52 0a 20 20 7b 0a 20 20 20 20 69 66 28 20 21 63  R.  {.    if( !c
35460 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49  onfstr(_CS_DARWI
35470 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c  N_USER_TEMP_DIR,
35480 20 6c 50 61 74 68 2c 20 6d 61 78 4c 65 6e 29 20   lPath, maxLen) 
35490 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
354a0 28 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20  (("GETLOCKPATH  
354b0 66 61 69 6c 65 64 20 25 73 20 65 72 72 6e 6f 3d  failed %s errno=
354c0 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20  %d pid=%d\n",.  
354d0 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 50 61               lPa
354e0 74 68 2c 20 65 72 72 6e 6f 2c 20 6f 73 47 65 74  th, errno, osGet
354f0 70 69 64 28 30 29 29 29 3b 0a 20 20 20 20 20 20  pid(0)));.      
35500 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
35510 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a  ERR_LOCK;.    }.
35520 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61      len = strlca
35530 74 28 6c 50 61 74 68 2c 20 22 73 71 6c 69 74 65  t(lPath, "sqlite
35540 70 6c 6f 63 6b 73 22 2c 20 6d 61 78 4c 65 6e 29  plocks", maxLen)
35550 3b 20 20 20 20 0a 20 20 7d 0a 23 20 65 6c 73 65  ;    .  }.# else
35560 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79  .  len = strlcpy
35570 28 6c 50 61 74 68 2c 20 22 2f 74 6d 70 2f 22 2c  (lPath, "/tmp/",
35580 20 6d 61 78 4c 65 6e 29 3b 0a 23 20 65 6e 64 69   maxLen);.# endi
35590 66 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  f.#endif..  if( 
355a0 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d 21 3d 27 2f  lPath[len-1]!='/
355b0 27 20 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 73  ' ){.    len = s
355c0 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 2f  trlcat(lPath, "/
355d0 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 7d 0a  ", maxLen);.  }.
355e0 20 20 0a 20 20 2f 2a 20 74 72 61 6e 73 66 6f 72    .  /* transfor
355f0 6d 20 74 68 65 20 64 62 20 70 61 74 68 20 74 6f  m the db path to
35600 20 61 20 75 6e 69 71 75 65 20 63 61 63 68 65 20   a unique cache 
35610 6e 61 6d 65 20 2a 2f 0a 20 20 64 62 4c 65 6e 20  name */.  dbLen 
35620 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 64 62  = (int)strlen(db
35630 50 61 74 68 29 3b 0a 20 20 66 6f 72 28 20 69 3d  Path);.  for( i=
35640 30 3b 20 69 3c 64 62 4c 65 6e 20 26 26 20 28 69  0; i<dbLen && (i
35650 2b 6c 65 6e 2b 37 29 3c 28 69 6e 74 29 6d 61 78  +len+7)<(int)max
35660 4c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  Len; i++){.    c
35670 68 61 72 20 63 20 3d 20 64 62 50 61 74 68 5b 69  har c = dbPath[i
35680 5d 3b 0a 20 20 20 20 6c 50 61 74 68 5b 69 2b 6c  ];.    lPath[i+l
35690 65 6e 5d 20 3d 20 28 63 3d 3d 27 2f 27 29 3f 27  en] = (c=='/')?'
356a0 5f 27 3a 63 3b 0a 20 20 7d 0a 20 20 6c 50 61 74  _':c;.  }.  lPat
356b0 68 5b 69 2b 6c 65 6e 5d 3d 27 5c 30 27 3b 0a 20  h[i+len]='\0';. 
356c0 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20   strlcat(lPath, 
356d0 22 3a 61 75 74 6f 3a 22 2c 20 6d 61 78 4c 65 6e  ":auto:", maxLen
356e0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 47  );.  OSTRACE(("G
356f0 45 54 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f 78  ETLOCKPATH  prox
35700 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70  y lock path=%s p
35710 69 64 3d 25 64 5c 6e 22 2c 20 6c 50 61 74 68 2c  id=%d\n", lPath,
35720 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a   osGetpid(0)));.
35730 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
35740 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a 20 43  OK;.}../* . ** C
35750 72 65 61 74 65 73 20 74 68 65 20 6c 6f 63 6b 20  reates the lock 
35760 66 69 6c 65 20 61 6e 64 20 61 6e 79 20 6d 69 73  file and any mis
35770 73 69 6e 67 20 64 69 72 65 63 74 6f 72 69 65 73  sing directories
35780 20 69 6e 20 6c 6f 63 6b 50 61 74 68 0a 20 2a 2f   in lockPath. */
35790 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
357a0 79 43 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28  yCreateLockPath(
357b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 6f 63 6b  const char *lock
357c0 50 61 74 68 29 7b 0a 20 20 69 6e 74 20 69 2c 20  Path){.  int i, 
357d0 6c 65 6e 3b 0a 20 20 63 68 61 72 20 62 75 66 5b  len;.  char buf[
357e0 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 69  MAXPATHLEN];.  i
357f0 6e 74 20 73 74 61 72 74 20 3d 20 30 3b 0a 20 20  nt start = 0;.  
35800 0a 20 20 61 73 73 65 72 74 28 6c 6f 63 6b 50 61  .  assert(lockPa
35810 74 68 21 3d 4e 55 4c 4c 29 3b 0a 20 20 2f 2a 20  th!=NULL);.  /* 
35820 74 72 79 20 74 6f 20 63 72 65 61 74 65 20 61 6c  try to create al
35830 6c 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61  l the intermedia
35840 74 65 20 64 69 72 65 63 74 6f 72 69 65 73 20 2a  te directories *
35850 2f 0a 20 20 6c 65 6e 20 3d 20 28 69 6e 74 29 73  /.  len = (int)s
35860 74 72 6c 65 6e 28 6c 6f 63 6b 50 61 74 68 29 3b  trlen(lockPath);
35870 0a 20 20 62 75 66 5b 30 5d 20 3d 20 6c 6f 63 6b  .  buf[0] = lock
35880 50 61 74 68 5b 30 5d 3b 0a 20 20 66 6f 72 28 20  Path[0];.  for( 
35890 69 3d 31 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 20  i=1; i<len; i++ 
358a0 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50  ){.    if( lockP
358b0 61 74 68 5b 69 5d 20 3d 3d 20 27 2f 27 20 26 26  ath[i] == '/' &&
358c0 20 28 69 20 2d 20 73 74 61 72 74 20 3e 20 30 29   (i - start > 0)
358d0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 6e 6c   ){.      /* onl
358e0 79 20 6d 6b 64 69 72 20 69 66 20 6c 65 61 66 20  y mkdir if leaf 
358f0 64 69 72 20 21 3d 20 22 2e 22 20 6f 72 20 22 2f  dir != "." or "/
35900 22 20 6f 72 20 22 2e 2e 22 20 2a 2f 0a 20 20 20  " or ".." */.   
35910 20 20 20 69 66 28 20 69 2d 73 74 61 72 74 3e 32     if( i-start>2
35920 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d 31 20   || (i-start==1 
35930 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d  && buf[start] !=
35940 20 27 2e 27 20 26 26 20 62 75 66 5b 73 74 61 72   '.' && buf[star
35950 74 5d 20 21 3d 20 27 2f 27 29 20 0a 20 20 20 20  t] != '/') .    
35960 20 20 20 20 20 7c 7c 20 28 69 2d 73 74 61 72 74       || (i-start
35970 3d 3d 32 20 26 26 20 62 75 66 5b 73 74 61 72 74  ==2 && buf[start
35980 5d 20 21 3d 20 27 2e 27 20 26 26 20 62 75 66 5b  ] != '.' && buf[
35990 73 74 61 72 74 2b 31 5d 20 21 3d 20 27 2e 27 29  start+1] != '.')
359a0 20 29 7b 0a 20 20 20 20 20 20 20 20 62 75 66 5b   ){.        buf[
359b0 69 5d 3d 27 5c 30 27 3b 0a 20 20 20 20 20 20 20  i]='\0';.       
359c0 20 69 66 28 20 6f 73 4d 6b 64 69 72 28 62 75 66   if( osMkdir(buf
359d0 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
359e0 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53  _PROXYDIR_PERMIS
359f0 53 49 4f 4e 53 29 20 29 7b 0a 20 20 20 20 20 20  SIONS) ){.      
35a00 20 20 20 20 69 6e 74 20 65 72 72 3d 65 72 72 6e      int err=errn
35a10 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  o;.          if(
35a20 20 65 72 72 21 3d 45 45 58 49 53 54 20 29 20 7b   err!=EEXIST ) {
35a30 0a 20 20 20 20 20 20 20 20 20 20 20 20 4f 53 54  .            OST
35a40 52 41 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43  RACE(("CREATELOC
35a50 4b 50 41 54 48 20 20 46 41 49 4c 45 44 20 63 72  KPATH  FAILED cr
35a60 65 61 74 69 6e 67 20 25 73 2c 20 22 0a 20 20 20  eating %s, ".   
35a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35a80 20 20 22 27 25 73 27 20 70 72 6f 78 79 20 6c 6f    "'%s' proxy lo
35a90 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25  ck path=%s pid=%
35aa0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
35ab0 20 20 20 20 20 20 20 20 20 20 20 62 75 66 2c 20             buf, 
35ac0 73 74 72 65 72 72 6f 72 28 65 72 72 29 2c 20 6c  strerror(err), l
35ad0 6f 63 6b 50 61 74 68 2c 20 6f 73 47 65 74 70 69  ockPath, osGetpi
35ae0 64 28 30 29 29 29 3b 0a 20 20 20 20 20 20 20 20  d(0)));.        
35af0 20 20 20 20 72 65 74 75 72 6e 20 65 72 72 3b 0a      return err;.
35b00 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
35b10 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
35b20 20 20 20 20 73 74 61 72 74 3d 69 2b 31 3b 0a 20      start=i+1;. 
35b30 20 20 20 7d 0a 20 20 20 20 62 75 66 5b 69 5d 20     }.    buf[i] 
35b40 3d 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 3b 0a 20  = lockPath[i];. 
35b50 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43   }.  OSTRACE(("C
35b60 52 45 41 54 45 4c 4f 43 4b 50 41 54 48 20 20 70  REATELOCKPATH  p
35b70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25  roxy lock path=%
35b80 73 20 70 69 64 3d 25 64 5c 6e 22 2c 6c 6f 63 6b  s pid=%d\n",lock
35b90 50 61 74 68 2c 6f 73 47 65 74 70 69 64 28 30 29  Path,osGetpid(0)
35ba0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  ));.  return 0;.
35bb0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
35bc0 61 20 6e 65 77 20 56 46 53 20 66 69 6c 65 20 64  a new VFS file d
35bd0 65 73 63 72 69 70 74 6f 72 20 28 73 74 6f 72 65  escriptor (store
35be0 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  d in memory obta
35bf0 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c  ined from.** sql
35c00 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 61 6e 64  ite3_malloc) and
35c10 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 6e   open the file n
35c20 61 6d 65 64 20 22 70 61 74 68 22 20 69 6e 20 74  amed "path" in t
35c30 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
35c40 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  or..**.** The ca
35c50 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69  ller is responsi
35c60 62 6c 65 20 6e 6f 74 20 6f 6e 6c 79 20 66 6f 72  ble not only for
35c70 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 66 69 6c   closing the fil
35c80 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20  e descriptor.** 
35c90 62 75 74 20 61 6c 73 6f 20 66 6f 72 20 66 72 65  but also for fre
35ca0 65 69 6e 67 20 74 68 65 20 6d 65 6d 6f 72 79 20  eing the memory 
35cb0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
35cc0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
35cd0 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tor..*/.static i
35ce0 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65 55 6e  nt proxyCreateUn
35cf0 69 78 46 69 6c 65 28 0a 20 20 20 20 63 6f 6e 73  ixFile(.    cons
35d00 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 20 20  t char *path,   
35d10 20 20 20 20 20 2f 2a 20 70 61 74 68 20 66 6f 72       /* path for
35d20 20 74 68 65 20 6e 65 77 20 75 6e 69 78 46 69 6c   the new unixFil
35d30 65 20 2a 2f 0a 20 20 20 20 75 6e 69 78 46 69 6c  e */.    unixFil
35d40 65 20 2a 2a 70 70 46 69 6c 65 2c 20 20 20 20 20  e **ppFile,     
35d50 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65 20 63 72    /* unixFile cr
35d60 65 61 74 65 64 20 61 6e 64 20 72 65 74 75 72 6e  eated and return
35d70 65 64 20 62 79 20 72 65 66 20 2a 2f 0a 20 20 20  ed by ref */.   
35d80 20 69 6e 74 20 69 73 6c 6f 63 6b 66 69 6c 65 20   int islockfile 
35d90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20            /* if 
35da0 6e 6f 6e 20 7a 65 72 6f 20 6d 69 73 73 69 6e 67  non zero missing
35db0 20 64 69 72 73 20 77 69 6c 6c 20 62 65 20 63 72   dirs will be cr
35dc0 65 61 74 65 64 20 2a 2f 0a 29 20 7b 0a 20 20 69  eated */.) {.  i
35dd0 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 75 6e  nt fd = -1;.  un
35de0 69 78 46 69 6c 65 20 2a 70 4e 65 77 3b 0a 20 20  ixFile *pNew;.  
35df0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
35e00 4f 4b 3b 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c  OK;.  int openFl
35e10 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f  ags = O_RDWR | O
35e20 5f 43 52 45 41 54 3b 0a 20 20 73 71 6c 69 74 65  _CREAT;.  sqlite
35e30 33 5f 76 66 73 20 64 75 6d 6d 79 56 66 73 3b 0a  3_vfs dummyVfs;.
35e40 20 20 69 6e 74 20 74 65 72 72 6e 6f 20 3d 20 30    int terrno = 0
35e50 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  ;.  UnixUnusedFd
35e60 20 2a 70 55 6e 75 73 65 64 20 3d 20 4e 55 4c 4c   *pUnused = NULL
35e70 3b 0a 0a 20 20 2f 2a 20 31 2e 20 66 69 72 73 74  ;..  /* 1. first
35e80 20 74 72 79 20 74 6f 20 6f 70 65 6e 2f 63 72 65   try to open/cre
35e90 61 74 65 20 74 68 65 20 66 69 6c 65 0a 20 20 2a  ate the file.  *
35ea0 2a 20 32 2e 20 69 66 20 74 68 61 74 20 66 61 69  * 2. if that fai
35eb0 6c 73 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20  ls, and this is 
35ec0 61 20 6c 6f 63 6b 20 66 69 6c 65 20 28 6e 6f 74  a lock file (not
35ed0 2d 63 6f 6e 63 68 29 2c 20 74 72 79 20 63 72 65  -conch), try cre
35ee0 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 70  ating.  ** the p
35ef0 61 72 65 6e 74 20 64 69 72 65 63 74 6f 72 69 65  arent directorie
35f00 73 20 61 6e 64 20 74 68 65 6e 20 74 72 79 20 61  s and then try a
35f10 67 61 69 6e 2e 0a 20 20 2a 2a 20 33 2e 20 69 66  gain..  ** 3. if
35f20 20 74 68 61 74 20 66 61 69 6c 73 2c 20 74 72 79   that fails, try
35f30 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c   to open the fil
35f40 65 20 72 65 61 64 2d 6f 6e 6c 79 0a 20 20 2a 2a  e read-only.  **
35f50 20 6f 74 68 65 72 77 69 73 65 20 72 65 74 75 72   otherwise retur
35f60 6e 20 42 55 53 59 20 28 69 66 20 6c 6f 63 6b 20  n BUSY (if lock 
35f70 66 69 6c 65 29 20 6f 72 20 43 41 4e 54 4f 50 45  file) or CANTOPE
35f80 4e 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20  N for the conch 
35f90 66 69 6c 65 0a 20 20 2a 2f 0a 20 20 70 55 6e 75  file.  */.  pUnu
35fa0 73 65 64 20 3d 20 66 69 6e 64 52 65 75 73 61 62  sed = findReusab
35fb0 6c 65 46 64 28 70 61 74 68 2c 20 6f 70 65 6e 46  leFd(path, openF
35fc0 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 70 55 6e  lags);.  if( pUn
35fd0 75 73 65 64 20 29 7b 0a 20 20 20 20 66 64 20 3d  used ){.    fd =
35fe0 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20   pUnused->fd;.  
35ff0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 55 6e 75 73  }else{.    pUnus
36000 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ed = sqlite3_mal
36010 6c 6f 63 36 34 28 73 69 7a 65 6f 66 28 2a 70 55  loc64(sizeof(*pU
36020 6e 75 73 65 64 29 29 3b 0a 20 20 20 20 69 66 28  nused));.    if(
36030 20 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20   !pUnused ){.   
36040 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
36050 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
36060 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a  }.  if( fd<0 ){.
36070 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f      fd = robust_
36080 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46  open(path, openF
36090 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 74 65  lags, 0);.    te
360a0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
360b0 20 20 69 66 28 20 66 64 3c 30 20 26 26 20 65 72    if( fd<0 && er
360c0 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 26 26 20 69  rno==ENOENT && i
360d0 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20  slockfile ){.   
360e0 20 20 20 69 66 28 20 70 72 6f 78 79 43 72 65 61     if( proxyCrea
360f0 74 65 4c 6f 63 6b 50 61 74 68 28 70 61 74 68 29  teLockPath(path)
36100 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b   == SQLITE_OK ){
36110 0a 20 20 20 20 20 20 20 20 66 64 20 3d 20 72 6f  .        fd = ro
36120 62 75 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20  bust_open(path, 
36130 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20  openFlags, 0);. 
36140 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
36150 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20  .  if( fd<0 ){. 
36160 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f     openFlags = O
36170 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 66 64 20  _RDONLY;.    fd 
36180 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61  = robust_open(pa
36190 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 30  th, openFlags, 0
361a0 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d 20  );.    terrno = 
361b0 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20 69 66 28  errno;.  }.  if(
361c0 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 69 66 28   fd<0 ){.    if(
361d0 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20   islockfile ){. 
361e0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
361f0 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20  TE_BUSY;.    }. 
36200 20 20 20 73 77 69 74 63 68 20 28 74 65 72 72 6e     switch (terrn
36210 6f 29 20 7b 0a 20 20 20 20 20 20 63 61 73 65 20  o) {.      case 
36220 45 41 43 43 45 53 3a 0a 20 20 20 20 20 20 20 20  EACCES:.        
36230 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45  return SQLITE_PE
36240 52 4d 3b 0a 20 20 20 20 20 20 63 61 73 65 20 45  RM;.      case E
36250 49 4f 3a 20 0a 20 20 20 20 20 20 20 20 72 65 74  IO: .        ret
36260 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
36270 5f 4c 4f 43 4b 3b 20 2f 2a 20 65 76 65 6e 20 74  _LOCK; /* even t
36280 68 6f 75 67 68 20 69 74 20 69 73 20 74 68 65 20  hough it is the 
36290 63 6f 6e 63 68 20 2a 2f 0a 20 20 20 20 20 20 64  conch */.      d
362a0 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20  efault:.        
362b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
362c0 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20  NTOPEN_BKPT;.   
362d0 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 70 4e 65 77   }.  }.  .  pNew
362e0 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 73   = (unixFile *)s
362f0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
36300 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a  sizeof(*pNew));.
36310 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c    if( pNew==NULL
36320 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
36330 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67  ITE_NOMEM;.    g
36340 6f 74 6f 20 65 6e 64 5f 63 72 65 61 74 65 5f 70  oto end_create_p
36350 72 6f 78 79 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  roxy;.  }.  mems
36360 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65  et(pNew, 0, size
36370 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20  of(unixFile));. 
36380 20 70 4e 65 77 2d 3e 6f 70 65 6e 46 6c 61 67 73   pNew->openFlags
36390 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20   = openFlags;.  
363a0 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 56 66 73  memset(&dummyVfs
363b0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d  , 0, sizeof(dumm
363c0 79 56 66 73 29 29 3b 0a 20 20 64 75 6d 6d 79 56  yVfs));.  dummyV
363d0 66 73 2e 70 41 70 70 44 61 74 61 20 3d 20 28 76  fs.pAppData = (v
363e0 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f  oid*)&autolockIo
363f0 46 69 6e 64 65 72 3b 0a 20 20 64 75 6d 6d 79 56  Finder;.  dummyV
36400 66 73 2e 7a 4e 61 6d 65 20 3d 20 22 64 75 6d 6d  fs.zName = "dumm
36410 79 22 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66  y";.  pUnused->f
36420 64 20 3d 20 66 64 3b 0a 20 20 70 55 6e 75 73 65  d = fd;.  pUnuse
36430 64 2d 3e 66 6c 61 67 73 20 3d 20 6f 70 65 6e 46  d->flags = openF
36440 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 70 55  lags;.  pNew->pU
36450 6e 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64 3b  nused = pUnused;
36460 0a 20 20 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49  .  .  rc = fillI
36470 6e 55 6e 69 78 46 69 6c 65 28 26 64 75 6d 6d 79  nUnixFile(&dummy
36480 56 66 73 2c 20 66 64 2c 20 28 73 71 6c 69 74 65  Vfs, fd, (sqlite
36490 33 5f 66 69 6c 65 2a 29 70 4e 65 77 2c 20 70 61  3_file*)pNew, pa
364a0 74 68 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  th, 0);.  if( rc
364b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
364c0 20 20 20 2a 70 70 46 69 6c 65 20 3d 20 70 4e 65     *ppFile = pNe
364d0 77 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  w;.    return SQ
364e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 65 6e 64  LITE_OK;.  }.end
364f0 5f 63 72 65 61 74 65 5f 70 72 6f 78 79 3a 20 20  _create_proxy:  
36500 20 20 0a 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73    .  robust_clos
36510 65 28 70 4e 65 77 2c 20 66 64 2c 20 5f 5f 4c 49  e(pNew, fd, __LI
36520 4e 45 5f 5f 29 3b 0a 20 20 73 71 6c 69 74 65 33  NE__);.  sqlite3
36530 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 73  _free(pNew);.  s
36540 71 6c 69 74 65 33 5f 66 72 65 65 28 70 55 6e 75  qlite3_free(pUnu
36550 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  sed);.  return r
36560 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
36570 49 54 45 5f 54 45 53 54 0a 2f 2a 20 73 69 6d 75  ITE_TEST./* simu
36580 6c 61 74 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f  late multiple ho
36590 73 74 73 20 62 79 20 63 72 65 61 74 69 6e 67 20  sts by creating 
365a0 75 6e 69 71 75 65 20 68 6f 73 74 69 64 20 66 69  unique hostid fi
365b0 6c 65 20 70 61 74 68 73 20 2a 2f 0a 69 6e 74 20  le paths */.int 
365c0 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e  sqlite3_hostid_n
365d0 75 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  um = 0;.#endif..
365e0 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 48 4f  #define PROXY_HO
365f0 53 54 49 44 4c 45 4e 20 20 20 20 31 36 20 20 2f  STIDLEN    16  /
36600 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 68 6f 73  * conch file hos
36610 74 20 69 64 20 6c 65 6e 67 74 68 20 2a 2f 0a 0a  t id length */..
36620 23 69 66 64 65 66 20 48 41 56 45 5f 47 45 54 48  #ifdef HAVE_GETH
36630 4f 53 54 55 55 49 44 0a 2f 2a 20 4e 6f 74 20 61  OSTUUID./* Not a
36640 6c 77 61 79 73 20 64 65 66 69 6e 65 64 20 69 6e  lways defined in
36650 20 74 68 65 20 68 65 61 64 65 72 73 20 61 73 20   the headers as 
36660 69 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20 2a  it ought to be *
36670 2f 0a 65 78 74 65 72 6e 20 69 6e 74 20 67 65 74  /.extern int get
36680 68 6f 73 74 75 75 69 64 28 75 75 69 64 5f 74 20  hostuuid(uuid_t 
36690 69 64 2c 20 63 6f 6e 73 74 20 73 74 72 75 63 74  id, const struct
366a0 20 74 69 6d 65 73 70 65 63 20 2a 77 61 69 74 29   timespec *wait)
366b0 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 67 65 74  ;.#endif../* get
366c0 20 74 68 65 20 68 6f 73 74 20 49 44 20 76 69 61   the host ID via
366d0 20 67 65 74 68 6f 73 74 75 75 69 64 28 29 2c 20   gethostuuid(), 
366e0 70 48 6f 73 74 49 44 20 6d 75 73 74 20 70 6f 69  pHostID must poi
366f0 6e 74 20 74 6f 20 50 52 4f 58 59 5f 48 4f 53 54  nt to PROXY_HOST
36700 49 44 4c 45 4e 20 0a 2a 2a 20 62 79 74 65 73 20  IDLEN .** bytes 
36710 6f 66 20 77 72 69 74 61 62 6c 65 20 6d 65 6d 6f  of writable memo
36720 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
36730 74 20 70 72 6f 78 79 47 65 74 48 6f 73 74 49 44  t proxyGetHostID
36740 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
36750 70 48 6f 73 74 49 44 2c 20 69 6e 74 20 2a 70 45  pHostID, int *pE
36760 72 72 6f 72 29 7b 0a 20 20 61 73 73 65 72 74 28  rror){.  assert(
36770 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20  PROXY_HOSTIDLEN 
36780 3d 3d 20 73 69 7a 65 6f 66 28 75 75 69 64 5f 74  == sizeof(uuid_t
36790 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 48 6f  ));.  memset(pHo
367a0 73 74 49 44 2c 20 30 2c 20 50 52 4f 58 59 5f 48  stID, 0, PROXY_H
367b0 4f 53 54 49 44 4c 45 4e 29 3b 0a 23 69 66 64 65  OSTIDLEN);.#ifde
367c0 66 20 48 41 56 45 5f 47 45 54 48 4f 53 54 55 55  f HAVE_GETHOSTUU
367d0 49 44 0a 20 20 7b 0a 20 20 20 20 73 74 72 75 63  ID.  {.    struc
367e0 74 20 74 69 6d 65 73 70 65 63 20 74 69 6d 65 6f  t timespec timeo
367f0 75 74 20 3d 20 7b 31 2c 20 30 7d 3b 20 2f 2a 20  ut = {1, 0}; /* 
36800 31 20 73 65 63 20 74 69 6d 65 6f 75 74 20 2a 2f  1 sec timeout */
36810 0a 20 20 20 20 69 66 28 20 67 65 74 68 6f 73 74  .    if( gethost
36820 75 75 69 64 28 70 48 6f 73 74 49 44 2c 20 26 74  uuid(pHostID, &t
36830 69 6d 65 6f 75 74 29 20 29 7b 0a 20 20 20 20 20  imeout) ){.     
36840 20 69 6e 74 20 65 72 72 20 3d 20 65 72 72 6e 6f   int err = errno
36850 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 72 72  ;.      if( pErr
36860 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  or ){.        *p
36870 45 72 72 6f 72 20 3d 20 65 72 72 3b 0a 20 20 20  Error = err;.   
36880 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
36890 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
368a0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a      }.  }.#else.
368b0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
368c0 45 52 28 70 45 72 72 6f 72 29 3b 0a 23 65 6e 64  ER(pError);.#end
368d0 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
368e0 5f 54 45 53 54 0a 20 20 2f 2a 20 73 69 6d 75 6c  _TEST.  /* simul
368f0 61 74 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73  ate multiple hos
36900 74 73 20 62 79 20 63 72 65 61 74 69 6e 67 20 75  ts by creating u
36910 6e 69 71 75 65 20 68 6f 73 74 69 64 20 66 69 6c  nique hostid fil
36920 65 20 70 61 74 68 73 20 2a 2f 0a 20 20 69 66 28  e paths */.  if(
36930 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f   sqlite3_hostid_
36940 6e 75 6d 20 21 3d 20 30 29 7b 0a 20 20 20 20 70  num != 0){.    p
36950 48 6f 73 74 49 44 5b 30 5d 20 3d 20 28 63 68 61  HostID[0] = (cha
36960 72 29 28 70 48 6f 73 74 49 44 5b 30 5d 20 2b 20  r)(pHostID[0] + 
36970 28 63 68 61 72 29 28 73 71 6c 69 74 65 33 5f 68  (char)(sqlite3_h
36980 6f 73 74 69 64 5f 6e 75 6d 20 26 20 30 78 46 46  ostid_num & 0xFF
36990 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ));.  }.#endif. 
369a0 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54   .  return SQLIT
369b0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20  E_OK;.}../* The 
369c0 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74 61  conch file conta
369d0 69 6e 73 20 74 68 65 20 68 65 61 64 65 72 2c 20  ins the header, 
369e0 68 6f 73 74 20 69 64 20 61 6e 64 20 6c 6f 63 6b  host id and lock
369f0 20 66 69 6c 65 20 70 61 74 68 0a 20 2a 2f 0a 23   file path. */.#
36a00 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 43 4f 4e  define PROXY_CON
36a10 43 48 56 45 52 53 49 4f 4e 20 32 20 20 20 2f 2a  CHVERSION 2   /*
36a20 20 31 2d 62 79 74 65 20 68 65 61 64 65 72 2c 20   1-byte header, 
36a30 31 36 2d 62 79 74 65 20 68 6f 73 74 20 69 64 2c  16-byte host id,
36a40 20 70 61 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65   path */.#define
36a50 20 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e   PROXY_HEADERLEN
36a60 20 20 20 20 31 20 20 20 2f 2a 20 63 6f 6e 63 68      1   /* conch
36a70 20 66 69 6c 65 20 68 65 61 64 65 72 20 6c 65 6e   file header len
36a80 67 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  gth */.#define P
36a90 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20 20  ROXY_PATHINDEX  
36aa0 20 20 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c    (PROXY_HEADERL
36ab0 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c  EN+PROXY_HOSTIDL
36ac0 45 4e 29 0a 23 64 65 66 69 6e 65 20 50 52 4f 58  EN).#define PROX
36ad0 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 20 20 28  Y_MAXCONCHLEN  (
36ae0 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b  PROXY_HEADERLEN+
36af0 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 2b  PROXY_HOSTIDLEN+
36b00 4d 41 58 50 41 54 48 4c 45 4e 29 0a 0a 2f 2a 20  MAXPATHLEN)../* 
36b10 0a 2a 2a 20 54 61 6b 65 73 20 61 6e 20 6f 70 65  .** Takes an ope
36b20 6e 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 63 6f  n conch file, co
36b30 70 69 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74  pies the content
36b40 73 20 74 6f 20 61 20 6e 65 77 20 70 61 74 68 20  s to a new path 
36b50 61 6e 64 20 74 68 65 6e 20 6d 6f 76 65 73 20 0a  and then moves .
36b60 2a 2a 20 69 74 20 62 61 63 6b 2e 20 20 54 68 65  ** it back.  The
36b70 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20 66   newly created f
36b80 69 6c 65 27 73 20 66 69 6c 65 20 64 65 73 63 72  ile's file descr
36b90 69 70 74 6f 72 20 69 73 20 61 73 73 69 67 6e 65  iptor is assigne
36ba0 64 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 63  d to the.** conc
36bb0 68 20 66 69 6c 65 20 73 74 72 75 63 74 75 72 65  h file structure
36bc0 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 74 68 65   and finally the
36bd0 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 63 68 20   original conch 
36be0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
36bf0 69 73 20 0a 2a 2a 20 63 6c 6f 73 65 64 2e 20 20  is .** closed.  
36c00 52 65 74 75 72 6e 73 20 7a 65 72 6f 20 69 66 20  Returns zero if 
36c10 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 73  successful..*/.s
36c20 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 42  tatic int proxyB
36c30 72 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e  reakConchLock(un
36c40 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75  ixFile *pFile, u
36c50 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 29 7b  uid_t myHostID){
36c60 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  .  proxyLockingC
36c70 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28  ontext *pCtx = (
36c80 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
36c90 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  ext *)pFile->loc
36ca0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20  kingContext; .  
36cb0 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46  unixFile *conchF
36cc0 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63  ile = pCtx->conc
36cd0 68 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 74 50  hFile;.  char tP
36ce0 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b  ath[MAXPATHLEN];
36cf0 0a 20 20 63 68 61 72 20 62 75 66 5b 50 52 4f 58  .  char buf[PROX
36d00 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a  Y_MAXCONCHLEN];.
36d10 20 20 63 68 61 72 20 2a 63 50 61 74 68 20 3d 20    char *cPath = 
36d20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50  pCtx->conchFileP
36d30 61 74 68 3b 0a 20 20 73 69 7a 65 5f 74 20 72 65  ath;.  size_t re
36d40 61 64 4c 65 6e 20 3d 20 30 3b 0a 20 20 73 69 7a  adLen = 0;.  siz
36d50 65 5f 74 20 70 61 74 68 4c 65 6e 20 3d 20 30 3b  e_t pathLen = 0;
36d60 0a 20 20 63 68 61 72 20 65 72 72 6d 73 67 5b 36  .  char errmsg[6
36d70 34 5d 20 3d 20 22 22 3b 0a 20 20 69 6e 74 20 66  4] = "";.  int f
36d80 64 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 72 63  d = -1;.  int rc
36d90 20 3d 20 2d 31 3b 0a 20 20 55 4e 55 53 45 44 5f   = -1;.  UNUSED_
36da0 50 41 52 41 4d 45 54 45 52 28 6d 79 48 6f 73 74  PARAMETER(myHost
36db0 49 44 29 3b 0a 0a 20 20 2f 2a 20 63 72 65 61 74  ID);..  /* creat
36dc0 65 20 61 20 6e 65 77 20 70 61 74 68 20 62 79 20  e a new path by 
36dd0 72 65 70 6c 61 63 65 20 74 68 65 20 74 72 61 69  replace the trai
36de0 6c 69 6e 67 20 27 2d 63 6f 6e 63 68 27 20 77 69  ling '-conch' wi
36df0 74 68 20 27 2d 62 72 65 61 6b 27 20 2a 2f 0a 20  th '-break' */. 
36e00 20 70 61 74 68 4c 65 6e 20 3d 20 73 74 72 6c 63   pathLen = strlc
36e10 70 79 28 74 50 61 74 68 2c 20 63 50 61 74 68 2c  py(tPath, cPath,
36e20 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20   MAXPATHLEN);.  
36e30 69 66 28 20 70 61 74 68 4c 65 6e 3e 4d 41 58 50  if( pathLen>MAXP
36e40 41 54 48 4c 45 4e 20 7c 7c 20 70 61 74 68 4c 65  ATHLEN || pathLe
36e50 6e 3c 36 20 7c 7c 20 0a 20 20 20 20 20 28 73 74  n<6 || .     (st
36e60 72 6c 63 70 79 28 26 74 50 61 74 68 5b 70 61 74  rlcpy(&tPath[pat
36e70 68 4c 65 6e 2d 35 5d 2c 20 22 62 72 65 61 6b 22  hLen-5], "break"
36e80 2c 20 36 29 20 21 3d 20 35 29 20 29 7b 0a 20 20  , 6) != 5) ){.  
36e90 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
36ea0 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67  tf(sizeof(errmsg
36eb0 29 2c 65 72 72 6d 73 67 2c 22 70 61 74 68 20 65  ),errmsg,"path e
36ec0 72 72 6f 72 20 28 6c 65 6e 20 25 64 29 22 2c 28  rror (len %d)",(
36ed0 69 6e 74 29 70 61 74 68 4c 65 6e 29 3b 0a 20 20  int)pathLen);.  
36ee0 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b    goto end_break
36ef0 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20 72  lock;.  }.  /* r
36f00 65 61 64 20 74 68 65 20 63 6f 6e 63 68 20 63 6f  ead the conch co
36f10 6e 74 65 6e 74 20 2a 2f 0a 20 20 72 65 61 64 4c  ntent */.  readL
36f20 65 6e 20 3d 20 6f 73 50 72 65 61 64 28 63 6f 6e  en = osPread(con
36f30 63 68 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2c 20  chFile->h, buf, 
36f40 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45  PROXY_MAXCONCHLE
36f50 4e 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 65 61  N, 0);.  if( rea
36f60 64 4c 65 6e 3c 50 52 4f 58 59 5f 50 41 54 48 49  dLen<PROXY_PATHI
36f70 4e 44 45 58 20 29 7b 0a 20 20 20 20 73 71 6c 69  NDEX ){.    sqli
36f80 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
36f90 65 6f 66 28 65 72 72 6d 73 67 29 2c 65 72 72 6d  eof(errmsg),errm
36fa0 73 67 2c 22 72 65 61 64 20 65 72 72 6f 72 20 28  sg,"read error (
36fb0 6c 65 6e 20 25 64 29 22 2c 28 69 6e 74 29 72 65  len %d)",(int)re
36fc0 61 64 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f  adLen);.    goto
36fd0 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a   end_breaklock;.
36fe0 20 20 7d 0a 20 20 2f 2a 20 77 72 69 74 65 20 69    }.  /* write i
36ff0 74 20 6f 75 74 20 74 6f 20 74 68 65 20 74 65 6d  t out to the tem
37000 70 6f 72 61 72 79 20 62 72 65 61 6b 20 66 69 6c  porary break fil
37010 65 20 2a 2f 0a 20 20 66 64 20 3d 20 72 6f 62 75  e */.  fd = robu
37020 73 74 5f 6f 70 65 6e 28 74 50 61 74 68 2c 20 28  st_open(tPath, (
37030 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 7c 4f  O_RDWR|O_CREAT|O
37040 5f 45 58 43 4c 29 2c 20 30 29 3b 0a 20 20 69 66  _EXCL), 0);.  if
37050 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 73 71  ( fd<0 ){.    sq
37060 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
37070 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 20 65  izeof(errmsg), e
37080 72 72 6d 73 67 2c 20 22 63 72 65 61 74 65 20 66  rrmsg, "create f
37090 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72  ailed (%d)", err
370a0 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  no);.    goto en
370b0 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d  d_breaklock;.  }
370c0 0a 20 20 69 66 28 20 6f 73 50 77 72 69 74 65 28  .  if( osPwrite(
370d0 66 64 2c 20 62 75 66 2c 20 72 65 61 64 4c 65 6e  fd, buf, readLen
370e0 2c 20 30 29 20 21 3d 20 28 73 73 69 7a 65 5f 74  , 0) != (ssize_t
370f0 29 72 65 61 64 4c 65 6e 20 29 7b 0a 20 20 20 20  )readLen ){.    
37100 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
37110 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c  (sizeof(errmsg),
37120 20 65 72 72 6d 73 67 2c 20 22 77 72 69 74 65 20   errmsg, "write 
37130 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72  failed (%d)", er
37140 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  rno);.    goto e
37150 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20  nd_breaklock;.  
37160 7d 0a 20 20 69 66 28 20 72 65 6e 61 6d 65 28 74  }.  if( rename(t
37170 50 61 74 68 2c 20 63 50 61 74 68 29 20 29 7b 0a  Path, cPath) ){.
37180 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
37190 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d  intf(sizeof(errm
371a0 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22 72 65  sg), errmsg, "re
371b0 6e 61 6d 65 20 66 61 69 6c 65 64 20 28 25 64 29  name failed (%d)
371c0 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67  ", errno);.    g
371d0 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63  oto end_breakloc
371e0 6b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b  k;.  }.  rc = 0;
371f0 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72  .  fprintf(stder
37200 72 2c 20 22 62 72 6f 6b 65 20 73 74 61 6c 65 20  r, "broke stale 
37210 6c 6f 63 6b 20 6f 6e 20 25 73 5c 6e 22 2c 20 63  lock on %s\n", c
37220 50 61 74 68 29 3b 0a 20 20 72 6f 62 75 73 74 5f  Path);.  robust_
37230 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 63 6f 6e  close(pFile, con
37240 63 68 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e  chFile->h, __LIN
37250 45 5f 5f 29 3b 0a 20 20 63 6f 6e 63 68 46 69 6c  E__);.  conchFil
37260 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20 63 6f 6e  e->h = fd;.  con
37270 63 68 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67  chFile->openFlag
37280 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43  s = O_RDWR | O_C
37290 52 45 41 54 3b 0a 0a 65 6e 64 5f 62 72 65 61 6b  REAT;..end_break
372a0 6c 6f 63 6b 3a 0a 20 20 69 66 28 20 72 63 20 29  lock:.  if( rc )
372b0 7b 0a 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20  {.    if( fd>=0 
372c0 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e  ){.      osUnlin
372d0 6b 28 74 50 61 74 68 29 3b 0a 20 20 20 20 20 20  k(tPath);.      
372e0 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69  robust_close(pFi
372f0 6c 65 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f  le, fd, __LINE__
37300 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72  );.    }.    fpr
37310 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66 61  intf(stderr, "fa
37320 69 6c 65 64 20 74 6f 20 62 72 65 61 6b 20 73 74  iled to break st
37330 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 2c 20  ale lock on %s, 
37340 25 73 5c 6e 22 2c 20 63 50 61 74 68 2c 20 65 72  %s\n", cPath, er
37350 72 6d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  rmsg);.  }.  ret
37360 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61  urn rc;.}../* Ta
37370 6b 65 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ke the requested
37380 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e   lock on the con
37390 63 68 20 66 69 6c 65 20 61 6e 64 20 62 72 65 61  ch file and brea
373a0 6b 20 61 20 73 74 61 6c 65 20 6c 6f 63 6b 20 69  k a stale lock i
373b0 66 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20 69  f the .** host i
373c0 64 20 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a 73 74  d matches..*/.st
373d0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6f  atic int proxyCo
373e0 6e 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65  nchLock(unixFile
373f0 20 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f 74 20   *pFile, uuid_t 
37400 6d 79 48 6f 73 74 49 44 2c 20 69 6e 74 20 6c 6f  myHostID, int lo
37410 63 6b 54 79 70 65 29 7b 0a 20 20 70 72 6f 78 79  ckType){.  proxy
37420 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
37430 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
37440 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46  kingContext *)pF
37450 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
37460 65 78 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65  ext; .  unixFile
37470 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43   *conchFile = pC
37480 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20  tx->conchFile;. 
37490 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
374a0 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 54 72 69 65  _OK;.  int nTrie
374b0 73 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20  s = 0;.  struct 
374c0 74 69 6d 65 73 70 65 63 20 63 6f 6e 63 68 4d 6f  timespec conchMo
374d0 64 54 69 6d 65 3b 0a 20 20 0a 20 20 6d 65 6d 73  dTime;.  .  mems
374e0 65 74 28 26 63 6f 6e 63 68 4d 6f 64 54 69 6d 65  et(&conchModTime
374f0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63 6f 6e 63  , 0, sizeof(conc
37500 68 4d 6f 64 54 69 6d 65 29 29 3b 0a 20 20 64 6f  hModTime));.  do
37510 20 7b 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e 63   {.    rc = conc
37520 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  hFile->pMethod->
37530 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  xLock((sqlite3_f
37540 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20  ile*)conchFile, 
37550 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20 20 6e  lockType);.    n
37560 54 72 69 65 73 20 2b 2b 3b 0a 20 20 20 20 69 66  Tries ++;.    if
37570 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
37580 59 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  Y ){.      /* If
37590 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 65 64   the lock failed
375a0 20 28 62 75 73 79 29 3a 0a 20 20 20 20 20 20 20   (busy):.       
375b0 2a 20 31 73 74 20 74 72 79 3a 20 67 65 74 20 74  * 1st try: get t
375c0 68 65 20 6d 6f 64 20 74 69 6d 65 20 6f 66 20 74  he mod time of t
375d0 68 65 20 63 6f 6e 63 68 2c 20 77 61 69 74 20 30  he conch, wait 0
375e0 2e 35 73 20 61 6e 64 20 74 72 79 20 61 67 61 69  .5s and try agai
375f0 6e 2e 20 0a 20 20 20 20 20 20 20 2a 20 32 6e 64  n. .       * 2nd
37600 20 74 72 79 3a 20 66 61 69 6c 20 69 66 20 74 68   try: fail if th
37610 65 20 6d 6f 64 20 74 69 6d 65 20 63 68 61 6e 67  e mod time chang
37620 65 64 20 6f 72 20 68 6f 73 74 20 69 64 20 69 73  ed or host id is
37630 20 64 69 66 66 65 72 65 6e 74 2c 20 77 61 69 74   different, wait
37640 20 0a 20 20 20 20 20 20 20 2a 20 20 20 20 20 20   .       *      
37650 20 20 20 20 20 31 30 20 73 65 63 20 61 6e 64 20       10 sec and 
37660 74 72 79 20 61 67 61 69 6e 0a 20 20 20 20 20 20  try again.      
37670 20 2a 20 33 72 64 20 74 72 79 3a 20 62 72 65 61   * 3rd try: brea
37680 6b 20 74 68 65 20 6c 6f 63 6b 20 75 6e 6c 65 73  k the lock unles
37690 73 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 68  s the mod time h
376a0 61 73 20 63 68 61 6e 67 65 64 2e 0a 20 20 20 20  as changed..    
376b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75     */.      stru
376c0 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20  ct stat buf;.   
376d0 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 63     if( osFstat(c
376e0 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 26 62 75  onchFile->h, &bu
376f0 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  f) ){.        st
37700 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
37710 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  le, errno);.    
37720 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
37730 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20  E_IOERR_LOCK;.  
37740 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20      }.      .   
37750 20 20 20 69 66 28 20 6e 54 72 69 65 73 3d 3d 31     if( nTries==1
37760 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 63   ){.        conc
37770 68 4d 6f 64 54 69 6d 65 20 3d 20 62 75 66 2e 73  hModTime = buf.s
37780 74 5f 6d 74 69 6d 65 73 70 65 63 3b 0a 20 20 20  t_mtimespec;.   
37790 20 20 20 20 20 75 73 6c 65 65 70 28 35 30 30 30       usleep(5000
377a0 30 30 29 3b 20 2f 2a 20 77 61 69 74 20 30 2e 35  00); /* wait 0.5
377b0 20 73 65 63 20 61 6e 64 20 74 72 79 20 74 68 65   sec and try the
377c0 20 6c 6f 63 6b 20 61 67 61 69 6e 2a 2f 0a 20 20   lock again*/.  
377d0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
377e0 20 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20   .      }..     
377f0 20 61 73 73 65 72 74 28 20 6e 54 72 69 65 73 3e   assert( nTries>
37800 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63  1 );.      if( c
37810 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76 5f 73  onchModTime.tv_s
37820 65 63 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69  ec != buf.st_mti
37830 6d 65 73 70 65 63 2e 74 76 5f 73 65 63 20 7c 7c  mespec.tv_sec ||
37840 20 0a 20 20 20 20 20 20 20 20 20 63 6f 6e 63 68   .         conch
37850 4d 6f 64 54 69 6d 65 2e 74 76 5f 6e 73 65 63 20  ModTime.tv_nsec 
37860 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73  != buf.st_mtimes
37870 70 65 63 2e 74 76 5f 6e 73 65 63 20 29 7b 0a 20  pec.tv_nsec ){. 
37880 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
37890 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
378a0 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20   }.      .      
378b0 69 66 28 20 6e 54 72 69 65 73 3d 3d 32 20 29 7b  if( nTries==2 ){
378c0 20 20 0a 20 20 20 20 20 20 20 20 63 68 61 72 20    .        char 
378d0 74 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f  tBuf[PROXY_MAXCO
378e0 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20 20  NCHLEN];.       
378f0 20 69 6e 74 20 6c 65 6e 20 3d 20 6f 73 50 72 65   int len = osPre
37900 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  ad(conchFile->h,
37910 20 74 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58   tBuf, PROXY_MAX
37920 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20  CONCHLEN, 0);.  
37930 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3c 30 20        if( len<0 
37940 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f  ){.          sto
37950 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
37960 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20  e, errno);.     
37970 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
37980 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20  TE_IOERR_LOCK;. 
37990 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
379a0 20 69 66 28 20 6c 65 6e 3e 50 52 4f 58 59 5f 50   if( len>PROXY_P
379b0 41 54 48 49 4e 44 45 58 20 26 26 20 74 42 75 66  ATHINDEX && tBuf
379c0 5b 30 5d 3d 3d 28 63 68 61 72 29 50 52 4f 58 59  [0]==(char)PROXY
379d0 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 29 7b 0a  _CONCHVERSION){.
379e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 6f 6e            /* don
379f0 27 74 20 62 72 65 61 6b 20 74 68 65 20 6c 6f 63  't break the loc
37a00 6b 20 69 66 20 74 68 65 20 68 6f 73 74 20 69 64  k if the host id
37a10 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 20 2a   doesn't match *
37a20 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
37a30 30 21 3d 6d 65 6d 63 6d 70 28 26 74 42 75 66 5b  0!=memcmp(&tBuf[
37a40 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d  PROXY_HEADERLEN]
37a50 2c 20 6d 79 48 6f 73 74 49 44 2c 20 50 52 4f 58  , myHostID, PROX
37a60 59 5f 48 4f 53 54 49 44 4c 45 4e 29 20 29 7b 0a  Y_HOSTIDLEN) ){.
37a70 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
37a80 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
37a90 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
37aa0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
37ab0 20 20 20 20 20 2f 2a 20 64 6f 6e 27 74 20 62 72       /* don't br
37ac0 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  eak the lock on 
37ad0 73 68 6f 72 74 20 72 65 61 64 20 6f 72 20 61 20  short read or a 
37ae0 76 65 72 73 69 6f 6e 20 6d 69 73 6d 61 74 63 68  version mismatch
37af0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65   */.          re
37b00 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
37b10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
37b20 20 20 20 20 75 73 6c 65 65 70 28 31 30 30 30 30      usleep(10000
37b30 30 30 30 29 3b 20 2f 2a 20 77 61 69 74 20 31 30  000); /* wait 10
37b40 20 73 65 63 20 61 6e 64 20 74 72 79 20 74 68 65   sec and try the
37b50 20 6c 6f 63 6b 20 61 67 61 69 6e 20 2a 2f 0a 20   lock again */. 
37b60 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
37b70 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20   .      }.      
37b80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
37b90 54 72 69 65 73 3d 3d 33 20 29 3b 0a 20 20 20 20  Tries==3 );.    
37ba0 20 20 69 66 28 20 30 3d 3d 70 72 6f 78 79 42 72    if( 0==proxyBr
37bb0 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69  eakConchLock(pFi
37bc0 6c 65 2c 20 6d 79 48 6f 73 74 49 44 29 20 29 7b  le, myHostID) ){
37bd0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
37be0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
37bf0 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 45   if( lockType==E
37c00 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b  XCLUSIVE_LOCK ){
37c10 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
37c20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68  conchFile->pMeth
37c30 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74  od->xLock((sqlit
37c40 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69  e3_file*)conchFi
37c50 6c 65 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  le, SHARED_LOCK)
37c60 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
37c70 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20      if( !rc ){. 
37c80 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f           rc = co
37c90 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  nchFile->pMethod
37ca0 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33  ->xLock((sqlite3
37cb0 5f 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65  _file*)conchFile
37cc0 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20  , lockType);.   
37cd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
37ce0 20 20 20 7d 0a 20 20 7d 20 77 68 69 6c 65 28 20     }.  } while( 
37cf0 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
37d00 26 26 20 6e 54 72 69 65 73 3c 33 20 29 3b 0a 20  && nTries<3 );. 
37d10 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d   .  return rc;.}
37d20 0a 0a 2f 2a 20 54 61 6b 65 73 20 74 68 65 20 63  ../* Takes the c
37d30 6f 6e 63 68 20 62 79 20 74 61 6b 69 6e 67 20 61  onch by taking a
37d40 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64   shared lock and
37d50 20 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   read the conten
37d60 74 73 20 63 6f 6e 63 68 2c 20 69 66 20 0a 2a 2a  ts conch, if .**
37d70 20 6c 6f 63 6b 50 61 74 68 20 69 73 20 6e 6f 6e   lockPath is non
37d80 2d 4e 55 4c 4c 2c 20 74 68 65 20 68 6f 73 74 20  -NULL, the host 
37d90 49 44 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65  ID and lock file
37da0 20 70 61 74 68 20 6d 75 73 74 20 6d 61 74 63 68   path must match
37db0 2e 20 20 41 20 4e 55 4c 4c 20 0a 2a 2a 20 6c 6f  .  A NULL .** lo
37dc0 63 6b 50 61 74 68 20 6d 65 61 6e 73 20 74 68 61  ckPath means tha
37dd0 74 20 74 68 65 20 6c 6f 63 6b 50 61 74 68 20 69  t the lockPath i
37de0 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  n the conch file
37df0 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 69 66   will be used if
37e00 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20 49 44   the .** host ID
37e10 73 20 6d 61 74 63 68 2c 20 6f 72 20 61 20 6e 65  s match, or a ne
37e20 77 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c 6c  w lock path will
37e30 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 61 75   be generated au
37e40 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20  tomatically .** 
37e50 61 6e 64 20 77 72 69 74 74 65 6e 20 74 6f 20 74  and written to t
37e60 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2e 0a 2a  he conch file..*
37e70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
37e80 78 79 54 61 6b 65 43 6f 6e 63 68 28 75 6e 69 78  xyTakeConch(unix
37e90 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
37ea0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
37eb0 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f  ext *pCtx = (pro
37ec0 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  xyLockingContext
37ed0 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
37ee0 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 0a 20 20  gContext; .  .  
37ef0 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48  if( pCtx->conchH
37f00 65 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  eld!=0 ){.    re
37f10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
37f20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69    }else{.    uni
37f30 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65  xFile *conchFile
37f40 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69   = pCtx->conchFi
37f50 6c 65 3b 0a 20 20 20 20 75 75 69 64 5f 74 20 6d  le;.    uuid_t m
37f60 79 48 6f 73 74 49 44 3b 0a 20 20 20 20 69 6e 74  yHostID;.    int
37f70 20 70 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20   pError = 0;.   
37f80 20 63 68 61 72 20 72 65 61 64 42 75 66 5b 50 52   char readBuf[PR
37f90 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d  OXY_MAXCONCHLEN]
37fa0 3b 0a 20 20 20 20 63 68 61 72 20 6c 6f 63 6b 50  ;.    char lockP
37fb0 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b  ath[MAXPATHLEN];
37fc0 0a 20 20 20 20 63 68 61 72 20 2a 74 65 6d 70 4c  .    char *tempL
37fd0 6f 63 6b 50 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a  ockPath = NULL;.
37fe0 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c      int rc = SQL
37ff0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74 20  ITE_OK;.    int 
38000 63 72 65 61 74 65 43 6f 6e 63 68 20 3d 20 30 3b  createConch = 0;
38010 0a 20 20 20 20 69 6e 74 20 68 6f 73 74 49 64 4d  .    int hostIdM
38020 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e  atch = 0;.    in
38030 74 20 72 65 61 64 4c 65 6e 20 3d 20 30 3b 0a 20  t readLen = 0;. 
38040 20 20 20 69 6e 74 20 74 72 79 4f 6c 64 4c 6f 63     int tryOldLoc
38050 6b 50 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 69  kPath = 0;.    i
38060 6e 74 20 66 6f 72 63 65 4e 65 77 4c 6f 63 6b 50  nt forceNewLockP
38070 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 0a 20 20  ath = 0;.    .  
38080 20 20 4f 53 54 52 41 43 45 28 28 22 54 41 4b 45    OSTRACE(("TAKE
38090 43 4f 4e 43 48 20 20 25 64 20 66 6f 72 20 25 73  CONCH  %d for %s
380a0 20 70 69 64 3d 25 64 5c 6e 22 2c 20 63 6f 6e 63   pid=%d\n", conc
380b0 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  hFile->h,.      
380c0 20 20 20 20 20 20 20 28 70 43 74 78 2d 3e 6c 6f         (pCtx->lo
380d0 63 6b 50 72 6f 78 79 50 61 74 68 20 3f 20 70 43  ckProxyPath ? pC
380e0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
380f0 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 0a 20  h : ":auto:"),. 
38100 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
38110 74 70 69 64 28 30 29 29 29 3b 0a 0a 20 20 20 20  tpid(0)));..    
38120 72 63 20 3d 20 70 72 6f 78 79 47 65 74 48 6f 73  rc = proxyGetHos
38130 74 49 44 28 6d 79 48 6f 73 74 49 44 2c 20 26 70  tID(myHostID, &p
38140 45 72 72 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  Error);.    if( 
38150 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  (rc&0xff)==SQLIT
38160 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 20  E_IOERR ){.     
38170 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
38180 70 46 69 6c 65 2c 20 70 45 72 72 6f 72 29 3b 0a  pFile, pError);.
38190 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74        goto end_t
381a0 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a  akeconch;.    }.
381b0 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43 6f      rc = proxyCo
381c0 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d  nchLock(pFile, m
381d0 79 48 6f 73 74 49 44 2c 20 53 48 41 52 45 44 5f  yHostID, SHARED_
381e0 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72  LOCK);.    if( r
381f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
38200 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74        goto end_t
38210 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 0a  akeconch;.    }.
38220 20 20 20 20 2f 2a 20 72 65 61 64 20 74 68 65 20      /* read the 
38230 65 78 69 73 74 69 6e 67 20 63 6f 6e 63 68 20 66  existing conch f
38240 69 6c 65 20 2a 2f 0a 20 20 20 20 72 65 61 64 4c  ile */.    readL
38250 65 6e 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64  en = seekAndRead
38260 28 28 75 6e 69 78 46 69 6c 65 2a 29 63 6f 6e 63  ((unixFile*)conc
38270 68 46 69 6c 65 2c 20 30 2c 20 72 65 61 64 42 75  hFile, 0, readBu
38280 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43  f, PROXY_MAXCONC
38290 48 4c 45 4e 29 3b 0a 20 20 20 20 69 66 28 20 72  HLEN);.    if( r
382a0 65 61 64 4c 65 6e 3c 30 20 29 7b 0a 20 20 20 20  eadLen<0 ){.    
382b0 20 20 2f 2a 20 49 2f 4f 20 65 72 72 6f 72 3a 20    /* I/O error: 
382c0 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79  lastErrno set by
382d0 20 73 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a   seekAndRead */.
382e0 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
382f0 72 72 6e 6f 28 70 46 69 6c 65 2c 20 63 6f 6e 63  rrno(pFile, conc
38300 68 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  hFile->lastErrno
38310 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
38320 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b  LITE_IOERR_READ;
38330 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
38340 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d  takeconch;.    }
38350 65 6c 73 65 20 69 66 28 20 72 65 61 64 4c 65 6e  else if( readLen
38360 3c 3d 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c  <=(PROXY_HEADERL
38370 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c  EN+PROXY_HOSTIDL
38380 45 4e 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  EN) || .        
38390 20 20 20 20 20 72 65 61 64 42 75 66 5b 30 5d 21       readBuf[0]!
383a0 3d 28 63 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e  =(char)PROXY_CON
383b0 43 48 56 45 52 53 49 4f 4e 20 29 7b 0a 20 20 20  CHVERSION ){.   
383c0 20 20 20 2f 2a 20 61 20 73 68 6f 72 74 20 72 65     /* a short re
383d0 61 64 20 6f 72 20 76 65 72 73 69 6f 6e 20 66 6f  ad or version fo
383e0 72 6d 61 74 20 6d 69 73 6d 61 74 63 68 20 6d 65  rmat mismatch me
383f0 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63  ans we need to c
38400 72 65 61 74 65 20 61 20 6e 65 77 20 0a 20 20 20  reate a new .   
38410 20 20 20 2a 2a 20 63 6f 6e 63 68 20 66 69 6c 65     ** conch file
38420 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  . .      */.    
38430 20 20 63 72 65 61 74 65 43 6f 6e 63 68 20 3d 20    createConch = 
38440 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  1;.    }.    /* 
38450 69 66 20 74 68 65 20 68 6f 73 74 20 69 64 20 6d  if the host id m
38460 61 74 63 68 65 73 20 61 6e 64 20 74 68 65 20 6c  atches and the l
38470 6f 63 6b 20 70 61 74 68 20 61 6c 72 65 61 64 79  ock path already
38480 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 63   exists in the c
38490 6f 6e 63 68 0a 20 20 20 20 2a 2a 20 77 65 27 6c  onch.    ** we'l
384a0 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 65  l try to use the
384b0 20 70 61 74 68 20 74 68 65 72 65 2c 20 69 66 20   path there, if 
384c0 77 65 20 63 61 6e 27 74 20 6f 70 65 6e 20 74 68  we can't open th
384d0 61 74 20 70 61 74 68 2c 20 77 65 27 6c 6c 20 0a  at path, we'll .
384e0 20 20 20 20 2a 2a 20 72 65 74 72 79 20 77 69 74      ** retry wit
384f0 68 20 61 20 6e 65 77 20 61 75 74 6f 2d 67 65 6e  h a new auto-gen
38500 65 72 61 74 65 64 20 70 61 74 68 20 0a 20 20 20  erated path .   
38510 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 20 2f 2a 20   */.    do { /* 
38520 69 6e 20 63 61 73 65 20 77 65 20 6e 65 65 64 20  in case we need 
38530 74 6f 20 74 72 79 20 61 67 61 69 6e 20 66 6f 72  to try again for
38540 20 61 6e 20 3a 61 75 74 6f 3a 20 6e 61 6d 65 64   an :auto: named
38550 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 0a 20   lock file */.. 
38560 20 20 20 20 20 69 66 28 20 21 63 72 65 61 74 65       if( !create
38570 43 6f 6e 63 68 20 26 26 20 21 66 6f 72 63 65 4e  Conch && !forceN
38580 65 77 4c 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20  ewLockPath ){.  
38590 20 20 20 20 20 20 68 6f 73 74 49 64 4d 61 74 63        hostIdMatc
385a0 68 20 3d 20 21 6d 65 6d 63 6d 70 28 26 72 65 61  h = !memcmp(&rea
385b0 64 42 75 66 5b 50 52 4f 58 59 5f 48 45 41 44 45  dBuf[PROXY_HEADE
385c0 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c  RLEN], myHostID,
385d0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
385e0 20 20